Amazon ECS-在Docker入口点上使用IAM角色时权限被拒绝

时间:2019-05-02 08:10:53

标签: amazon-web-services docker nginx amazon-ecs aws-parameter-store

我正在寻找一种将机密/证书注入Amazon ECS容器的方法。就我而言,这是一个简单的nginx容器。

我一直在使用AWS Parameter Store关注此帖子: https://aws.amazon.com/blogs/compute/managing-secrets-for-amazon-ecs-applications-using-parameter-store-and-iam-roles-for-tasks/

以下是基本要点:

  1. 在Dockerfile上,我在 entrypoint 上附加了一个脚本,该脚本用于安装AWS客户端并从AWS参数存储中获取密钥。

Dockerfile

FROM nginx:1.16.0

...
ENTRYPOINT ["/var/run/fetch.sh", "nginx", "-g", "daemon off;"]

fetch.sh

        aws ssm get-parameter \
            --name ${key} \
            --with-decryption \
            --region us-east-1 \
            --output text \
            --query Parameter.Value
  1. 任务定义假设一个IAM角色可以访问所需的服务(kms +参数存储)。我可以验证此方法是否有效,因为如果我通过SSH进入服务器并在容器上运行脚本,便能够从参数存储中获取密钥。
  {
    "portMappings": [
      {
        "hostPort": 0,
        "protocol": "tcp",
        "containerPort": 443
      }
    ],
    "cpu": 0,
    "environment": [],
    "mountPoints": [],
    "memoryReservation": 256,
    "memory": 512,
    "volumesFrom": [],
    "image": "url/some_image:latest",
    "essential": true,
    "name": "my-container"
  }
  1. ECS运行此任务时,应点击入口点,该入口将从参数存储中获取密钥并保存。

我能够通过docker exec手动运行正在运行的任务上的键,但是在启动任务时我无法获取它们(特别是当我将脚本附加到入口点上时,如上面的代码所示) 。

ECS任务是否可以在入口点访问IAM角色?它何时真正承担IAM角色?

1 个答案:

答案 0 :(得分:1)

您现在可以使用任务定义的secrets中的containerDefinitions轻松地从SSM或Secrets Manager注入秘密。使用此解决方案,您无需再运行/管理自定义脚本即可获取秘密。

它看起来像这样:

{
    "containerDefinitions": [{
        "secrets": [{
            "name": "environment_variable_name",
            "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf"
        }]
    }]
}
{
    "containerDefinitions": [{
        "secrets": [{
            "name": "environment_variable_name",
            "valueFrom": "arn:aws:ssm:region:aws_account_id:parameter/parameter_name"
        }]
    }]
}

看看AWS Launches Secrets Support for Amazon Elastic Container ServiceSpecifying Sensitive Data

您必须具有任务执行角色,并在任务定义中引用它。政策示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameters",
        "secretsmanager:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:ssm:<region>:<aws_account_id>:parameter/parameter_name",
        "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:secret_name",
        "arn:aws:kms:<region>:<aws_account_id>:key/key_id"
      ]
    }
  ]
}

Required IAM Permissions for Amazon ECS Secrets中的更多信息。