任务的 IAM 角色 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

任务的 IAM 角色

您的 Amazon ECS 任务可以具有与其关联的 IAM 角色。在 IAM 角色中被授予的权限由任务中运行的容器承担。

如果您的容器化应用程序需要调用 Amazon API,它们必须使用 Amazon 凭证签署其 Amazon API 请求,并且任务 IAM 角色提供了一个管理凭证的策略以供应用程序使用,类似于 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式。您可以将 IAM 角色与 Amazon ECS 任务定义或 RunTask API 操作关联,而不是为容器创建和分配 Amazon 凭证或使用 Amazon EC2 实例的角色。之后,您的容器可以使用 Amazon 开发工具包或 Amazon CLI 向授权的 Amazon 服务发出 API 请求。

下面介绍了在任务中使用 IAM 角色的好处。

  • 凭证隔离:容器只能检索其所属的任务定义中定义的 IAM 角色的凭证;容器永远无法访问用于属于另一个任务的其他容器的凭证。

  • 授权:未经授权的容器无法访问为其他任务定义的 IAM 角色凭证。

  • 可审核性:可通过 CloudTrail 进行访问和事件日志记录以确保可追溯性审核。任务凭证具有连接到会话的 taskArn 的上下文,因此 CloudTrail 会显示哪个任务使用了哪个角色。

注意

为任务指定 IAM 角色时,该任务的容器中的 Amazon CLI 或其他开发工具包只使用该任务角色提供的 Amazon 凭证,它们不再从 Amazon EC2 或它们运行所在的外部实例继承任何 IAM 权限。

您可以在任务定义中定义任务 IAM 角色,也可以在通过 RunTask API 操作手动运行任务时使用 taskRoleArn 覆盖。Amazon ECS 代理接收启动具有包含角色凭证的其他字段的任务的负载消息。Amazon ECS 代理将唯一的任务凭证 ID 设置为标识令牌并更新其内部凭证缓存,以便任务的标识令牌指向负载中接收的角色凭证。Amazon ECS 代理使用以下相关 URI 为属于此任务的所有容器填写 Env 对象(通过 docker inspect container_id 命令提供)中的 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 环境变量:/credential_provider_version/credentials?id=task_credential_id.

从容器内部,您可以使用以下命令查询凭据端点:

curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

输出:

{ "AccessKeyId": "ACCESS_KEY_ID", "Expiration": "EXPIRATION_DATE", "RoleArn": "TASK_ROLE_ARN", "SecretAccessKey": "SECRET_ACCESS_KEY", "Token": "SECURITY_TOKEN_STRING" }

如果 Amazon EC2 实例使用的容器代理的版本至少为 1.11.0,并且使用的 Amazon CLI 或开发工具包版本受支持,则开发工具包客户端将发现 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 变量可用,它将使用提供的凭证来调用 Amazon API。有关更多信息,请参阅 在 Amazon EC2 或外部实例上启用任务 IAM 角色使用支持的 Amazon 开发工具包

当使用凭证提供程序时,请求将本地记录在以下位置的主机容器实例中:/var/log/ecs/audit.log.YYYY-MM-DD-HH。有关更多信息,请参阅任务凭证审核日志的 IAM 角色

重要

创建任务 IAM 角色时,建议您在信任关系或与角色关联的 IAM policy 中使用 aws:SourceAccountaws:SourceArn 条件键,以防止混淆代理安全问题。这些条件键可以在信任关系中或与角色关联的 IAM policy 中指定。要了解更多关于混淆代理问题以及如何保护您的 Amazon 账户的信息,请参阅《IAM 用户指南》中的混淆代理问题

Amazon EC2 实例上托管的任务的注意事项

将 IAM 角色用于在 Amazon EC2 实例上运行的任务时,容器将无法访问通过 Amazon EC2 实例元数据服务器提供给 Amazon EC2 实例配置文件的凭证。建议您将容器实例角色中的权限限制在 AmazonEC2ContainerServiceforEC2Role 托管 IAM policy 中使用的最低权限列表的范围内。有关更多信息,请参阅Amazon ECS 容器实例 IAM 角色

