我将 Amazon Elastic Container Service (Amazon ECS) 配置为访问敏感信息,例如数据库凭证或 API 密钥。我想安全地管理和检索非硬编码的密钥。
解决方法
要管理非硬编码的密钥和访问密钥,请使用 AWS Secrets Manager 或 Parameter Store(AWS Systems Manager 的一项功能)。
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
创建密钥
要创建密钥,请使用 Secrets Manager 控制台或 AWS CLI。要使用 Parameter Store 存储密钥,请运行以下 put-parameter 命令:
aws ssm put-parameter --type SecureString --name awsExampleParameter --value awsExampleValue
**注意:**请将 awsExampleParameter 替换为您的参数,将 awsExampleValue 替换为您的密钥。
允许 Amazon ECS 任务访问您的密钥
Amazon ECS 使用 AWS Identity and Access Management (IAM) 任务执行角色从 Secrets Manager 或 Parameter Store 获取密钥信息。为具有所需的最低权限的角色创建 IAM 策略。如果使用 Secrets Manager,则 IAM 角色必须具有 secretsmanager:GetSecretValue 权限。如果使用 Parameter Store,则 IAM 角色必须具有 ssm:GetParameters 和 kms:Decrypt 权限。
Secrets Manager 策略示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "arn:aws:secretsmanager:region:account-id:secret:secret-name"
}
]
}
**注意:**请将 arn:aws:secretsmanager:region:account-id:secret:secret-name 替换为您的密钥 ARN。
Parameter Store 策略示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetParameter",
"ssm:GetParameters",
"ssm:GetParameterHistory"
],
"Resource": "arn:aws:ssm:region:account-id:parameter/parameter-name"
},
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "arn:aws:kms:region:account-id:key/kms-key-id"
}
]
}
**注意:**请将 arn:aws:ssm:region:account-id:parameter/parameter-name 替换为您的参数的 ARN,将 arn:aws:kms:region:account-id:key/kms-key-id 替换为您的 AWS Key Management Service (AWS KMS) 密钥。
将 IAM 策略附加到 Amazon ECS 任务执行角色。
访问您的 Amazon ECS 任务密钥
您可以将敏感数据(例如 API 密钥或凭证)作为参数或环境变量传递。首先,修改您的 Amazon ECS 任务定义,以包括您的环境变量或密钥映射。
任务定义中的密钥映射示例:
{
"name": "MY_SECRET",
"valueFrom": "arn:aws:secretsmanager:region:account-id:secret:secret-name"
}
然后,将环境变量传递给 Amazon ECS 容器。
任务定义中的 containerDefinitions 示例:
- name: my-container
environment:
- name: Example_PASSWORD
valueFrom: arn:aws:ssm:us-west-2:123456789012:parameter/my-app/example-password
使用 CI/CD 管理密钥
在持续集成和持续交付 (CI/CD) 部署期间,使用环境变量动态传递密钥。在部署脚本中,从 Secrets Manager 或 Parameter Store 获取密钥。不要在任务定义中对密钥进行硬编码。请改为使用参数或占位符。有关详细信息和最佳实践,请参阅 Strengthen the DevOps pipeline and protect data with AWS Secrets Manager, AWS KMS, and AWS Certificate Manager。
例如,如果您使用 AWS CodePipeline,请配置一个使用 AWS CLI 获取密钥的构建步骤:
bashCopy codeaws secretsmanager get-secret-value --secret-id secret-name --query 'SecretString' --output text
**注意:**请将 secret-name 替换为您的密钥。
对密钥管理问题进行故障排除
如果您在 Amazon ECS 中使用密钥时遇到问题,请执行以下操作:
-
确保 Amazon ECS 任务的 IAM 角色具有正确的 secretsmanager:GetSecretValue 或 ssm:GetParameter 权限。
-
如果您收到 Denied(拒绝)错误,请确保将 IAM 策略附加到正确的 Amazon ECS 任务执行角色。此外,请确保 IAM 策略的密钥 ARN 准确无误。
-
如果 Amazon ECS 无法获取密钥,请验证您使用的 AWS 区域和密钥是否正确。要测试密钥,请在 Amazon ECS 外部运行以下 get-secret-value 命令:
aws secretsmanager get-secret-value --secret-id secret-name --region region-code
**注意:**请将 secret-name 替换为您的密钥,将 region-code 替换为您的区域。