如何将密钥或敏感信息安全传递到 Amazon ECS 任务中的容器?
我想将密钥或敏感信息安全传递到 Amazon Elastic Container Service (Amazon ECS) 任务中的容器。
简短描述
以明文形式传递敏感数据可能会导致出现安全问题,因为这些数据可在 AWS 管理控制台中或通过 AWS API(例如 DescribeTaskDefinition 或 DescribeTasks)发现。
最佳安全实践是,将敏感信息作为环境变量传递到容器。您可以通过在 Amazon ECS 任务定义的容器定义中引用存储在 AWS Systems Manager Parameter Store 或 AWS Secrets Manager 中的值,安全地将数据注入容器。然后,您可以将敏感信息以环境变量或容器日志配置的形式公开。
AWS 仅支持以下类型的数据注入:
- 使用 AWS Fargate 平台版本 1.3.0 或更高版本与 AWS Fargate 启动类型的任务
- 使用 amazon-ecs-agent 版本 1.22.0 或更高版本与 Amazon Elastic Compute Cloud (Amazon EC2) 启动类型的容器实例
解决方法
满足先决条件
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:GetParameters、secretsmanager:GetSecretValue 和 kms: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-1 和 awsExampleAccountID 分别替换为存储您的参数的 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-1 和 awsExampleAccountID 分别替换为您的 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 官方已更新 4 年前
- AWS 官方已更新 2 个月前
- AWS 官方已更新 3 年前
- AWS 官方已更新 7 个月前