使用 Secrets Manager 指定敏感数据 - AWS Batch
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

使用 Secrets Manager 指定敏感数据

使用 AWS Batch,您可以向您的作业中注入敏感数据,方法是将您的敏感数据存储在 AWS Secret Manager 密钥中,然后在任务定义中引用它们。存储在 Secrets Manager 中的敏感数据可以作为环境变量或作为日志配置的一部分提供给作业。

在将密钥注入为环境变量时,可以指定 JSON 密钥或要注入的密钥的版本。此过程可以帮助您控制向作业公开的敏感数据。有关密钥版本控制的详细信息,请参阅。AWS Secrets Manager 的主要术语和概念中的AWS Secrets Manager 用户指南

使用 Secrets Manager 指定敏感数据的注意事项

使用 Secrets Manager 指定作业的敏感数据时,应考虑以下事项。

  • 要使用特定的 JSON 密钥或密钥版本注入密钥,计算环境中的容器实例必须安装版本 1.37.0 或更高版本的 Amazon ECS 容器代理。但是,我们建议使用最新的容器代理版本。有关检查您的代理版本并更新到最新版本的信息,请参阅更新 Amazon ECS 容器代理中的Amazon Elastic Container Service 开发商指南

    要将密钥的完整内容注入为环境变量或将密钥注入日志配置中,您的容器实例必须具有版本 1.22.0 或更高版本的容器代理。

  • 仅存储文本数据的机密,这些机密是使用SecretString的参数CreateSecret支持 API。存储二进制数据的密码,这些密码是使用SecretBinary的参数CreateSecret不支持 API。

  • 当使用引用 Secrets Manager 来检索作业的敏感数据的作业定义时,如果您还在使用接口 VPC 终端节点,则必须为密钥管理器创建接口 VPC 终端节点。有关更多信息,请参阅 。将 Secrets Manager 与 VPC 终端节点结合使用中的AWS Secrets Manager 用户指南

  • 最初启动作业时,会将敏感数据注入作业中。如果随后更新或轮换密钥,则作业将不会自动接收已更新的值。您必须启动新作业,以强制服务启动具有更新密钥值的新作业。

AWS Batch 密钥所需的 IAM 权限

要使用此功能,您必须具有执行角色,并在作业定义中引用它。这允许容器代理拉取必要的 Secrets Manager 器资源。有关更多信息,请参阅 AWS Batch 执行 IAM 角色

重要

您必须使用 Amazon ECS 容器代理配置变量ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE=true以使用此功能。您可以将其添加到./etc/ecs/ecs.config文件在容器实例创建过程中。或者,您可以将其添加到现有实例中,然后重新启动 Amazon ECS 容器代理。有关更多信息,请参阅 。Amazon ECS 容器代理配置中的Amazon Elastic Container Service 开发商指南

要提供对您创建的 Secrets Manager 密钥的访问权限,请将以下权限作为内联策略手动添加到执行角色。有关更多信息,请参阅 。添加和删除 IAM 策略中的IAM 用户指南

  • secretsmanager:GetSecretValue-如果要引用密钥 Secrets Manager 码,则必须填写。

  • kms:Decrypt-仅当您的密钥使用自定义 KMS 密钥而不是默认密钥时才需要。您的自定义密钥的 ARN 应添加为资源。

以下示例内联策略会添加所需权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "kms:Decrypt" ], "Resource": [ "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:<secret_name>", "arn:aws:kms:<region>:<aws_account_id>:key/<key_id>" ] } ] }

将敏感数据作为环境变量注入

在作业定义中,可以指定以下项目:

  • 这些区域有:secrets对象,该对象包含要在作业中设置的环境变量名称

  • 密钥 Secrets Manager 钥的 Amazon 资源名称 (ARN)

  • 其他参数,这些参数包含要提供给作业的敏感数据

以下示例显示必须为密钥 Secrets Manager 钥指定的完整语法。

arn:aws:secretsmanager:region:aws_account_id:secret:secret-name

下一部分介绍了其他参数。这些参数是可选的。但是,如果不使用它们,则必须包含冒号:以使用默认值。下面提供了示例,以便您了解更多上下文。

json-key

使用要设置为环境变量值的值指定密钥-值对中密钥的名称。仅支持 JSON 格式的值。如果未指定 JSON 密钥,则使用密钥的完整内容。

version-stage

指定要使用的密钥版本的暂存标签。如果指定了版本暂存标签,则无法指定版本 ID。如果未指定版本阶段,则默认行为是使用 AWSCURRENT 暂存标签检索密钥。

暂存标签用于在更新或轮换密钥的各个版本时对其进行跟踪。密钥的每个版本均有一个或多个暂存标签和一个 ID。有关更多信息,请参阅 。AWS Secrets Manager 的主要术语和概念中的AWS Secrets Manager 用户指南

version-id

指定要使用的密钥版本的唯一标识符。如果指定了版本 ID,则无法指定版本暂存标签。如果未指定版本 ID,则默认行为是使用 AWSCURRENT 暂存标签检索密钥。

版本 ID 用于在更新或轮换密钥的各个版本时对其进行跟踪。密码的每个版本均有一个 ID。有关更多信息,请参阅 。AWS Secrets Manager 的主要术语和概念中的AWS Secrets Manager 用户指南

