跳转到内容

Airflow Connections加密

来自代码酷

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

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

Airflow Connections加密是Apache Airflow中保护敏感连接信息(如数据库密码、API密钥等)的核心机制。通过加密,用户可以将连接凭据安全存储在元数据库(如PostgreSQL、MySQL)中,避免明文暴露。本指南将详细介绍加密原理、配置方法、实际应用及最佳实践。

加密原理[编辑 | 编辑源代码]

Airflow使用Fernet对称加密算法(基于AES-128-CBC)对连接信息进行加密。加密过程依赖一个密钥(Fernet Key),该密钥必须由用户生成并配置在`airflow.cfg`中。加密流程如下:

原始连接信息
Fernet Key加密
加密后的密文
存储到元数据库

数学表达式: 密文=Fernet(密钥,明文)

配置步骤[编辑 | 编辑源代码]

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算法和合理配置,可有效保护敏感信息。初学者应优先掌握密钥生成与基础配置,高级用户可探索密钥轮换和自定义后端。