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

3 分钟阅读
0

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

简短描述

以明文形式传递敏感数据可能会导致出现安全问题,因为这些数据可在 AWS 管理控制台中或通过 AWS API(例如 DescribeTaskDefinitionDescribeTasks)发现。

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

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

解决方法

满足先决条件

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

对于 AWS Systems Manager Parameter Store,请运行以下命令。将 awsExampleParameter 替换为您自己的参数,并将 awsExampleValue 替换为您的安全值:

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

对于 Secrets Manager,请运行以下命令。将 awsExampleParameter 替换为您自己的参数,并将 awsExampleValue 替换为您的密钥值:

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 控制台中为您的角色创建内嵌策略,请选择 Roles(角色),选择您在第 2 步中创建的角色,然后在 Permissions(权限)选项卡中选择 Add inline policy(添加内嵌策略)。选择 JSON 选项卡,然后使用以下代码创建策略。请将 us-east-1awsExampleAccountID 分别替换为存储您的参数的 AWS 区域和账户。将 awsExampleParameter 替换为您在第 1 步中创建的参数的名称:

{
  "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*"
      ]
    }
  ]
}

**注意:**如果您使用客户管理的 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.    在 Value(值)下拉列表中,选择 ValueFrom

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

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

在 AWS Command Line Interface (AWS CLI) 中:

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

1.    使用 secrets 部分,在任务定义中将 AWS Systems Manager Parameter Store 或 Secrets Manager 资源作为环境变量引用,或使用 secretOptions 部分将其作为日志配置选项引用。在以下示例中,请将 us-east-1awsExampleAccountID 分别替换为您的 AWS 区域和账户 ID。将 awsExampleParameter 替换为您之前创建的参数。将 awsExampleRoleName 替换为您之前创建的角色。

{
  "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"
}

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

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

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

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

要强制执行新部署,请执行以下操作:

1.    打开 Amazon ECS 控制台

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

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

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


相关视频

AWS 官方
AWS 官方已更新 2 年前