跳转到内容

Airflow Variables加密

来自代码酷

Airflow Variables加密[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

Airflow Variables加密是Apache Airflow中保护敏感配置数据的重要机制,通过加密技术确保数据库存储的变量内容(如API密钥、数据库密码等)不被明文暴露。该功能基于Fernet对称加密实现,要求用户配置加密密钥后自动生效。

工作原理[编辑 | 编辑源代码]

Airflow使用以下流程处理变量加密:

graph LR A[用户设置Variable] --> B{加密密钥已配置?} B -->|是| C[加密后存入数据库] B -->|否| D[明文存入数据库] C --> E[使用时自动解密] D --> F[直接读取明文]

数学表达式表示加密过程: 密文=Fernet(密钥).encrypt(明文.encode())

配置方法[编辑 | 编辑源代码]

生成加密密钥[编辑 | 编辑源代码]

使用以下命令生成Fernet密钥(需Python环境):

from cryptography.fernet import Fernet
fernet_key = Fernet.generate_key()
print(fernet_key.decode())  # 输出示例:'hTj2vJ3nP5sR8uVxYzA0bC1dE4fG7iK9l'

修改Airflow配置[编辑 | 编辑源代码]

在`airflow.cfg`中设置:

[core]
fernet_key = hTj2vJ3nP5sR8uVxYzA0bC1dE4fG7iK9l

或通过环境变量:

export AIRFLOW__CORE__FERNET_KEY="hTj2vJ3nP5sR8uVxYzA0bC1dE4fG7iK9l"

使用示例[编辑 | 编辑源代码]

加密存储变量[编辑 | 编辑源代码]

from airflow.models import Variable
Variable.set("my_secret", "s3cr3t_p@ssw0rd")  # 自动加密

解密读取变量[编辑 | 编辑源代码]

secret = Variable.get("my_secret")  # 自动解密
print(secret)  # 输出: 's3cr3t_p@ssw0rd'

高级用法[编辑 | 编辑源代码]

密钥轮换[编辑 | 编辑源代码]

支持多密钥配置(按优先级尝试解密):

[core]
fernet_key = 
    current_key:hTj2vJ3nP5sR8uVxYzA0bC1dE4fG7iK9l,
    old_key:qWeRtYuIoPaSdFgHjKlZxCvBnM1kL9p8

加密验证[编辑 | 编辑源代码]

检查变量是否已加密:

from airflow.settings import Session
from airflow.models import Variable

var = Session.query(Variable).filter_by(key="my_secret").first()
print(var.is_encrypted())  # 返回True/False

实际案例[编辑 | 编辑源代码]

场景:保护数据库连接[编辑 | 编辑源代码]

1. 加密存储生产环境数据库密码:

Variable.set("prod_db_pass", "DB@1234!")  # 加密存储

2. 在DAG中使用:

from airflow import DAG
from airflow.providers.postgres.operators.postgres import PostgresOperator

with DAG('secure_etl', schedule_interval=None) as dag:
    PostgresOperator(
        task_id='load_data',
        postgres_conn_id='prod_connection',
        sql='SELECT * FROM users',
        password=Variable.get("prod_db_pass")  # 自动解密
    )

注意事项[编辑 | 编辑源代码]

  • 密钥保管:丢失加密密钥将导致已加密变量永久不可读
  • 性能影响:加解密操作会增加约10-15%的I/O开销
  • 版本兼容:Airflow 2.0+ 默认启用变量加密
  • 审计日志:建议记录密钥使用情况:

pie title 加密操作审计 "Variable读取" : 65 "Variable写入" : 25 "密钥轮换" : 10

故障排查[编辑 | 编辑源代码]

错误现象 可能原因 解决方案
DecryptionError 密钥不匹配 检查`AIRFLOW__CORE__FERNET_KEY`配置
Value is not encrypted 未配置密钥 生成新密钥并重新设置变量
Malformed token 数据损坏 从备份恢复或重新设置变量

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

  1. 使用密钥管理系统(如AWS KMS)存储主密钥
  2. 定期轮换密钥(建议每90天)
  3. 对敏感变量添加`_secret`后缀便于识别
  4. 开发/生产环境使用不同密钥