Hashicorp Vault 密钥后端

要启用 Hashicorp Vault 来检索 Airflow 连接/变量,请在 airflow.cfg[secrets] 部分中,指定 VaultBackend 作为 backend

这是一个示例配置

[secrets]
backend = airflow.providers.hashicorp.secrets.vault.VaultBackend
backend_kwargs = {"connections_path": "connections", "variables_path": "variables", "mount_point": "airflow", "url": "http://127.0.0.1:8200"}

默认 KV 版本引擎为 2,如果您使用 KV 密钥引擎版本 1,请在 backend_kwargs 中传递 kv_engine_version: 1

您还可以通过设置环境变量来设置并传递值给 Vault 客户端。支持 https://www.vaultproject.io/docs/commands/#environment-variables 中列出的所有环境变量。

因此,如果您像下面这样设置了 VAULT_ADDR 环境变量,则无需将 url 键传递给 backend_kwargs

export VAULT_ADDR="http://127.0.0.1:8200"

设置 Vault 挂载点

您可以为 airflow 创建一个 mount_point,如下所示

vault secrets enable -path=airflow -version=2 kv

可选查找

可以选择单独或以任意组合方式查找连接、变量或配置。这将防止向 Vault 发送被排除类型的请求。

如果您只想在 Vault 中查找某些类型而排除其他类型,可以将要排除的类型的相关 *_path 参数设置为 null

例如,如果您想将参数 connections_path 设置为 "airflow-connections" 并且不查找变量,则您的配置文件应如下所示

[secrets]
backend = airflow.providers.hashicorp.secrets.vault.VaultBackend
backend_kwargs = {"connections_path": "airflow-connections", "variables_path": null, "mount_point": "airflow", "url": "http://127.0.0.1:8200"}

使用连接 URI 表示形式存储和检索连接

如果您已将 connections_path 设置为 connections,并将 mount_point 设置为 airflow,则对于连接 ID 为 smtp_default 的连接,您需要将密钥存储为

vault kv put airflow/connections/smtp_default conn_uri=smtps://user:[email protected]:465

请注意,Keyconn_uriValuesmtps://user:[email protected]:465,并且 mount_pointairflow

验证您是否可以从 vault 获取密钥

❯ vault kv get airflow/connections/smtp_default
====== Metadata ======
Key              Value
---              -----
created_time     2020-03-19T19:17:51.281721Z
deletion_time    n/a
destroyed        false
version          1

====== Data ======
Key         Value
---         -----
conn_uri    smtps://user:[email protected]:465

Vault 密钥的值必须是连接对象的 连接 URI 表示形式才能获取连接。

使用 Connection 类表示形式存储和检索连接

如果您已将 connections_path 设置为 connections,并将 mount_point 设置为 airflow,则对于连接 ID 为 smtp_default 的连接,您需要将密钥存储为

vault kv put airflow/connections/smtp_default conn_type=smtps login=user password=host host=relay.example.com port=465

请注意,KeysConnection 类的参数,而 Value 是它们的参数。

验证您是否可以从 vault 获取密钥

❯ vault kv get airflow/connections/smtp_default
====== Metadata ======
Key              Value
---              -----
created_time     2020-03-19T19:17:51.281721Z
deletion_time    n/a
destroyed        false
version          1

====== Data ======
Key         Value
---         -----
conn_type   smtps
login       user
password    host
host        relay.example.com
port        465

存储和检索变量

如果您已将 variables_path 设置为 variables,并将 mount_point 设置为 airflow,则对于密钥为 hello 的变量,您需要将密钥存储为

vault kv put airflow/variables/hello value=world

验证您是否可以从 vault 获取密钥

❯ vault kv get airflow/variables/hello
====== Metadata ======
Key              Value
---              -----
created_time     2020-03-28T02:10:54.301784Z
deletion_time    n/a
destroyed        false
version          1

==== Data ====
Key      Value
---      -----
value    world

请注意,密钥 Keyvalue,密钥 Valueworld,并且 mount_pointairflow

存储和检索配置

如果您已将 config_path 设置为 config,并将 mount_point 设置为 airflow,则对于值为 sql_alchemy_conn_value 的配置项 sql_alchemy_conn_secret,您需要将密钥存储为

vault kv put airflow/config/sql_alchemy_conn_value value=postgres://user:pass@host:5432/db?ssl_mode=disable

验证您是否可以从 vault 获取密钥

❯ vault kv get airflow/config/sql_alchemy_conn_value
====== Metadata ======
Key              Value
---              -----
created_time     2020-03-28T02:10:54.301784Z
deletion_time    n/a
destroyed        false
version          1

==== Data ====
Key      Value
---      -----
value    postgres://user:pass@host:5432/db?ssl_mode=disable

然后,您可以在配置文件中使用上述密钥作为 sql_alchemy_conn_secret

[core]
 sql_alchemy_conn_secret: "sql_alchemy_conn_value"

请注意,密钥 Keyvalue,密钥 Valuepostgres://user:pass@host:5432/db?ssl_mode=disable,并且 mount_pointairflow

Vault 使用自签名证书运行

添加 “verify”: “ca 证书文件的绝对路径”

[secrets]
backend = airflow.providers.hashicorp.secrets.vault.VaultBackend
backend_kwargs = {"connections_path": "airflow-connections", "variables_path": null, "mount_point": "airflow", "url": "http://127.0.0.1:8200", "verify": "/etc/ssl/certs/ca-certificates"}

使用 AWS Assume Role STS 进行 Vault 身份验证

添加参数 “assume_role_kwargs”: “AWS STS assume role 身份验证参数字典”

有关更多详细信息,请参阅 AWS Assume Role 身份验证文档:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sts/client/assume_role.html

[secrets]
backend = airflow.providers.hashicorp.secrets.vault.VaultBackend
backend_kwargs = {"connections_path": "airflow-connections", "variables_path": null, "mount_point": "airflow", "url": "http://127.0.0.1:8200", "auth_type": "aws_iam", "assume_role_kwargs": {"arn:aws:iam::123456789000:role/hashicorp-aws-iam-role", "RoleSessionName": "Airflow"}}

使用多个挂载点

您可以使用多个挂载点来存储您的密钥。例如,您可能希望将 Airflow 实例配置存储在只能由您的 Airflow 部署工具访问的 Vault KV 引擎中,同时将变量和连接存储在您的 DAG 可用的另一个 KV 引擎中,以便为它们授予更具体的 Vault ACL。

为了做到这一点,您需要按以下方式设置您的配置

  • mount_point 保留为 JSON null

  • 如果您使用 variables_path 和/或 connections_path,请将它们设置为 "mount_point/path/to/the/secrets"(字符串将使用分隔符 / 分割,第一个元素将是挂载点,其余元素将是密钥的路径)

  • config_path 保留为空字符串 ""

  • 如果您使用 config_path,则每个配置项都需要以用于配置的 mount_point 为前缀,如 "mount_point/path/to/the/config"(同样,字符串将使用分隔符 / 分割,第一个元素将是挂载点,其余元素将是配置参数的路径)

例如

[core]
sql_alchemy_conn_secret: "deployment_mount_point/airflow/configs/sql_alchemy_conn_value"

[secrets]
backend = airflow.providers.hashicorp.secrets.vault.VaultBackend
backend_kwargs = {"connections_path": "dags_mount_point/airflow/connections", "variables_path": "dags_mount_point/airflow/variables", "config_path": "", mount_point": null, "url": "http://127.0.0.1:8200", "verify": "/etc/ssl/certs/ca-certificates"}

此条目是否有帮助?