为 Amazon EC2 实例上托管的任务使用任务 IAM 角色时,还应考虑以下因素。

  • 要防止使用 awsvpc 网络模式的任务运行的容器访问提供给 Amazon EC2 实例配置文件的凭证信息(同时仍允许任务角色提供的权限),请将代理配置文件中的 ECS_AWSVPC_BLOCK_IMDS 代理配置变量设置为 true,然后重新启动代理。有关更多信息,请参阅Amazon ECS 容器代理配置

  • 通过在 Amazon EC2 实例上运行以下 iptables 命令,阻止使用 bridge 网络模式的任务运行的容器访问提供给 Amazon EC2 实例配置文件的凭证信息,同时仍允许任务角色提供的权限。此命令不影响使用 hostawsvpc 网络模式的任务中的容器。有关更多信息,请参阅网络模式

    sudo yum install -y iptables-services; sudo iptables --insert DOCKER-USER 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP

    您必须将此 iptables 规则保存到 Amazon EC2 实例上,使其在重启后仍然可用。使用经 Amazon ECS 优化的 AMI,您可以使用以下命令。对于其他操作系统,请参阅该操作系统的相关文档。

    sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables

在 Amazon EC2 或外部实例上启用任务 IAM 角色

Amazon EC2 或外部实例需要至少为 1.11.0 版的容器代理才能启用任务 IAM 角色;但建议使用最新的容器代理版本。有关检查您的代理版本并更新到最新版本的信息,请参阅更新 Amazon ECS 容器代理。如果您正在使用经 Amazon ECS 优化的 AMI,您的实例将需要至少为 1.11.0-1 版的 ecs-init 程序包。如果您的实例使用最新的经 Amazon ECS 优化的 AMI,则这些实例将包含所需版本的容器代理和 ecs-init。有关更多信息,请参阅经 Amazon ECS 优化的 AMI

如果对容器实例使用的不是经 Amazon ECS 优化的 AMI,请务必将 --net=host 选项添加到docker run 命令,该命令会为所需配置启动代理和以下代理配置变量(有关更多信息,请参阅 Amazon ECS 容器代理配置):

ECS_ENABLE_TASK_IAM_ROLE=true

为具有 bridgedefault 网络模式的容器启用任务的 IAM 角色。

ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true

为具有 host 网络模式的容器启用任务的 IAM 角色。此变量仅在代理版本 1.12.0 和更高版本上受支持。

有关示例运行命令,请参阅手动更新 Amazon ECS 容器代理(适用于非经 Amazon ECS 优化的 AMI)。您还需要在容器实例上设置以下联网命令,以便任务中的容器可以检索其 Amazon 凭证:

sudo sysctl -w net.ipv4.conf.all.route_localnet=1 sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679

您必须将这些 iptables 规则保存到容器实例,使其在重启后仍然可用。您可以使用 iptables-saveiptables-restore 命令保存 iptables 规则并在启动时还原它们。有关更多信息,请查阅您的特定操作系统文档。

为任务创建 IAM 角色和策略

在创建供任务使用的 IAM policy 时,该策略应包括您希望任务中的容器承担的权限。您可以使用现有 Amazon 托管策略作为示例,或者您可以从头开始创建满足特定需求的自定义策略。有关更多信息,请参阅 IAM 用户指南 中的创建 IAM policy

重要

创建任务 IAM 角色时,建议您在信任关系或与角色关联的 IAM policy 中使用 aws:SourceAccountaws:SourceArn 条件键,以防止混淆代理安全问题。这些条件键可以在信任关系中或与角色关联的 IAM policy 中指定。要了解更多关于混淆代理问题以及如何保护您的 Amazon 账户的信息,请参阅《IAM 用户指南》中的混淆代理问题

创建 IAM policy 后,您可以创建 IAM 角色,其中包括您在 Amazon ECS 任务定义中引用的策略。您可以在 IAM 控制台中使用 Elastic Container Service 任务使用案例创建该角色。然后,可以将您特定的 IAM policy 附加到该角色,该策略为任务中的容器提供所需的权限。以下过程说明如何执行此操作。

