Yandex.Cloud Lockbox 密鑰後端

本主題說明如何設定 Apache Airflow 使用 Yandex Lockbox 作為密鑰後端,以及如何管理密鑰。

開始使用

在開始之前,請確保您已在 Apache Airflow 安裝中安裝了 yandex 提供者

pip install apache-airflow-providers-yandex

啟用 Yandex Lockbox 密鑰後端

若要啟用 Yandex Lockbox 作為密鑰後端,請在 [secrets] 區段的 airflow.cfg 檔案中,將 LockboxSecretBackend 指定為您的 backend

以下是一個範例組態

[secrets]
backend = airflow.providers.yandex.secrets.lockbox.LockboxSecretBackend

您也可以使用環境變數設定此項

export AIRFLOW__SECRETS__BACKEND=airflow.providers.yandex.secrets.lockbox.LockboxSecretBackend

您可以使用 airflow config get-value 命令驗證組態選項是否已正確設定

$ airflow config get-value secrets backend
airflow.providers.yandex.secrets.lockbox.LockboxSecretBackend

後端參數

下一步是使用 backend_kwargs 選項設定後端參數,這些選項允許您提供以下參數

  • yc_oauth_token:指定用於連接到 Yandex Lockbox 的使用者帳戶 OAuth 權杖。參數值應類似 y3_xx123

  • yc_sa_key_json:以 JSON 格式指定服務帳戶金鑰。參數值應類似 {"id": "...", "service_account_id": "...", "private_key": "..."}

  • yc_sa_key_json_path:以 JSON 檔案路徑指定服務帳戶金鑰。參數值應類似 /home/airflow/authorized_key.json,而檔案內容應具有以下格式: {"id": "...", "service_account_id": "...", "private_key": "..."}

  • yc_connection_id:指定用於連接到 Yandex Lockbox 的連線 ID。預設值為 yandexcloud_default

  • folder_id:指定要在其中搜尋 Yandex Lockbox 密鑰的資料夾 ID。如果設定為 None(JSON 中的 null),則請求將使用連線 folder_id(如果已指定)。

  • connections_prefix:指定要讀取以取得連線的密鑰前綴。如果設定為 None(JSON 中的 null),則不會將連線請求傳送至 Yandex Lockbox。預設值為 airflow/connections

  • variables_prefix:指定要讀取以取得變數的密鑰前綴。如果設定為 None(JSON 中的 null),則不會將變數請求傳送至 Yandex Lockbox。預設值為 airflow/variables

  • config_prefix:指定要讀取以取得組態的密鑰前綴。如果設定為 None(JSON 中的 null),則不會將變數請求傳送至 Yandex Lockbox。預設值為 airflow/config

  • sep:指定用於串連 secret_prefixsecret_id 的分隔符號。預設值為 /

  • endpoint:指定 API 端點。如果設定為 None(JSON 中的 null),則請求將使用連線端點(如果已指定);否則,它們將使用預設端點。

請務必以 JSON 字典形式提供所有選項。

例如,如果您想要將 connections_prefix 設定為「example-connections-prefix」,並將 variables_prefix 設定為「example-variables-prefix」,您的組態檔應如下所示

[secrets]
backend = airflow.providers.yandex.secrets.lockbox.LockboxSecretBackend
backend_kwargs = {"connections_prefix": "example-connections-prefix", "variables_prefix": "example-variables-prefix"}

設定憑證

您需要指定憑證或 yandexcloud 連線的 ID,以連接到 Yandex Lockbox。

憑證將以下列優先順序使用

  • OAuth 權杖

  • 來自檔案的 JSON 服務帳戶金鑰

  • JSON 服務帳戶金鑰

  • Yandex Cloud 連線

如果您未指定任何憑證,系統將使用預設連線 ID:yandexcloud_default

使用 OAuth 權杖授權為使用者帳戶

首先,您需要為您的使用者帳戶建立 OAuth 權杖。您的權杖看起來會像這樣: y3_Vd3eub7w9bIut67GHeL345gfb5GAnd3dZnf08FR1vjeUFve7Yi8hGvc

然後,您需要在 backend_kwargs 中指定 folder_id 和您的權杖

[secrets]
backend_kwargs = {"folder_id": "b1g66mft1vo1n4vbn57j", "yc_oauth_token": "y3_Vd3eub7w9bIut67GHeL345gfb5GAnd3dZnf08FR1vjeUFve7Yi8hGvc"}

使用授權金鑰授權為服務帳戶

在開始之前,請確保您已建立具有 lockbox.viewerlockbox.payloadViewer 權限的 Yandex Cloud 服務帳戶

首先,您需要為您的服務帳戶建立授權金鑰,並儲存包含公鑰和私鑰部分的已產生 JSON 檔案。

然後,您需要在 backend_kwargs 中指定 folder_id 和金鑰