示例容器定义

以下示例说明了可用于在容器定义中引用密钥管理器密钥的方法。

例 引用完整密钥

以下是任务定义的片段,其中显示引用 Secrets Manager 钥的完全文本时的格式。

{ "containerProperties": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf" }] }] }

例 引用密钥中的特定密钥

下面显示了 get-secret-value 命令中的示例输出,其中显示了密钥的内容以及与之关联的版本暂存标签和版本 ID。

{
    "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf",
    "Name": "appauthexample",
    "VersionId": "871d9eca-18aa-46a9-8785-981dd39ab30c",
    "SecretString": "{\"username1\":\"password1\",\"username2\":\"password2\",\"username3\":\"password3\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1581968848.921
}

通过在 ARN 的末尾指定密钥名称,引用容器定义中的上一个输出中的特定密钥。

{ "containerProperties": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::" }] }] }

例 引用特定的密钥版本

下面显示了 describe-secret 命令中的示例输出,其中显示了密钥的未加密内容以及密钥的所有版本的元数据。

{
    "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf",
    "Name": "appauthexample",
    "Description": "Example of a secret containing application authorization data.",
    "RotationEnabled": false,
    "LastChangedDate": 1581968848.926,
    "LastAccessedDate": 1581897600.0,
    "Tags": [],
    "VersionIdsToStages": {
        "871d9eca-18aa-46a9-8785-981dd39ab30c": [
            "AWSCURRENT"
        ],
        "9d4cb84b-ad69-40c0-a0ab-cead36b967e8": [
            "AWSPREVIOUS"
        ]
    }
}

通过在 ARN 的末尾指定密钥名称,引用容器定义中的上一个输出中的特定版本暂存标签。

{ "containerProperties": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf::AWSPREVIOUS:" }] }] }

通过在 ARN 的末尾指定密钥名称,引用容器定义中的上一个输出中的特定版本 ID。

{ "containerProperties": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf::9d4cb84b-ad69-40c0-a0ab-cead36b967e8" }] }] }

例 引用密钥的特定密钥和版本暂存标签

以下内容说明如何同时引用密钥中的特定密钥和特定版本暂存标签。

{ "containerProperties": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1:AWSPREVIOUS:" }] }] }

要指定特定密钥和版本 ID,请使用以下语法。

{ "containerProperties": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::9d4cb84b-ad69-40c0-a0ab-cead36b967e8" }] }] }

在日志配置中注入敏感数据

在您的作业定义中,在指定logConfiguration您可以指定secretOptions,其中包含要在容器中设置的日志驱动程序选项的名称以及包含要提供给容器的敏感数据的密钥管理器密钥的完整 ARN。

以下是作业定义的片段,其中显示引用密钥 Secrets Manager 钥时的格式。

{ "containerProperties": [{ "logConfiguration": [{ "logDriver": "splunk", "options": { "splunk-url": "https://cloud.splunk.com:8080" }, "secretOptions": [{ "name": "splunk-token", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf" }] }] }] }

创建 AWS Secrets Manager 密钥

您可以使用 Secrets Manager 控制台为您的敏感数据创建密钥。有关更多信息,请参阅 。创建基本密钥中的AWS Secrets Manager 用户指南

创建基本密钥

使用 Secrets Manager 为您的敏感数据创建密钥。

  1. 在以下网址打开 Secrets Manager 控制台https://console.aws.amazon.com/secretsmanager/

  2. 选择存储新密钥

  3. 对于选择密钥类型,选择其他密钥类型

  4. Key (键)Value (值) 对的形式指定自定义密钥的详细信息。例如,您可以指定键UserName,然后提供适当的用户名作为其值。添加名为的第二个键Password并将密码文本作为其值。您也可以为数据库名称、服务器地址或 TCP 端口添加条目。您可以添加所需数量的对以存储所需的信息。

    或者,您也可以选择 Plaintext (明文) 选项卡,并以所需的任何方式输入密钥值。

  5. 选择要用于加密密密密钥中的受保护文本的 AWS KMS 加密密密钥。如果您没有选择一个,则 Secrets Manager 会检查账户是否存在默认密钥并在存在时使用它。如果不存在默认密钥,则 Secrets Manager 将自动为您创建一个。您也可以选择添加新密钥以创建专用于该密钥的自定义 CMK。要创建您自己的 AWS KMS CMK,您必须具有在您的账户中创建 CMK 的权限。

  6. 选择 Next

  7. 对于密钥名称,请键入可选的路径和名称,如 production/MyAwesomeAppSecretdevelopment/TestSecret,然后选择下一步。您可以选择添加描述以帮助记住该密钥以后的用途。

    密钥名称应仅包含 ASCII 字母、数字或以下任意字符:/_+=.@-

  8. (可选) 此时,您可以为密钥配置轮换。对于此程序,请将其保留为禁用自动轮换,然后选择下一步

    有关如何为新的或现有的密钥配置轮换的信息,请参阅轮换 AWS Secrets Manager 密钥密钥

  9. 检查您的设置,然后选择存储密钥将输入的所有内容作为新密钥保存在密钥管理器中。