屏蔽敏感数据¶
默认情况下,当连接密码和敏感变量以及连接额外(JSON)字段中的密钥出现在任务日志、变量和 UI 的渲染字段视图中时,Airflow 将对其进行屏蔽。
它通过查找出现在输出中任何位置的特定值来实现这一点。这意味着,如果你的连接密码为 a
,那么日志中出现的每个字母 a 都将被替换为 ***
。
要禁用屏蔽,可以将 hide_sensitive_var_conn_fields 设置为 false。
自动屏蔽由连接或变量访问触发。这意味着,如果你通过 XCom 或任何其他侧通道传递敏感值,则在下游任务中打印时它不会被屏蔽。
敏感字段名称¶
启用屏蔽后,Airflow 将始终屏蔽任务访问的每个连接的密码字段。
如果变量、渲染模板字典、XCom 字典或连接的额外 JSON blob 的字段名称包含 ('access_token', 'api_key', 'apikey', 'authorization', 'passphrase', 'passwd', 'password', 'private_key', 'secret', 'token') 中的任何单词,它还会屏蔽其值。此列表也可以扩展
[core]
sensitive_var_conn_names = comma,separated,sensitive,names
添加您自己的掩码¶
如果你想屏蔽其他未通过上述方法屏蔽的密钥,你可以在 DAG 文件或操作符的 execute
函数中使用 mask_secret
函数进行屏蔽。例如
@task
def my_func():
from airflow.utils.log.secrets_masker import mask_secret
mask_secret("custom_value")
...
或
class MyOperator(BaseOperator):
def execute(self, context):
from airflow.utils.log.secrets_masker import mask_secret
mask_secret("custom_value")
...
必须在生成任何日志/输出之前设置掩码才能生效。
使用环境变量时不进行屏蔽¶
当你使用某些操作符(例如 airflow.providers.cncf.kubernetes.operators.pod.KubernetesPodOperator
)时,你可能会试图通过环境变量传递密钥。这是一种非常糟糕的做法,因为环境变量对于任何有权查看进程环境的人都是可见的——通过环境变量传递的此类密钥将不会被 Airflow 屏蔽。
如果你需要将密钥传递给 KubernetesPodOperator,你应该使用原生的 Kubernetes 密钥,或者使用 Airflow 连接或变量来动态检索密钥。