屏蔽敏感数据¶
默认情况下,当 Connection 密码、敏感 Variables 和 Connection 的额外 (JSON) 字段中的密钥出现在任务日志、Variables 视图以及 UI 中的渲染字段视图中时,Airflow 会对其进行屏蔽。
它通过查找在您的输出中出现的特定 值 来实现这一点。这意味着如果您有一个密码为 a
的连接,那么日志中每个字母 a 的实例都将被替换为 ***
。
要禁用屏蔽,您可以将 hide_sensitive_var_conn_fields 设置为 false。
自动屏蔽由 Connection 或 Variable 访问触发。这意味着如果您通过 XCom 或任何其他旁路通道传递敏感值,当其在下游任务中打印时将不会被屏蔽。
敏感字段名称¶
启用屏蔽后,Airflow 将始终屏蔽任务访问的每个 Connection 的密码字段。
如果 Variable 的值、渲染模板字典、XCom 字典或 Connection 的额外 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 文件或 operator 的 execute
函数中使用 mask_secret
函数来实现。例如
@task
def my_func():
from airflow.sdk.execution_time.secrets_masker import mask_secret
mask_secret("custom_value")
...
或
class MyOperator(BaseOperator):
def execute(self, context):
from airflow.sdk.execution_time.secrets_masker import mask_secret
mask_secret("custom_value")
...
屏蔽必须在产生任何日志/输出之前设置才能生效。
使用环境变量时不进行屏蔽¶
当您使用某些 operator 时,例如 airflow.providers.cncf.kubernetes.operators.pod.KubernetesPodOperator
,您可能会试图通过环境变量传递密钥。这是一个非常糟糕的做法,因为环境变量对任何有权限查看进程环境的人都是可见的 - 通过环境变量传递的此类密钥将不会被 Airflow 屏蔽。
如果您需要向 KubernetesPodOperator 传递密钥,您应该使用原生的 Kubernetes secrets 或使用 Airflow Connection 或 Variables 动态检索密钥。