Yandex.Cloud Lockbox 密鑰後端¶
本主題說明如何設定 Apache Airflow 使用 Yandex Lockbox 作為密鑰後端,以及如何管理密鑰。
啟用 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_prefix
和secret_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.viewer
和 lockbox.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