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

使用 Secrets Manager 指定敏感数据

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

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

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

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

  • 对于使用 Fargate 启动类型的任务,应考虑以下事项:

    • 仅支持将密钥的完整内容注入为环境变量。目前不支持指定特定的 JSON 密钥或版本。

    • 要将密钥的完整内容注入为环境变量或注入到日志配置中,您必须使用版本 1.3.0 或更高版本的平台。有关信息,请参阅 AWS Fargate 平台版本

  • 最初启动容器时,会将敏感数据注入容器中。如果随后更新或轮换密钥,则容器将不会自动接收更新后的值。您必须启动新任务,或者如果您的任务是服务的一部分,则可以更新服务并使用强制新部署选项来强制服务启动新任务。

Amazon ECS 密钥所需的 IAM 权限

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

要提供对您创建的 Secrets Manager 密钥的访问权限,请将以下权限作为内联策略手动添加到任务执行角色。有关更多信息,请参阅添加和删除 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
重要

如果您正在使用 AWS Fargate,则只支持在任务定义中指定密钥的完整 ARN。目前不支持指定特定的 JSON 密钥或版本。

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

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 密钥并将其作为环境变量注入容器中的完整教程,请参阅教程:使用 Secrets Manager 密钥指定敏感数据

示例容器定义

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

例 引用完整密钥

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

{ "containerDefinitions": [{ "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 的末尾指定密钥名称,引用容器定义中的上一个输出中的特定密钥。

{ "containerDefinitions": [{ "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 的末尾指定密钥名称,引用容器定义中的上一个输出中的特定版本暂存标签。

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

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

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

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

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

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

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

{ "containerDefinitions": [{ "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 密钥时的格式。

{ "containerDefinitions": [{ "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 ECS 控制台创建引用了 Secrets Manager 密钥的任务定义。

创建指定密钥的任务定义

  1. https://console.amazonaws.cn/ecs/ 上打开 Amazon ECS 控制台。

  2. 在导航窗格中,依次选择 Task Definitions (任务定义)Create new Task Definition (创建新任务定义)

  3. Select launch type compatibility (选择启动类型兼容性) 页面上,选择任务的启动类型,然后选择 Next step (下一步)

  4. Task Definition Name (任务定义名称) 中,为任务定义键入名称。最多能包含 255 个字母 (大写和小写字母)、数字、连字符和下划线。

  5. 对于 Task execution role (任务执行角色),选择现有任务执行角色,或者选择 Create new role (创建新角色) 为您创建一个此类角色。此角色授权 Amazon ECS 提取任务的私有映像。有关更多信息,请参阅 私有注册表身份验证所需的 IAM 权限

    重要

    如果 Task execution role (任务执行角色) 字段未显示,请选择 Configure via JSON (通过 JSON 配置) 并手动添加 executionRoleArn 字段来指定您的任务执行角色。以下代码显示语法:

    "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole"
  6. 对于您的任务定义中要创建的每个容器,请完成以下步骤:

    1. Container Definitions (容器定义) 下,选择 Add container (添加容器)

    2. 对于 Container name (容器名称),键入容器的名称。最多能包含 255 个字母 (大写和小写字母)、数字、连字符和下划线。

    3. 对于 Image (映像),键入映像名称或到您私有映像的路径。最多能包含 255 个字母 (大写和小写字母)、数字、连字符和下划线。

    4. 展开 Advanced container configuration (高级容器配置)

    5. 对于要注入为环境变量的敏感数据,请在 Environment (环境) 下,为 Environment variables (环境变量) 填写以下字段:

      1. 对于 Key (键),输入要在容器中设置的环境变量的名称。此选项对应于容器定义的 secrets 部分中的 name 字段。

      2. 对于 Value (值),选择 ValueFrom。对于 Add value (添加值),请输入包含要作为环境变量提供给容器的数据的 Secrets Manager 密钥 ARN。

    6. 对于在容器的日志配置中引用的敏感数据,请在 Storage and Logging (存储和日志记录) 下,为 Log configuration (日志配置) 填写以下字段:

      1. 清除自动配置 CloudWatch Logs 选项。

      2. Log options (日志选项) 下,对于 Key (密钥),输入要设置的日志配置选项。

      3. 对于 Value (值),选择 ValueFrom。对于 Add value (添加值),请输入包含要作为日志选项提供给日志配置的数据的 Secrets Manager 密钥的完整 ARN。

    7. 填写剩余的必填字段和要在您的容器定义中使用的任何可选字段。更多容器定义参数将可用于 Advanced container configuration (高级容器配置) 菜单中。有关更多信息,请参阅任务定义参数

    8. 选择 Add

  7. 当添加您的容器时,请选择 Create (创建)