屏蔽敏感数据

Airflow 默认会在任务日志、变量 UI 以及 UI 中的渲染字段视图中,对连接密码、敏感变量以及连接的额外(JSON)字段中名称包含一个或多个敏感关键字的键进行掩码。未包含这些敏感关键字的额外 JSON 键则不会被自动隐藏。

它通过在你的输出中搜索特定的来实现。这意味着如果你的连接密码是 a,则日志中出现的所有字母 a 都会被替换为 ***

要禁用掩码,可将 hide_sensitive_var_conn_fields 设置为 false。

自动掩码由连接或变量的访问触发。这意味着如果通过 XCom 或其他侧通道传递敏感值,在下游任务打印时将不会被掩码。

敏感字段名称

启用掩码后,Airflow 将始终掩码任务访问的每个连接的 password 字段。

如果变量名或字段名包含任何已知的敏感关键字,它还会掩码 Airflow 变量的值、渲染的模板字典、XCom 字典或连接额外 JSON blob 中的字段。

默认敏感关键字

access_token, api_key, apikey, authorization, passphrase, passwd, password, private_key, secret, token, keyfile_dict, service_account.

此列表还可以通过环境变量 AIRFLOW__CORE__SENSITIVE_VAR_CONN_NAMES 来扩展。

[core]
sensitive_var_conn_names = comma,separated,sensitive,names

掩码行为示例

来源

键 / 变量名

匹配关键字

掩码范围

连接额外字段

google_keyfile_dict

keyfile_dict

全部位置(日志、渲染模板、UI)

连接额外字段

hello

未掩码

Variable

service_account

service_account

全部位置(日志、渲染模板、UI)

Variable

test_keyfile_dict

keyfile_dict

仅限变量 UI

添加自定义掩码

如果你想掩码上述方法未覆盖的额外秘密,可以在 DAG 文件或算子的 execute 函数中使用 mask_secret 函数。例如

@task
def my_func():
    from airflow.sdk.log import mask_secret

    mask_secret("custom_value")

    ...

class MyOperator(BaseOperator):
    def execute(self, context):
        from airflow.sdk.log import mask_secret

        mask_secret("custom_value")

        ...

掩码必须在产生任何日志/输出之前设置,才能生效。

使用环境变量时不进行掩码

在使用某些算子时——例如 airflow.providers.cncf.kubernetes.operators.pod.KubernetesPodOperator——你可能会倾向于通过环境变量传递秘密。这是一种非常不好的做法,因为环境变量对任何能够查看进程环境的人都可见——通过环境变量传递的此类秘密将不会被 Airflow 掩码。

如果需要向 KubernetesPodOperator 传递秘密,应该使用原生的 Kubernetes secret,或使用 Airflow Connection 或 Variables 动态获取秘密。

此条目是否有帮助?