Airflow fernet 密钥不会屏蔽凭据

Airflow fernet key does not mask credentials

我将 Apache Airflow 2.2.3 与 Python 3.9 和 运行 docker 容器中的所有内容一起使用。 当我将连接添加到气流时,我通过 GUI 进行操作,因为这样密码应该被加密。为了加密工作,我在我的本地机器上安装了 python 包“apache-airflow[crypto]”并生成了一个 Fernet 密钥,然后我将其放入我的 docker-compose.yaml作为变量“AIRFLOW__CORE__FERNET_KEY: 'MY_KEY'”。 我还将软件包“apache-airflow[crypto]”添加到我的气流存储库 requirements.txt 以便气流可以处理 fernet 密钥。

我的问题如下:

  1. 当我按照描述将 fernet 密钥添加为环境变量时,我可以在 docker-compose.yaml 中看到 fernet 密钥,并且当我进入容器并使用 os.environ["AIRFLOW__CORE__FERNET_KEY"] 它显示了 - 这不是不安全吗?据我了解,可以使用此 fernet 密钥解密凭据。
  2. 当我向气流添加连接时,我可以使用“气流连接获取 CONNECTION_NAME”通过容器 CLI 获取它们的属性。虽然我添加了 Fernet 密钥,但我在这里看到的是纯文本密码 - 这不是应该隐藏的吗?
  3. 与密码不同,GUI 的“额外”字段中的值(/连接字符串)不会消失,甚至可以在 GUI 中读取。如何从 GUI 和 CLI 隐藏这些凭据?

airflow GUI 告诉我我的连接已加密,所以我认为加密确实以某种方式起作用。但是当我可以清楚地看到密码时,那句话是什么意思?

我认为您对“加密”和“安全”做出了错误的假设。您可以阻止有权访问 运行ning 软件(airflow CLI 为您提供)的用户的假设是不现实的,并且不是真正“物理上可实现的”。

  1. Fernet 密钥用于加密数据库中的“静态”数据。如果您的数据库内容被盗(但不是您的 Airflow program/configuration)——您的数据将受到保护。这是 Fernet Key 的唯一原因。它保护您存储在“静态”数据库中的数据。但是一旦你有了密钥(来自 Airflow 运行 时间),你就可以解密它。通常数据库在某个远程服务器上并且有一些备份。只要备份不与密钥保存在一起,如果您的气流实例是“安全的”但您的数据库或备份被“盗取”no-one 将能够使用该数据。

  2. 是的。如果您有权访问 airflow 运行ning 实例,您应该能够以明文形式读取密码。您还期望 Airflow 如何工作?它需要读取密码才能进行身份验证。如果你可以 运行 airflow 程序,数据需要是可访问的。没有解决办法,你不能以不同的方式来做,这在设计上是不可能的。您可以做些什么来更好地保护您的数据——您可以使用 Secrets Managers https://airflow.apache.org/docs/apache-airflow/stable/security/secrets/secrets-backend/index.html——但它们最多只能给您频繁轮换机密的可能性。 Airflow - 当 运行ning 需要访问这些密码时,否则你将无法很好地进行身份验证。一旦您有权访问 Airflow Runtime(例如使用 CLI),就无法阻止访问那些 Airflow 在 运行 时间必须知道的密码。这是任何需要通过外部系统进行身份验证的系统的基本 属性,并且可以在 运行 时访问。 Airflow 是用 Python 编写的,您可以轻松编写任何使用其 运行time 的代码,因此您无法物理保护需要知道的 运行time 密码“气流核心”。在 运行 时,它需要知道身份验证才能与外部系统连接和通信。一旦您有权访问系统,根据定义,您就可以访问系统在 运行 时间使用的所有机密。世界上没有任何系统可以以不同的方式做到这一点——这就是它的本质。频繁轮换和临时认证是唯一的处理方式,这样可能泄露的认证就不会长期使用。

  3. Modern Airflow(2.1 + 我相信)有秘密屏蔽器,当您指定它时,它也会屏蔽敏感数据。 https://airflow.apache.org/docs/apache-airflow/stable/security/secrets/mask-sensitive-values.html。秘密屏蔽器还屏蔽日志中的敏感数据,因为日志也可以存档和备份 - 类似于数据库 - 保护它是有意义的。 UI - 与 CLI(它让您可以访问 运行 气流“核心”时间)不同,它只是一个 front-end,它不会让您访问 运行ning 核心, 所以屏蔽敏感数据也是有道理的。