Yandex.Cloud Lockbox 秘密后端

本主题介绍如何配置 Apache Airflow 以使用 Yandex Lockbox 作为秘密后端以及如何管理秘密。

入门

在开始之前,请确保您已在 Apache Airflow 安装中安装了 yandex 提供程序

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:[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

此条目有帮助吗?