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

此条目有帮助吗?