在 GitHub 作业中使用 AWS Secrets Manager 密钥 - AWS Secrets Manager

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 GitHub 作业中使用 AWS Secrets Manager 密钥

若要在 GitHub 作业中使用密钥,您可以使用 GitHub 操作从 AWS Secrets Manager 中检索密钥,并将密钥添加为 GitHub 工作流中的屏蔽环境变量。有关 GitHub 操作的更多信息,请参阅 GitHub 文档中的 Understanding GitHub Actions(了解 GitHub 操作)。

您将密钥添加到 GitHub 环境中时,该密钥可用于 GitHub 作业中的所有其他步骤。遵循 Security hardening for GitHub Actions(GitHub Actions 安全强化)中的指南,有助于防止滥用环境中的密钥。

您可以将密钥值中的整个字符串设置为环境变量值,或者如果字符串为 JSON,则可以解析 JSON,以为每个 JSON 键值对设置单独的环境变量。如果密钥值是二进制,则操作会将密钥值转换为字符串。

若要查看从密钥创建的环境变量,请启用调试日志记录。有关更多信息,请参阅 GitHub 文档中的 Enabling debug logging(启用调试日志记录)。

要使用根据您的密钥创建的环境变量,请参阅《GitHub 文档》中的环境变量

先决条件

若要使用此操作,您首先需要配置 AWS 凭证,然后使用 configure-aws-credentials 步骤在 GitHub 环境中设置 AWS 区域。按照为 GitHub 操作配置 AWS 凭证操作中的说明直接使用 GitHub OIDC 提供程序代入角色。这让您能够使用短期凭证,避免在 Secrets Manager 之外存储额外的访问密钥。

操作承担的 IAM 角色必须具有下列权限:

  • 您要检索的密钥的 GetSecretValue 权限。

  • 所有密钥的 ListSecrets 权限。

  • (可选)如果密钥使用 客户托管式密钥 加密,则 Decrypt 在 KMS key 上。

有关更多信息,请参阅 AWS Secrets Manager 的身份验证和访问控制

使用量

若要使用该操作,请在工作流程中添加一个使用以下语法的步骤。

- name: Step name uses: aws-actions/aws-secretsmanager-get-secrets@v2 with: secret-ids: | secretId1 ENV_VAR_NAME, secretId2 name-transformation: (Optional) uppercase|lowercase|none parse-json-secrets: (Optional) true|false
参数
secret-ids

密钥 ARN、名称和名称前缀。

若要设置环境变量名称,请在密钥 ID 前输入该名称,然后输入逗号。例如,ENV_VAR_1, secretId 从密钥 secretId 中创建名为 ENV_VAR_1 的环境变量。环境变量的名称可以包含小写字母、数字和下划线。

若要使用前缀,请输入至少三个字符,然后输入星号。例如,dev* 匹配名称以 dev 开头的所有密钥。最多可以检索 100 个匹配密钥。如果您设置了变量名称,并且前缀与多个密钥匹配,则操作将失败。

name-transformation

默认情况下,该步骤从密钥名称创建每个环境变量名称,并转换为仅包含大写字母、数字和下划线,防止名称以数字开头。对于名称中的字母,您可以通过 lowercase 将步骤配置为使用小写字母,或者通过 none 配置为不改变字母的大小写。默认值为 uppercase

parse-json-secrets

(可选)默认情况下,该操作将环境变量值设置为密钥值中的整个 JSON 字符串。将 parse-json-secrets 设置为 true,以为 JSON 中的每个键值对创建环境变量。

请注意,如果 JSON 使用区分大小写的密钥(例如“name”和“Name”),则该操作将出现重复的名称冲突。在这种情况下,请将 parse-json-secrets 设置为 false 并单独解析 JSON 密钥值。

环境变量命名

