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 Secrets Engine Version `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:host@relay.example.com:465
请注意,`Key` 是 `conn_uri`,`Value` 是 `smtps://user:host@relay.example.com: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:host@relay.example.com:465
Vault 键的值必须是连接对象的 connection 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
请注意,`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_secret`,其值为 `sql_alchemy_conn_value`,您需要按如下方式存储您的密钥:
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"}
Vault 使用 AWS Assume Role STS 进行认证¶
添加参数 “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"}