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

Amazon ECS 任务 IAM 角色

您的 Amazon ECS 任务可以具有与其关联的 IAM 角色。在 IAM 角色中被授予的权限由任务中运行的容器承担。此角色允许您的应用程序代码(在容器上)使用其他 Amazon 服务。当您的应用程序访问其他 Amazon 服务(例如 Amazon S3)时需要任务角色。有关 Amazon ECS 提取容器映像和运行任务所需的 IAM 权限,请参阅 Amazon ECS 任务执行 IAM 角色

使用任务角色有以下好处:

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

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

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

注意

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

创建任务 IAM 角色

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

重要

对于 Amazon ECS 任务(适用于所有启动类型),我们建议您为任务使用 IAM policy 和角色。这些凭证允许您的任务在不调用 sts:AssumeRole 的情况下发出 Amazon API 请求,以担任已与任务关联的相同角色。如果您的任务需要能代入自己的角色,则必须创建明确允许该角色代入自己的信任策略。有关更多信息,请参阅《IAM 用户指南》中修改角色信任策略

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

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

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

IAM 任务角色必须具有指定 ecs-tasks.amazonaws.com 服务的信任策略。sts:AssumeRole 权限允许您的任务承担与 Amazon EC2 实例使用的不同的 IAM 角色。这样,您的任务不会继承与 Amazon EC2 实例关联的角色。以下是信任策略的示例。替换区域标识符并指定启动任务时使用的 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 角色时,建议您在信任关系或与角色关联的 IAM 策略中使用 aws:SourceAccountaws:SourceArn 条件键进一步限制权限范围,以防止混淆代理安全问题。使用 aws:SourceArn 条件键指定当前不受支持的特定集群时,应使用通配符来指定所有集群。要了解更多关于混淆代理问题以及如何保护您的 Amazon 账户的信息,请参阅《IAM 用户指南》中的混淆代理问题

以下过程通过示例策略介绍如何创建策略,以从 Amazon S3 检索对象。将所有用户输入替换为您自己的值。

Amazon Web Services Management Console
使用 JSON 策略编辑器创建策略
  1. 登录Amazon Web Services Management Console,然后通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在左侧的导航窗格中,选择策略

    如果这是您首次选择策略,则会显示欢迎访问托管式策略页面。选择开始使用

  3. 在页面的顶部,选择创建策略

  4. 策略编辑器部分,选择 JSON 选项。

  5. 输入以下 JSON 策略文档:

    { "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:region:123456789012:*" }, "StringEquals":{ "aws:SourceAccount":"123456789012" } } } ] }
  6. 选择下一步

    注意

    您可以随时在可视化JSON 编辑器选项卡之间切换。不过,如果您进行更改或在可视化编辑器中选择下一步,IAM 可能会调整策略结构以针对可视化编辑器进行优化。有关更多信息,请参阅《IAM 用户指南》中的调整策略结构

  7. 查看并创建页面上,为您要创建的策略输入策略名称描述(可选)。查看此策略中定义的权限以查看策略授予的权限。

  8. 选择创建策略可保存新策略。

Amazon CLI

将所有用户输入替换为您自己的值。

  1. 使用以下内容创建名为 s3-policy.json 的文件。

    { "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:region:123456789012:*" }, "StringEquals":{ "aws:SourceAccount":"123456789012" } } } ] }
  2. 使用以下命令通过 JSON 策略文档文件创建 IAM 策略。

    aws iam create-policy \ --policy-name taskRolePolicy \ --policy-document file://s3-policy.json

以下过程介绍如何通过附加您创建的 IAM 策略来创建任务 IAM 角色。

Amazon Web Services Management Console
为 Elastic Container Service 创建服务角色(IAM 控制台)
  1. 登录Amazon Web Services Management Console,然后通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在 IAM 控制台的导航窗格中,选择角色,然后选择创建角色

  3. 对于 Trusted entity type(可信实体类型),选择 Amazon Web Services 服务

  4. 对于服务或使用案例,选择 Elastic Container Service,然后选择 Elastic Container Service 任务使用案例。

  5. 选择下一步

  6. 对于添加权限,搜索并选择您创建的策略。

  7. 选择下一步

  8. 对于角色名称,请为您的角色输入一个名称。在此示例中,键入 AmazonECSTaskS3BucketRole 以给角色命名。

  9. 检查该角色,然后选择创建角色

Amazon CLI

将所有用户输入替换为您自己的值。

  1. 创建一个名为 ecs-tasks-trust-policy.json 的文件,其中包含要用于 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" } } } ] }
  2. 使用上一步中创建的信任策略创建命名为 ecsTaskRole 的 IAM 角色。

    aws iam create-role \ --role-name ecsTaskRole \ --assume-role-policy-document file://ecs-tasks-trust-policy.json
  3. 使用以下命令检索您创建的 IAM 策略的 ARN。将 taskRolePolicy 替换为您创建的策略的名称。

    aws iam list-policies --scope Local --query 'Policies[?PolicyName==`taskRolePolicy`].Arn'
  4. 将创建的 IAM 策略其附加到 ecsTaskRole 角色。将 policy-arn 替换为所创建策略的 ARN。

    aws iam attach-role-policy \ --role-name ecsTaskRole \ --policy-arn arn:aws:iam:111122223333:aws:policy/taskRolePolicy

创建该角色后,为该角色添加以下功能的附加权限。

功能 其他权限

使用 ECS Exec

