如何管理 Amazon ECS 任务和服务的密钥和访问密钥?

2 分钟阅读
0

我将 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:GetParameterskms: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:GetSecretValuessm: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 替换为您的区域。

AWS 官方
AWS 官方已更新 5 个月前