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

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

使用 Secrets Manager 密钥指定敏感数据

借助 Amazon Batch,您可以将敏感数据存储在 Amazon Secrets Manager 密钥中,然后在任务定义中引用这些密钥,从而将敏感数据注入任务。存储在 Secrets Manager 密钥中的敏感数据可以作为环境变量或作为日志配置的一部分提供给作业。

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

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

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

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

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

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

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

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

Amazon Batch 密钥所需的 IAM 权限

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

要提供对您创建的 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:version-stage:version-id

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

json-key

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

version-stage

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

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

version-id

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

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

示例容器定义

以下示例说明了可用于在容器定义中引用 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,方法是使用要在容器中设置的日志驱动程序选项的名称,以及包含要提供给容器的敏感数据的 Secrets Manager 密钥的完整 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" }] }] }] }

创建 Amazon Secrets Manager 密钥

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

创建基本密钥

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

  1. https://console.aws.amazon.com/secretsmanager/ 打开 Secrets Manager 控制台。

  2. 选择 Store a new secret (存储新密钥)

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

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

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

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

  6. 选择 Next(下一步)。

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

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

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

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

  9. 检查您的设置,然后选择 Store secret (存储密钥) 以将输入的所有内容作为新密钥保存在 Secrets Manager 中。