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 掛載點

您可以為 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

請注意,Keyconn_uriValuesmtps://user:host@relay.example.com: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: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

請注意,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_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"

請注意,密鑰 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"}

此條目是否有幫助?