如果您有多个需要 IAM 权限的任务定义或服务,则应考虑为每个特定的任务定义或服务创建一个具有所需最低权限的角色以便任务进行操作,以便您能够将为每个任务提供的访问权限降到最低。

有关您所在地区的服务端点的信息,请参阅 Amazon Web Services 一般参考指南中的服务端点

IAM 任务角色必须具有指定 ecs-tasks.amazonaws.com 服务的信任策略。sts:AssumeRole 权限允许您的任务承担与 Amazon EC2 实例使用的不同的 IAM 角色。这样,您的任务不会继承与 Amazon EC2 实例关联的角色。建议您使用 aws:SourceAccountaws:SourceArn 条件键进一步限制权限范围,以防止混淆代理安全问题。这些条件键可以在信任关系中或与角色关联的 IAM policy 中指定。要了解更多关于混淆代理问题以及如何保护您的 Amazon 账户的信息,请参阅《IAM 用户指南》中的混淆代理问题

以下是信任策略的示例。您应该替换区域标识符并指定启动任务时使用的 Amazon 账号。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":[ "ecs-tasks.amazonaws.com" ] }, "Action":"sts:AssumeRole", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333" } } } ] }

为任务创建 IAM policy (Amazon Web Services Management Console)

在此示例中,我们将创建一个策略以允许对 Amazon S3 存储桶进行只读访问。您可以将数据库凭证或其他机密信息存储在存储桶中,您的任务中的容器可以从存储桶中读取凭证并将它们加载到应用程序中。

  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中选择 Policies (策略),然后选择 Create Policy (创建策略)

  3. 按照以下某个选项卡下的步骤操作,这些步骤介绍如何使用可视化编辑器或 JSON 编辑器。

Using the visual editor
  1. 对于 Service,选择 S3

  2. 对于 Actions (操作),展开 Read (读取) 选项,然后选择 GetObject

  3. 对于 Resources(资源),选择 Add ARN(添加 ARN)并输入 Amazon S3 存储桶的完整 Amazon Resource Name(ARN)。

  4. (可选)对于 Request conditions(请求条件),选择 Add condition(添加条件)。建议这样做以防止混淆代理安全问题。要了解更多关于混淆代理问题以及如何保护您的 Amazon 账户的信息,请参阅《IAM 用户指南》中的混淆代理问题

    1. 对于 Condition key(条件键),选择 aws:SourceAccountaws:SourceArn。有关这些全局条件键的更多信息,请参阅《IAM 用户指南》中的 Amazon 全局条件上下文键

    2. 对于 Operator(运算符),如果您指定了 aws:SourceAccount 条件键,请选择 StringEquals,如果指定了 aws:SourceArn 条件键,则选择 ArnLike

    3. 对于 Value(值),如果您指定了 aws:SourceAccount 条件键,请指定您的 Amazon 账户 ID,如果指定了 aws:SourceArn 条件键,则指定 Amazon ECS 任务的 Amazon Resource Name(ARN)。您可以使用通配符。例如 aws:ecs:*:accountId:*,它将作用于您账户中的所有任务。

    4. 选择 Add(添加)以保存条件键。对要添加到策略的每个条件键重复这些步骤。

  5. 选择 Next: Tags(下一步:标签),然后向策略添加任何资源标签以帮助您组织它们,然后选择 Next: Review(下一步:审核)。

  6. Review policy (审核策略) 页面上,对于 Name (名称),键入您自己的唯一名称,例如 AmazonECSTaskS3BucketPolicy。您也可以为策略指定可选描述。

  7. 策略完成后,选择 Create policy(创建策略)完成操作。