操作创建的环境变量的名称与它们来源的密钥相同。环境变量的命名要求比密钥的命名要求更严格,因此操作会转换密钥名称,以满足这些要求。例如,该操作将把小写字母转换为大写字母。如果解析密钥的 JSON,则环境变量名称将同时包含密钥名称和 JSON 键名称,例如 MYSECRET_KEYNAME。您可以将操作配置为不转换小写字母。

如果两个环境变量具有相同的名称,则操作将失败。在这种情况下,您必须将要用于环境变量的名称指定为别名

名称可能冲突的示例:

  • 名为“MySecret”的密钥和名为“mysecret”的密钥都将成为名为“MYSECRET”的环境变量。

  • 名为“Secret_keyname”的密钥以及名为“Secret”且具有“keyname”键的 JSON 解析密钥都将成为名为“SECRET_KEYNAME”的环境变量。

您可以通过指定别名来设置环境变量名称,如以下示例所示,它会创建一个名为 ENV_VAR_NAME 的变量。

secret-ids: | ENV_VAR_NAME, secretId2
空白别名
  • 如果您设置 parse-json-secrets: true 并输入空白别名,后跟逗号,然后是密钥 ID,则操作会将环境变量命名为与解析后的 JSON 键相同。变量名称不包含密钥名称。

    如果密钥不包含有效的 JSON,则操作会创建一个环境变量并将其命名为与密钥名称相同。

  • 如果您设置 parse-json-secrets: false 并输入空白别名,后跟逗号,然后是密钥 ID,则操作将命名环境变量,就好像您没有指定别名一样。

以下示例显示了一个空白别名。

,secret2

示例

例 1 按名称和 ARN 获取密钥

下列示例为按名称和 ARN 标识的密钥创建环境变量。

- name: Get secrets by name and by ARN uses: aws-actions/aws-secretsmanager-get-secrets@v2 with: secret-ids: | exampleSecretName arn:aws:secretsmanager:us-east-2:123456789012:secret:test1-a1b2c3 0/test/secret /prod/example/secret SECRET_ALIAS_1,test/secret SECRET_ALIAS_2,arn:aws:secretsmanager:us-east-2:123456789012:secret:test2-a1b2c3 ,secret2

已创建的环境变量:

EXAMPLESECRETNAME: secretValue1 TEST1: secretValue2 _0_TEST_SECRET: secretValue3 _PROD_EXAMPLE_SECRET: secretValue4 SECRET_ALIAS_1: secretValue5 SECRET_ALIAS_2: secretValue6 SECRET2: secretValue7
例 2 获取所有以前缀开头的密钥

下列示例为名称以 beta 开头的所有密钥创建环境变量。

- name: Get Secret Names by Prefix uses: 2 with: secret-ids: | beta* # Retrieves all secrets that start with 'beta'

已创建的环境变量:

BETASECRETNAME: secretValue1 BETATEST: secretValue2 BETA_NEWSECRET: secretValue3
例 3 在密钥中解析 JSON

下列示例通过解析密钥中的 JSON 来创建环境变量。

- name: Get Secrets by Name and by ARN uses: aws-actions/aws-secretsmanager-get-secrets@v2 with: secret-ids: | test/secret ,secret2 parse-json-secrets: true

密钥 test/secret 具有下列密钥值。

{ "api_user": "user", "api_key": "key", "config": { "active": "true" } }

密钥 secret2 具有下列密钥值。

{ "myusername": "alejandro_rosalez", "mypassword": "EXAMPLE_PASSWORD" }

已创建的环境变量:

TEST_SECRET_API_USER: "user" TEST_SECRET_API_KEY: "key" TEST_SECRET_CONFIG_ACTIVE: "true" MYUSERNAME: "alejandro_rosalez" MYPASSWORD: "EXAMPLE_PASSWORD"
例 4 对环境变量名称使用小写字母

以下示例将创建一个具有小写名称的环境变量。

- name: Get secrets uses: aws-actions/aws-secretsmanager-get-secrets@v2 with: secret-ids: exampleSecretName name-transformation: lowercase

已创建的环境变量:

examplesecretname: secretValue