[secrets]
backend_kwargs = {"folder_id": "b1g66mft1vo1n4vbn57j", "yc_sa_key_json": {"id": "...", "service_account_id": "...", "private_key": "..."}"}

或者,您可以在 backend_kwargs 中指定 JSON 檔案的路徑

[secrets]
backend_kwargs = {"folder_id": "b1g66mft1vo1n4vbn57j", "yc_sa_key_json_path": "/home/airflow/authorized_key.json"}

使用 Yandex Cloud 連線進行授權

首先,您需要建立Yandex Cloud 連線

然後,您需要在 backend_kwargs 中指定 connection_id

[secrets]
backend_kwargs = {"yc_connection_id": "my_yc_connection"}

如果您未指定任何憑證,Lockbox 密鑰後端將嘗試使用預設連線 ID:yandexcloud_default

Lockbox 密鑰後端將嘗試使用您連線中的預設資料夾 ID。您也可以在 backend_kwargs 中指定 folder_id

[secrets]
backend_kwargs = {"folder_id": "b1g66mft1vo1n4vbn57j", "yc_connection_id": "my_yc_connection"}

儲存和檢索連線

若要儲存連線,您需要建立一個密鑰,其名稱格式如下: {connections_prefix}{sep}{connection_name}

酬載必須包含具有任何金鑰的文字值。

將連線儲存為 URI

儲存連線的主要方式是使用 連線 URI 表示法,例如 mysql://myname:mypassword@myhost.com?this_param=some+val&that_param=other+val%2A

以下是使用 yc CLI 建立密鑰的範例

$ yc lockbox secret create \
    --name airflow/connections/mysqldb \
    --payload '[{"key": "value", "text_value": "mysql://myname:mypassword@myhost.com?this_param=some+val&that_param=other+val%2A"}]'
done (1s)
name: airflow/connections/mysqldb

將連線儲存為 JSON

另一種儲存連線的方式是使用 JSON 格式

{
  "conn_type": "mysql",
  "host": "host.com",
  "login": "myname",
  "password": "mypassword",
  "extra": {
    "this_param": "some val",
    "that_param": "other val*"
  }
}

以下是使用 yc CLI 建立密鑰的範例

$ yc lockbox secret create \
    --name airflow/connections/my_sql_db_json \
    --payload '[{"key": "value", "text_value": "{\"conn_type\": \"mysql\", \"host\": \"host.com\", \"login\": \"myname\", \"password\": \"mypassword\", \"extra\": {\"this_param\": \"some val\", \"that_param\": \"other val*\"}}"}]'
done (1s)
name: airflow/connections/my_sql_db_json

檢索連線

若要檢查連線是否已從 Lockbox 密鑰後端正確讀取,您可以使用 airflow connections get

$ airflow connections get mysqldb -o json
[{"id": null, "conn_id": "mysqldb", "conn_type": "mysql", "description": null, "host": "host.com", "schema": "", "login": "myname", "password": "mypassword", "port": null, "is_encrypted": "False", "is_extra_encrypted": "False", "extra_dejson": {"this_param": "some val", "that_param": "other val*"}, "get_uri": "mysql://myname:mypassword@myhost.com/?this_param=some+val&that_param=other+val%2A"}]

儲存和檢索變數

若要儲存變數,您需要建立一個密鑰,其名稱格式如下: {variables_prefix}{sep}{variable_name}。酬載必須包含具有任何金鑰的文字值。

以下是變數值可能看起來的樣子: some_secret_data

以下是使用 yc CLI 建立密鑰的範例

$ yc lockbox secret create \
    --name airflow/variables/my_variable \
    --payload '[{"key": "value", "text_value": "some_secret_data"}]'
done (1s)
name: airflow/variables/my_variable

若要檢查變數是否已從 Lockbox 密鑰後端正確讀取,您可以使用 airflow variables get

$ airflow variables get my_variable
some_secret_data

儲存和檢索組態

Lockbox 密鑰後端也適用於儲存敏感組態。

例如,我們將為您提供 sentry.sentry_dsn 的密鑰,並使用 sentry_dsn_value 作為組態值名稱。

若要儲存組態,您需要建立一個密鑰,其名稱格式如下: {config_prefix}{sep}{config_value_name}。酬載必須包含具有任何金鑰的文字值。

以下是使用 yc CLI 建立密鑰的範例

$ yc lockbox secret create \
    --name airflow/config/sentry_dsn_value \
    --payload '[{"key": "value", "text_value": "https://public@sentry.example.com/1"}]'
done (1s)
name: airflow/config/sentry_dsn_value

然後,我們需要在 Apache Airflow 組態中將組態值名稱指定為 {key}_secret

[sentry]
sentry_dsn_secret = sentry_dsn_value

若要檢查組態值是否已從 Lockbox 密鑰後端正確讀取,您可以使用 airflow config get-value

$ airflow config get-value sentry sentry_dsn
https://public@sentry.example.com/1

清除您的密鑰

您可以使用 yc CLI 輕鬆刪除您的密鑰

$ yc lockbox secret delete --name airflow/connections/mysqldb
name: airflow/connections/mysqldb

此條目是否有幫助?