Using the JSON editor
  1. 在 policy document(策略文档)字段中,粘贴要应用于任务的策略。以下示例授予对 my-task-secrets-bucket Amazon S3 存储桶的权限。它包括一个条件声明,您可以使用该声明使用其 Amazon Resource Name(ARN)或特定账户 ID 指定特定任务。这提供了进一步限制权限范围以获得额外安全性的方法。建议这样做以防止混淆代理安全问题。要了解更多关于混淆代理问题以及如何保护您的 Amazon 账户的信息,请参阅《IAM 用户指南》中的混淆代理问题

    下面是示例权限策略。您可以修改策略以满足您的特定需求。您应该替换区域标识符并指定启动任务时使用的 Amazon 账号。

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject" ], "Resource":[ "arn:aws:s3:::my-task-secrets-bucket/*" ], "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333" } } } ] }
  2. 选择 Next: Tags(下一步:标签),然后向策略添加任何资源标签以帮助您组织它们,然后选择 Next: Review(下一步:审核)。

  3. Review policy (审核策略) 页面上,对于 Name (名称),键入您自己的唯一名称,例如 AmazonECSTaskS3BucketPolicy。您也可以为策略指定可选描述。

  4. 策略完成后,选择 Create policy(创建策略)完成操作。

要为任务(Amazon Web Services Management Console)创建 IAM 角色

  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择 Roles(角色)和 Create role(创建角色)。

  3. Select trusted entity(选择受信任的实体)部分中,选择 Amazon 服务

  4. 对于Use Case(使用案例),使用下拉菜单,选择 Elastic Container Service,然后依次选择 Elastic Container Service Task(Elastic Container Service 任务)使用案例和 Next(下一步)。

  5. 对于 Add permissions(添加权限),搜索并选择要用于任务的策略(在此示例中为 AmazonECSTaskS3BucketPolicy),然后选择 Next(下一步)。

  6. Step 3: Name, review, and create(步骤 3:命名、查看和创建)中,请执行以下操作:

    1. 对于 Role name (角色名称),为您的角色输入一个名称。在此示例中,键入 AmazonECSTaskS3BucketRole 以给角色命名。

    2. (可选)对于 Description(描述),指定此 IAM 角色的描述。

    3. 查看角色的可信实体和权限策略。

    4. 对于 Add tags (Optional)(添加标签(可选)),输入要与 IAM 角色关联的任何元数据标签,然后选择 Create role(创建角色)。

使用支持的 Amazon 开发工具包

2016 年 7 月 13 日将对任务的 IAM 角色的支持添加到 Amazon 开发工具包中。您的任务中的容器必须使用在该日期或之后创建的 Amazon 开发工具包版本。AmazonLinux 分发版本的程序包管理器中包含的 开发工具包可能不是最新的,无法支持此功能。

为了确保您使用的是受支持的开发工具包,请在构建容器时按照适用于 Amazon Web Services 的工具中针对您的首选开发工具包的安装说明操作以获取最新版本。

为任务指定 IAM 角色

创建一个角色并向该角色附加策略后,您可以运行带入该角色的任务。您可通过多种方式执行此操作:

  • 在任务定义中为任务指定 IAM 角色。您可以创建新的任务定义或现有任务定义的新版本并指定您之前创建的角色。如果使用经典控制台创建任务定义,请在 Task Role(任务角色)字段中选择 IAM 角色。如果使用 Amazon CLI 或开发工具包,请使用 taskRoleArn 参数指定任务角色的 Amazon Resource Name(ARN)。有关更多信息,请参阅使用新控制台创建任务定义

    注意

    如果要在 Amazon ECS 服务中使用 IAM 任务角色,则需要此选项。

  • 在运行任务时指定 IAM 任务角色覆盖。您可以在运行任务时指定 IAM 任务角色覆盖。如果您使用经典控制台运行任务,请选择 Advanced Options(高级选项),然后在 Task Role(任务角色)字段中选择 IAM 角色。如果使用 Amazon CLI 或开发工具包,请使用 overrides JSON 对象中的 taskRoleArn 参数指定任务角色 ARN。有关更多信息,请参阅运行独立任务

注意

除了运行任务和服务所需的标准 Amazon ECS 权限外,IAM 用户还需要 iam:PassRole 权限,以使用 IAM 角色执行任务。