Yandex.Cloud Lockbox 秘密后端¶
本主题介绍如何配置 Apache Airflow 以使用 Yandex Lockbox 作为秘密后端以及如何管理秘密。
启用 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_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:[email protected]?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:[email protected]?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:[email protected]/?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://[email protected]/1"}]'
done (1s)
name: airflow/config/sentry_dsn_value
然后,我们需要在 Apache Airflow 配置中将配置值名称指定为 {key}_secret
[sentry]
sentry_dsn_secret = sentry_dsn_value
要检查配置值是否已从 Lockbox Secret Backend 正确读取,您可以使用 airflow config get-value
$ airflow config get-value sentry sentry_dsn
https://[email protected]/1
清理您的密钥¶
您可以使用 yc
CLI 轻松删除您的密钥
$ yc lockbox secret delete --name airflow/connections/mysqldb
name: airflow/connections/mysqldb