跳转到内容

Airflow加密配置

来自代码酷

Airflow加密配置[编辑 | 编辑源代码]

Airflow加密配置是Apache Airflow中保护敏感数据的关键机制,通过加密技术确保数据库连接密码、API密钥等机密信息的安全存储与传输。本指南将详细介绍Airflow支持的加密方案、配置方法及实际应用场景。

概述[编辑 | 编辑源代码]

Airflow提供两种主要加密方式:

  1. Fernet密钥加密:对称加密方案,用于加密数据库连接、变量等敏感字段。
  2. 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会自动将密码加密存储到元数据库:

flowchart LR A[明文密码] -->|Fernet加密| B[加密字符串] B -->|存储到| C[(元数据库)]

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:

K=PBKDF2(password,salt,iterations=100000,length=32)

加密过程: C=AES256CBC(K,IV,P)

常见问题[编辑 | 编辑源代码]

Q:忘记Fernet密钥怎么办? A:无法恢复已加密数据,必须: 1. 重置所有加密凭证 2. 重新配置新密钥 3. 更新所有连接信息

Q:如何验证加密是否生效? 检查元数据库中的`connection`表:

SELECT * FROM connection WHERE conn_id = 'your_connection';

密码字段应为加密字符串(非明文)。

最佳实践[编辑 | 编辑源代码]

  • 将密钥存储在环境变量或密钥管理服务(如AWS KMS)
  • 禁止在版本控制中提交`airflow.cfg`含密钥的文件
  • 定期监控密钥使用情况
  • 为不同环境(开发/生产)使用独立密钥

通过合理配置Airflow加密,可显著提升工作流系统的整体安全性,满足企业级安全需求。