Hashicorp Vault 密鑰後端¶
若要啟用 Hashicorp Vault 以檢索 Airflow 連線/變數,請在 [secrets]
區段的 airflow.cfg
中,將 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 client。所有在 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: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 密鑰的值必須是連線物件的 連線 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_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"}
使用 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"}