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 Secret Backend 将尝试使用默认连接 ID:yandexcloud_default

Lockbox Secret Backend 将尝试使用连接中默认的文件夹 ID。你也可以在 backend_kwargs 中显式指定 folder_id

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

存储与获取连接

要存储一个连接,需要 创建一个密钥,其名称遵循以下格式:{connections_prefix}{sep}{connection_name}

密钥的 payload 必须包含任意键对应的文本值。

以 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 Secret Backend 读取,可运行 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}。payload 必须包含任意键对应的文本值。

以下示例展示了变量值的可能形式: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 Secret Backend 读取,可运行 airflow variables get

$ airflow variables get my_variable
some_secret_data

存储与获取配置

Lockbox Secret Backend 同样适用于存放敏感配置。

例如,我们将为 sentry.sentry_dsn 提供一个密钥,并使用 sentry_dsn_value 作为配置值的名称。

要存储一个配置,需要 创建一个密钥,其名称遵循以下格式:{config_prefix}{sep}{config_value_name}。payload 必须包含任意键对应的文本值。

下面是使用 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 Secret Backend 读取,可运行 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

此条目是否有帮助?