Airflow Connections加密
外观
Airflow Connections加密[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
Airflow Connections加密是Apache Airflow中保护敏感连接信息(如数据库密码、API密钥等)的核心机制。通过加密,用户可以将连接凭据安全存储在元数据库(如PostgreSQL、MySQL)中,避免明文暴露。本指南将详细介绍加密原理、配置方法、实际应用及最佳实践。
加密原理[编辑 | 编辑源代码]
Airflow使用Fernet对称加密算法(基于AES-128-CBC)对连接信息进行加密。加密过程依赖一个密钥(Fernet Key),该密钥必须由用户生成并配置在`airflow.cfg`中。加密流程如下:
数学表达式:
配置步骤[编辑 | 编辑源代码]
1. 生成Fernet密钥[编辑 | 编辑源代码]
使用Python生成密钥(需安装`cryptography`库):
from cryptography.fernet import Fernet
fernet_key = Fernet.generate_key()
print(fernet_key) # 输出:b'your-64-char-key'
2. 配置Airflow[编辑 | 编辑源代码]
将密钥写入`airflow.cfg`:
[core]
fernet_key = your-64-char-key
3. 验证加密[编辑 | 编辑源代码]
创建加密连接并验证:
from airflow.models import Connection
from airflow.utils.db import provide_session
@provide_session
def create_encrypted_connection(session=None):
conn = Connection(
conn_id="encrypted_db",
conn_type="postgres",
host="localhost",
login="user",
password="secret",
port=5432
)
session.add(conn)
session.commit()
create_encrypted_connection()
检查元数据库中的`connection`表,`password`字段应为密文。
实际案例[编辑 | 编辑源代码]
场景:保护生产数据库凭据[编辑 | 编辑源代码]
某公司使用Airflow调度ETL任务,需连接生产PostgreSQL数据库。通过加密连接: 1. 开发者在UI/CLI中添加连接时,密码自动加密存储。 2. 即使元数据库被泄露,攻击者无法直接获取密码。
代码示例:从加密连接获取信息[编辑 | 编辑源代码]
from airflow.hooks.base import BaseHook
def use_encrypted_connection():
conn = BaseHook.get_connection("encrypted_db")
print(f"Host: {conn.host}, Decrypted Password: {conn.password}") # 自动解密
高级配置[编辑 | 编辑源代码]
密钥轮换[编辑 | 编辑源代码]
若密钥泄露,需轮换密钥并重新加密所有连接: 1. 将新旧密钥以逗号分隔写入`fernet_key`:
fernet_key = new-key,old-key
2. Airflow会尝试用新密钥加密,用旧密钥解密历史数据。
自定义加密后端[编辑 | 编辑源代码]
通过继承`airflow.models.crypto.BaseFernet`实现自定义逻辑(需Python高级知识)。
常见问题[编辑 | 编辑源代码]
- Q: 加密是否影响性能?
A: 轻微影响(毫秒级延迟),因加密仅在读写连接时触发。
- Q: 如何备份密钥?
A: 将`fernet_key`存储在安全的密码管理器中,禁止版本控制提交。
总结[编辑 | 编辑源代码]
Airflow Connections加密是数据安全的关键实践,通过Fernet算法和合理配置,可有效保护敏感信息。初学者应优先掌握密钥生成与基础配置,高级用户可探索密钥轮换和自定义后端。