本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon ECS 任務 IAM 角色
您的 Amazon ECS 任務可以擁有與其關聯的 IAM 角色。在 IAM 角色中授予的許可是由任務中執行的容器承繼。此角色可讓您的應用程式程式碼 (在容器上) 使用其他 AWS 服務。當您的應用程式存取 Amazon S3 等其他服務時 AWS ,需要任務角色。
注意
Amazon ECS 容器和 Fargate 代理程式無法存取這些許可。如需 Amazon ECS 提取容器映像和執行任務所需的 IAM 許可,請參閱 Amazon ECS 任務執行 IAM 角色。
以下是使用任務角色的好處:
-
登入資料隔離:在 EC2 執行個體層級隔離任務登入資料。當每個任務透過 ECS 容器代理程式和執行個體中繼資料服務接收其定義 IAM 角色的登入資料時,在相同 EC2 執行個體上執行的任務可能會存取屬於該執行個體上其他任務的登入資料。對於需要更強隔離的工作負載,請考慮使用提供任務層級隔離的 Fargate。
-
授權:未經授權的容器無法存取為其他任務定義的 IAM 角色登入資料。
-
稽核:可透過 CloudTrail 存取和事件記錄,以確保回溯性稽核。任務憑證有連接到工作階段的
taskArn
內容,所以 CloudTrail 日誌會顯示哪個任務使用哪個角色。
注意
當您為任務指定 IAM 角色時, AWS CLI 或該任務容器中的其他 SDKs 只會使用任務角色提供的 AWS 登入資料,而不會再從其執行的 Amazon EC2 或外部執行個體繼承任何 IAM 許可。
建立任務 IAM 角色
為任務建立要使用的 IAM 政策時,該政策必須包含您希望任務中容器擔任的許可。您可以使用現有的 AWS 受管政策,也可以從頭開始建立符合您特定需求的自訂政策。如需詳細資訊,請參閱「IAM 使用者指南」中的建立 IAM 政策。
重要
針對 Amazon ECS 任務 (適用於所有啟動類型),建議在任務中使用 IAM 政策和角色。這些登入資料可讓您的任務在不呼叫 的情況下提出 AWS API 請求sts:AssumeRole
,以擔任已與任務相關聯的相同角色。如果任務需要自己擔任的角色,則必須建立信任政策,明確允許該角色擔任它自己。如需詳細資訊,請參閱《IAM 使用者指南》中的更新角色信任政策。
在建立 IAM 政策後,您可以建立 IAM 角色,其中包含在 Amazon ECS 任務定義中參考的政策。您可以在 IAM 主控台中使用 Elastic Container Service Task (Elastic Container Service 任務) 使用案例來建立角色。然後,您可以將特定 IAM 政策連接至角色,為任務中的容器提供所需的許可。以下程序說明如何執行此操作。
如果您有多個任務定義或服務需要 IAM 許可,您應該考慮為每個特定任務定義或服務建立具有操作任務所需最低許可的角色,以便將您為每項任務提供的存取降至最低。
如需 區域服務端點的相關資訊,請參閱《 Amazon Web Services 一般參考 指南》中的服務端點。
IAM 任務角色必須具有信任政策,該政策會指定 ecs-tasks.amazonaws.com
服務。sts:AssumeRole
許可允許您的任務承繼與 Amazon EC2 執行個體使用角色不同的 IAM 角色。如此一來,您的任務就不會沿用與 Amazon EC2 執行個體相關聯的角色。信任政策範例如下。取代區域識別符,並指定您在啟動任務時使用 AWS 的帳號。
重要
建立任務 IAM 角色時,建議您在與該角色相關聯的信任關係政策中使用 aws:SourceAccount
或 aws:SourceArn
條件索引鍵,進一步限制許可範圍,以防止混淆代理人安全問題。使用 aws:SourceArn
條件索引鍵來指定目前不受支援的特定叢集時,您應使用萬用字元來指定所有叢集。若要進一步了解混淆代理人問題以及如何保護 AWS 您的帳戶,請參閱《IAM 使用者指南》中的混淆代理人問題。
{ "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
" } } } ] }
使用下列程序建立政策,以使用範例政策從 Amazon S3 擷取物件。使用您自己的值取代所有使用者輸入
。
使用下列程序來建立 服務角色。
建立角色之後,請為角色新增下列功能的其他許可。
功能 | 額外許可 |
---|---|
使用 ECS Exec |
|
使用私有 Amazon ECR 儲存庫中的映像 | |
使用 EC2 執行個體 (Windows 和 Linux) | |
使用外部執行個體 | |
使用 Windows EC2 執行個體 |
Amazon ECR 許可
當您的應用程式程式碼需要直接與 Amazon ECR 儲存庫互動時,需要下列許可。請注意,對於您只需要從 Amazon ECR 提取映像的基本實作,任務 IAM 角色層級不需要這些許可。相反地,Amazon ECS 任務執行角色應該具有這些許可。如需任務執行角色的詳細資訊,請參閱「Amazon ECS 任務執行 IAM 角色」。
如果您在容器中執行的應用程式程式碼需要直接與 Amazon ECR APIs 互動,您應該將下列許可新增至任務 IAM 角色,並在任務定義中包含任務 IAM 角色。如需詳細資訊,請參閱《IAM 使用者指南》中的新增和移除 IAM 政策。
針對您的任務 IAM 角色使用下列政策,為需要直接與 Amazon ECR 互動的容器應用程式新增必要的 Amazon ECR 許可:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer", "ecr:GetAuthorizationToken" ], "Resource": "*" } ] }
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 政策所使用的最小許可清單。
您的 Amazon EC2 執行個體需要至少 版1.11.0
的容器代理程式才能使用任務角色;不過,我們建議您使用最新的容器代理程式版本。如需檢查代理程式版本及更新至最新版本的資訊,請參閱「更新 Amazon ECS 容器代理程式」。如果您使用 Amazon ECS 最佳化 AMI,您的執行個體至少需要 1.11.0-1
ecs-init
套件。如果執行個體使用最新的 Amazon ECS 最佳化 AMI,則它們會包含所需的容器代理程式和 ecs-init
。如需詳細資訊,請參閱Amazon ECS 最佳化 Linux AMIs。
如果您不是為容器執行個體使用 Amazon ECS 最佳化 AMI,請將 --net=host
選項新增至啟動代理程式的docker run命令,以及所需組態的下列代理程式組態變數 (如需詳細資訊,請參閱 Amazon ECS 容器代理程式組態):
ECS_ENABLE_TASK_IAM_ROLE=true
-
為具有
bridge
和default
網路模式之容器的任務使用 IAM 角色。 ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
-
為具有
host
網路模式之容器的任務使用 IAM 角色。僅代理 1.12.0 版和更新版本支援此變數。
如需執行命令範例,請參閱「手動更新 Amazon ECS 容器代理程式 (適用於非 Amazon ECS 最佳化 AMI)」。您也需要在容器執行個體上設定下列聯網命令,以便任務中的容器可以擷取其 AWS 登入資料:
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-save 和 iptables-restore 命令來儲存 iptables 規則以及在啟動時將其還原。如需詳細資訊,請參閱特定的作業系統文件。
針對任務中採用 awsvpc
網路模式的容器,如欲避免其存取提供給 Amazon EC2 執行個體設定檔的憑證資訊 (同時仍然允許任務角色所提供的許可),請在代理程式組態檔案中將 ECS_AWSVPC_BLOCK_IMDS
代理程式組態變數設定為 true
,並重新啟動代理程式。如需詳細資訊,請參閱Amazon ECS 容器代理程式組態。
至於任務中採用 bridge
網路模式的容器,則可在 Amazon EC2 執行個體上執行下列 iptables 命令,藉此避免其存取提供給 Amazon EC2 執行個體設定檔的憑證資訊 (同時仍然允許任務角色所提供的許可)。此命令不會影響任務中採用 host
或 awsvpc
網路模式的容器。如需詳細資訊,請參閱網路模式。
-
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,您的執行個體至少需要 ecs-init
套件的 1.11.0-1
版。如果執行個體使用最新的 Amazon ECS 最佳化 AMI,則它們會包含所需的容器代理程式和 ecs-init
。如需詳細資訊,請參閱Amazon ECS 最佳化 Linux AMIs。
如果您不是為容器執行個體使用 Amazon ECS 最佳化 AMI,請將 --net=host
選項新增至啟動代理程式的docker run命令,以及所需組態的下列代理程式組態變數 (如需詳細資訊,請參閱 Amazon ECS 容器代理程式組態):
ECS_ENABLE_TASK_IAM_ROLE=true
-
為具有
bridge
和default
網路模式之容器的任務使用 IAM 角色。 ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
-
為具有
host
網路模式之容器的任務使用 IAM 角色。僅代理 1.12.0 版和更新版本支援此變數。
如需執行命令範例,請參閱「手動更新 Amazon ECS 容器代理程式 (適用於非 Amazon ECS 最佳化 AMI)」。您也需要在容器執行個體上設定下列聯網命令,以便任務中的容器可以擷取其 AWS 登入資料:
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-save 和 iptables-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
如果您執行只有命令 shell 的 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. 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