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 发送被排除类型的请求。
如果您只想在 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
请注意,Key
是 conn_uri
,Value
是 smtps://user:[email protected]:465
,mount_point
是 airflow
。
验证您可以从 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 表示形式 才能获取连接。
使用连接类表示形式存储和检索连接¶
如果您已将 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
请注意,Keys
是 Connection
类的参数,而 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
请注意,密钥的 Key
是 value
,密钥的 Value
是 world
,mount_point
是 airflow
。
存储和检索配置¶
如果您已将 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"
请注意,密钥的 Key
是 value
,密钥的 Value
是 postgres://user:pass@host:5432/db?ssl_mode=disable
,mount_point
是 airflow
。
使用自签名证书运行 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
保留为 JSONnull
如果您使用
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"}