屏蔽敏感数据
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 动态获取秘密。