ECS Exec 权限

使用 EC2 实例(Windows 和 Linux)

Amazon EC2 实例附加配置

使用外部实例

外部实例附加配置

使用 Windows EC2 实例

Amazon EC2 Windows 实例附加配置

ECS Exec 权限

ECS Exec 功能需要一个任务 IAM 角色来授予容器在托管 SSM 代理(execute-command 代理)和 SSM 服务之间进行通信所需的权限。您应向任务 IAM 角色添加以下权限,并在任务定义中包含任务 IAM 角色。有关更多信息,请参阅 IAM 用户指南中的添加和删除 IAM 策略

对于您的任务 IAM 角色使用以下策略来添加所需的 SSM 权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }

Amazon EC2 实例附加配置

建议您将容器实例角色中的权限限制在 AmazonEC2ContainerServiceforEC2Role 托管 IAM policy 中使用的最低权限列表的范围内。

Amazon EC2 需要至少为版本 1.11.0 的容器代理才能使用任务角色;但建议使用最新的容器代理版本。有关检查您的代理版本并更新到最新版本的信息,请参阅更新 Amazon ECS 容器代理。如果您使用经 Amazon ECS 优化的 AMI,您的实例需要至少为 1.11.0-1 版的 ecs-init 程序包。如果您的实例使用最新的经 Amazon ECS 优化的 AMI,则这些实例将包含所需版本的容器代理和 ecs-init。有关更多信息,请参阅 经 Amazon ECS 优化的 Linux 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 规则并在启动时还原它们。有关更多信息,请查阅您的特定操作系统文档。

要防止使用 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

外部实例附加配置

外部实例需要至少为版本 1.11.0 的容器代理才能使用任务 IAM 角色;但建议使用最新的容器代理版本。有关检查您的代理版本并更新到最新版本的信息,请参阅更新 Amazon ECS 容器代理。如果您正在使用经 Amazon ECS 优化的 AMI,您的实例将需要至少为 1.11.0-1 版的 ecs-init 程序包。如果您的实例使用最新的经 Amazon ECS 优化的 AMI,则这些实例将包含所需版本的容器代理和 ecs-init。有关更多信息,请参阅 经 Amazon ECS 优化的 Linux 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 规则并在启动时还原它们。有关更多信息,请查阅您的特定操作系统文档。

Amazon EC2 Windows 实例附加配置

重要

这仅适用于 EC2 上使用任务角色的 Windows 容器。

具有 Windows 功能的任务角色需要在 EC2 上进行附加配置。

  • 在启动容器实例时,您必须在容器实例用户数据脚本中设置 -EnableTaskIAMRole 选项。EnableTaskIAMRole 为任务打开任务 IAM 角色功能。例如:

    <powershell> Import-Module ECSTools Initialize-ECSAgent -Cluster 'windows' -EnableTaskIAMRole </powershell>
  • 您必须使用Amazon ECS 容器引导脚本中提供的联网命令来引导容器。

  • 您必须为任务创建 IAM 角色和策略。有关更多信息,请参阅 创建任务 IAM 角色

  • 任务的 IAM 角色凭证提供程序在容器实例上使用端口 80。因此,如果在容器实例上配置任务的 IAM 角色,则容器无法将端口 80 用于任何端口映射中的主机端口。要在端口 80 上公开容器,建议您为这些容器配置一个使用负载平衡功能的服务。您可以在负载均衡器上使用端口 80。通过这样做,可以将流量传送到容器实例上的另一个主机端口。有关更多信息,请参阅 使用负载均衡分配 Amazon ECS 服务流量

  • 如果重新启动 Windows 实例,则必须删除代理接口并再次初始化 Amazon ECS 容器代理以备份凭证代理。

Amazon ECS 容器引导脚本

必须先使用所需的联网命令引导容器,然后容器才能访问容器实例上的凭证代理来获得凭证。当容器启动时,应在容器上运行以下代码示例脚本。

注意

在 Windows 上使用 awsvpc 网络模式时,不需要运行此脚本。

如果您运行包含 Powershell 的 Windows 容器,请使用以下脚本:

# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You may # not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either # express or implied. See the License for the specific language governing # permissions and limitations under the License. $gateway = (Get-NetRoute | Where { $_.DestinationPrefix -eq '0.0.0.0/0' } | Sort-Object RouteMetric | Select NextHop).NextHop $ifIndex = (Get-NetAdapter -InterfaceDescription "Hyper-V Virtual Ethernet*" | Sort-Object | Select ifIndex).ifIndex New-NetRoute -DestinationPrefix 169.254.170.2/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # credentials API New-NetRoute -DestinationPrefix 169.254.169.254/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # metadata API

如果您运行的 Windows 容器只有命令 shell,请使用以下脚本:

# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You may # not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either # express or implied. See the License for the specific language governing # permissions and limitations under the License. for /f "tokens=1" %i in ('netsh interface ipv4 show interfaces ^| findstr /x /r ".*vEthernet.*"') do set interface=%i for /f "tokens=3" %i in ('netsh interface ipv4 show addresses %interface% ^| findstr /x /r ".*Default.Gateway.*"') do set gateway=%i netsh interface ipv4 add route prefix=169.254.170.2/32 interface="%interface%" nexthop="%gateway%" store=active # credentials API netsh interface ipv4 add route prefix=169.254.169.254/32 interface="%interface%" nexthop="%gateway%" store=active # metadata API