Airflow加密配置
外观
Airflow加密配置[编辑 | 编辑源代码]
Airflow加密配置是Apache Airflow中保护敏感数据的关键机制,通过加密技术确保数据库连接密码、API密钥等机密信息的安全存储与传输。本指南将详细介绍Airflow支持的加密方案、配置方法及实际应用场景。
概述[编辑 | 编辑源代码]
Airflow提供两种主要加密方式:
- Fernet密钥加密:对称加密方案,用于加密数据库连接、变量等敏感字段。
- TLS/SSL传输加密:保护组件间通信(如Web服务器与数据库)。
加密配置的核心目标是:
- 防止敏感数据以明文形式存储
- 满足合规性要求(如GDPR、HIPAA)
- 降低凭证泄露风险
Fernet密钥配置[编辑 | 编辑源代码]
生成Fernet密钥[编辑 | 编辑源代码]
Fernet密钥是32字节的base64编码字符串,可通过以下Python代码生成:
from cryptography.fernet import Fernet
fernet_key = Fernet.generate_key()
print(fernet_key.decode()) # 输出类似:'sT3Xb5jZ8...Q2oP0w='
配置Airflow使用密钥[编辑 | 编辑源代码]
在`airflow.cfg`中设置:
[core]
fernet_key = your_generated_fernet_key_here
或通过环境变量:
export AIRFLOW__CORE__FERNET_KEY="your_key"
加密数据示例[编辑 | 编辑源代码]
加密数据库连接密码(CLI操作):
airflow connections add --conn-uri 'postgres://user:password@host:5432/dbname'
Airflow会自动将密码加密存储到元数据库:
TLS/SSL配置[编辑 | 编辑源代码]
Web服务器HTTPS[编辑 | 编辑源代码]
在`airflow.cfg`中配置:
[webserver]
web_server_ssl_cert = /path/to/cert.pem
web_server_ssl_key = /path/to/key.pem
数据库SSL[编辑 | 编辑源代码]
连接字符串示例:
[core]
sql_alchemy_conn = postgresql+psycopg2://user:pass@host:5432/db?sslmode=require
进阶配置[编辑 | 编辑源代码]
密钥轮换[编辑 | 编辑源代码]
当需要更换Fernet密钥时: 1. 将新旧密钥以逗号分隔配置:
[core]
fernet_key = new_key,old_key
2. Airflow会自动用新密钥加密新数据,同时能解密旧数据
自定义加密后端[编辑 | 编辑源代码]
通过继承`airflow.models.crypto.BaseFernet`实现:
from airflow.models.crypto import BaseFernet
class CustomCrypto(BaseFernet):
@classmethod
def encrypt(cls, content: bytes) -> bytes:
# 自定义加密逻辑
return processed_content
@classmethod
def decrypt(cls, content: bytes) -> bytes:
# 自定义解密逻辑
return original_content
实际案例[编辑 | 编辑源代码]
场景:医疗数据处理管道
- 需求:保护患者数据访问凭证
- 解决方案:
- 使用Fernet加密数据库连接字符串 - 为Worker到数据库的通信启用SSL - 每90天轮换一次密钥
配置片段:
[core]
fernet_key = MDEyMzQ1Njc4OUFCQ0RFRjAxMjM0NTY3ODlBQkNERUY=
sql_alchemy_conn = mysql+mysqldb://user:encrypted_password@dbserver:3306/medical?ssl_ca=/path/to/ca.pem
数学原理[编辑 | 编辑源代码]
Fernet基于AES-CBC模式,密钥派生使用PBKDF2:
加密过程:
常见问题[编辑 | 编辑源代码]
Q:忘记Fernet密钥怎么办? A:无法恢复已加密数据,必须: 1. 重置所有加密凭证 2. 重新配置新密钥 3. 更新所有连接信息
Q:如何验证加密是否生效? 检查元数据库中的`connection`表:
SELECT * FROM connection WHERE conn_id = 'your_connection';
密码字段应为加密字符串(非明文)。
最佳实践[编辑 | 编辑源代码]
- 将密钥存储在环境变量或密钥管理服务(如AWS KMS)
- 禁止在版本控制中提交`airflow.cfg`含密钥的文件
- 定期监控密钥使用情况
- 为不同环境(开发/生产)使用独立密钥
通过合理配置Airflow加密,可显著提升工作流系统的整体安全性,满足企业级安全需求。