Yandex.Cloud Lockbox 金鑰後端

本主題介紹如何配置 Apache Airflow 以使用 Yandex Lockbox 作為金鑰後端以及如何管理金鑰。

入門

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

pip install apache-airflow-providers-yandex

啟用 Yandex Lockbox 金鑰後端

要啟用 Yandex Lockbox 作為金鑰後端,請在 airflow.cfg 檔案的 [secrets] 部分中將 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

此條目有幫助嗎?