我如何将密钥或敏感信息安全传递到 Amazon ECS 任务中的容器?

上次更新时间:2020 年 9 月 29 日

我想将密钥或敏感信息安全传递到 Amazon Elastic Container Service (Amazon ECS) 任务中的容器。

简短描述

以纯文本形式传递敏感数据可能会引发安全问题。此信息可在 AWS 管理控制台中或通过 AWS API 发现,例如 DescribeTaskDefinitionDescribeTasks

作为最佳安全做法,敏感信息会作为环境变量传递到容器。您可以通过在 ECS 任务定义的容器定义中引用存储在 AWS Systems Manager Parameter StoreAWS Secrets Manager 中的值,安全地将数据注入容器。然后,您可以将敏感信息以环境变量或容器日志配置的形式公开。

AWS 仅支持以下类型的数据注入:

解决方法

满足先决条件

1.    将您的敏感信息存储在 AWS Systems Manager Parameter Store 或 Secrets Manager 中。

对于 AWS Systems Manager Parameter Store,请运行以下命令:

aws ssm put-parameter --type SecureString --name awsExampleParameter --value awsExampleValue

对于 Secrets Manager,请运行以下命令:

aws secretsmanager create-secret --name awsExampleParameter --secret-string awsExampleValue

注意:Amazon ECS 容器代理使用任务执行 AWS Identity and Access Management (IAM) 角色从 AWS Systems Manager Parameter Store 或 Secrets Manager 中获取信息。任务执行 IAM 角色必须为以下操作授予权限:ssm:GetParameterssecretsmanager:GetSecretValuekms:Decrypt

2.    打开 IAM 控制台,然后为 ecs-tasks.amazonaws.com 创建一个具有信任关系的角色。例如:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3.    要在 IAM 控制台中为您的角色创建内嵌策略,请选择角色,选择您在第 2 步中创建的角色,然后在权限选项卡中选择添加内嵌策略。选择 JSON 选项卡,然后使用以下代码创建策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameters",
        "secretsmanager:GetSecretValue"
      ],
      "Resource": [
        "arn:aws:ssm:us-east-1:awsExampleAccountID:parameter/awsExampleParameter",
        "arn:aws:secretsmanager:us-east-1:awsExampleAccountID:secret:awsExampleParameter*"
      ]
    }
  ]
}

注意:请将 us-east-1awsExampleAccountID 替换为存储您的参数的 AWS 区域和账户。将 awsExampleParameter 替换为您在第 1 步中创建的参数的名称。

注意:如果您使用客户管理的 KMS 密钥加密 AWS Systems Manager Parameter Store 或 Secrets Manager 中的数据,则必须获取 kms:Decrypt 权限。

4.    (可选)向您在第 2 步中创建的角色附加托管策略 AmazonECSTaskExecutionRolePolicy

重要提示:对于使用存储在 Amazon Elastic Container Registry (Amazon ECR) 中的映像或将日志发送到 Amazon CloudWatch 的任务,需要托管策略。

在 ECS 任务定义中引用敏感信息

在 AWS 管理控制台中:

1.    打开 Amazon ECS 控制台

2.    从导航窗格中,选择任务定义,然后选择新建任务定义

3.    选择您的启动类型,然后选择下一步

4.    在任务执行角色部分,选择您之前创建的任务执行 IAM 角色。

5.    在容器定义部分,选择添加容器

6.    在环境下的环境变量部分,对于,请为您的环境变量输入一个键。

7.    在下拉菜单中,选择 ValueFrom

8.    在键文本框中,输入 Parameter Store 或 Secrets Manager 资源的 Amazon 资源名称 (ARN)。

注意:您也可以在日志驱动程序中指定密钥。

在 AWS 命令行界面 (AWS CLI) 中:

注意:如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI

1.    使用密钥部分,在任务定义中将 AWS Systems Manager Parameter Store 或 Secrets Manager 资源作为环境变量引用,或使用 secretOptions 部分将其作为日志配置选项引用。例如:

{
  "requiresCompatibilities": [
    "EC2"
  ],
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "web",
      "image": "httpd",
      "memory": 128,
      "essential": true,
      "portMappings": [
        {
          "containerPort": 80,
          "protocol": "tcp"
        }
      ],
      "logConfiguration": {
        "logDriver": "splunk",
        "options": {
          "splunk-url": "https://sample.splunk.com:8080"
        },
        "secretOptions": [
          {
            "name": "splunk-token",
            "valueFrom": "arn:aws:secretsmanager:us-east-1:awsExampleAccountID:secret:awsExampleParameter"
          }
        ]
      },
      "secrets": [
        {
          "name": "DATABASE_PASSWORD",
          "valueFrom": "arn:aws:ssm:us-east-1:awsExampleAccountID:parameter/awsExampleParameter"
        }
      ]
    }
  ],
  "executionRoleArn": "arn:aws:iam::awsExampleAccountID:role/awsExampleRoleName"
}

重要提示:请将 us-east-1awsExampleAccountID 替换为您的 AWS 区域和账户 ID。使用您之前创建的参数替换 awsExampleParameter。使用您之前创建的角色替换 awsExampleRoleName

2.    要注册任务定义,请运行以下命令:

aws ecs register-task-definition --family-name yourTaskDefinitionFamily --cli-input-json file://pathToYourJsonFile

使用您创建的任务定义启动任务时,Amazon ECS 容器代理会自动解析密钥,并将值作为环境变量注入容器。

重要提示:敏感数据会在容器初次启动时注入您的容器。如果更新或轮换了密钥或 Parameter Store 参数,则容器不会自动收到更新后的值。您必须启动新任务。如果您的任务是服务的一部分,请更新服务,并使用强制使用新部署选项强制服务启动新任务。

强制执行新部署:

1.    打开 Amazon ECS 控制台

2.    选择集群,然后选择与您的服务结合使用的集群。

3.    选择强制使用新部署复选框,然后选择更新服务

注意:要通过 AWS CLI 强制运行新部署,请运行带 --force-new-deployment 标志的 update-service 命令。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?