本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon ECS 任務 IAM 角色
您的 Amazon ECS 任務可以擁有與其關聯的 IAM 角色。IAM 角色中授予的許可將指派給任務中執行的容器。此角色可讓您的應用程式程式碼 (在容器中執行) 使用其他 AWS 服務。當您的應用程式存取 Amazon S3 等其他服務時 AWS ,需要任務角色。
注意
Amazon ECS 容器與 Fargate 代理程式無法存取這些許可。如需 Amazon ECS 提取容器映像和執行任務所需的 IAM 許可,請參閱 Amazon ECS 任務執行 IAM 角色。
以下為使用任務角色的優勢:
-
問題分離:如果使用的是 EC2,任務 IAM 角色可讓您指定容器的 IAM 許可,無需使用這些 EC2 執行個體設定檔來指定這些許可 (如需詳細資訊,請參閱 AWS Identity and Access Management User Guide 中的 Using instance profiles)。因此,您可以在 ECS 容器執行個體上獨立且統一地部署應用程式,無需修改與 EC2 執行個體相關聯的 IAM 許可。
-
可稽核性:可透過 CloudTrail 取得存取與事件記錄,確保可回顧性稽核。任務憑證有連接到工作階段的 "
taskArn" 內容,所以 CloudTrail 日誌會顯示角色憑證是為哪個任務所授予。 -
統一憑證交付:ECS 會將 IAM 角色憑證交付至您的容器,使其能透過妥善定義的介面進行存取,不受與任務相關聯的運算選項影響。在 ECS Fargate 上,EC2 執行個體設定檔不適用於任務中的容器。當您在容器中使用 AWS SDK 或 CLI 時,任務 IAM AWS 角色可讓您將 IAM 許可與容器建立關聯,而不論運算選項為何。如需 AWS 開發套件如何存取這些登入資料的詳細資訊,請參閱容器登入資料提供者。
重要
容器本身並非安全界限,使用任務 IAM 角色也不會改變此本質。每個在 Fargate 上執行的任務都有專用的隔離界限,並且不會與另一個任務共用底層核心、CPU 資源、記憶體資源或彈性網路介面。在 ECS 上的 EC2 與外部容器執行個體中,沒有任務隔離 (這與 Fargate 不同),因此容器可能會存取同一容器執行個體上其他任務的憑證。這些容器也可以存取指派給 ECS 容器執行個體角色的許可。遵循角色建議中的建議,封鎖對容器 Amazon EC2 執行個體中繼資料服務的存取 (如需詳細資訊,請參閱 Amazon EC2 User Guide 中的 Use the Instance Metadata Service to access instance metadata)。
請注意,當您為任務指定 IAM 角色時,該任務容器中的 AWS CLI 或其他 SDKs 只會使用任務角色提供的 AWS 登入資料,而不會從其執行的 Amazon EC2 或外部執行個體繼承任何 IAM 許可。
建立任務 IAM 角色
為任務建立要使用的 IAM 政策時,政策必須包含您希望任務中的容器擔任的許可。您可以使用現有的 AWS 受管政策,也可以從頭開始建立符合您特定需求的自訂政策。如需詳細資訊,請參閱「IAM 使用者指南」中的建立 IAM 政策。
重要
針對 Amazon ECS 任務 (適用於所有啟動類型),建議在任務中使用 IAM 政策和角色。這些登入資料可讓您的任務提出 AWS API 請求,而無需呼叫 sts:AssumeRole來擔任已與任務相關聯的相同角色。如果任務需要自己擔任的角色,則必須建立信任政策,明確允許該角色擔任它自己。如需詳細資訊,請參閱 IAM User Guide 中的 Updating a role trust policy。
在建立 IAM 政策後,您可以建立 IAM 角色,其中包含在 Amazon ECS 任務定義中參考的政策。您可以在 IAM 主控台中使用 Elastic Container Service Task (Elastic Container Service 任務) 使用案例來建立角色。然後,您可以將特定的 IAM 政策連接至該角色,藉此授予任務中的容器您所需的許可。以下程序說明如何執行此操作。
如果您有多個任務定義或服務需要 IAM 許可,您應該考慮為每個特定任務定義或服務建立具有操作任務所需最低許可的角色,以便將您為每項任務提供的存取降至最低。
如需有關所在區域的服務端點的資訊,請參閱 Amazon Web Services 一般參考 Guide 中的 Service endpoints。
IAM 任務角色必須具有信任政策,該政策會指定 ecs-tasks.amazonaws.com 服務。sts:AssumeRole 許可允許您的任務承繼與 Amazon EC2 執行個體使用角色不同的 IAM 角色。如此一來,您的任務就不會沿用與 Amazon EC2 執行個體相關聯的角色。信任政策範例如下。取代區域識別符,並指定您在啟動任務時使用 AWS 的帳號。
重要
建立任務 IAM 角色時,建議將 aws:SourceAccount 或 aws:SourceArn 條件索引鍵用於與角色關聯的信任關係政策,進一步設定許可的範圍,防止出現混淆代理人安全問題。使用 aws:SourceArn 條件索引鍵來指定目前不受支援的特定叢集時,您應使用萬用字元來指定所有叢集。若要進一步了解混淆代理人問題以及如何保護 AWS 您的帳戶,請參閱《IAM 使用者指南》中的混淆代理人問題。
按照如下程序建立政策,透過範例政策從 Amazon S3 擷取物件。將所有 user input 值取代為實際值。
透過如下程序建立服務角色。
建立角色之後,請為角色新增下列功能的其他許可。
| 功能 | 額外許可 |
|---|---|
|
使用 ECS Exec |
|
| 使用私有 Amazon ECR 儲存庫中的映像 | |
| 使用 EC2 執行個體 (Windows 與 Linux) | |
| 使用外部執行個體 | |
| 使用 Windows EC2 執行個體 |
Amazon ECR 許可
當應用程式程式碼需直接與 Amazon ECR 儲存庫互動時,要具備如下許可。請注意,對於只需從 Amazon ECR 提取映像的基本實作,任務 IAM 角色層級不需要這些許可。但 Amazon ECS 任務執行角色應該具有這些許可。如需任務執行角色的詳細資訊,請參閱「Amazon ECS 任務執行 IAM 角色」。
如果在容器中執行的應用程式程式碼需直接與 Amazon ECR API 互動,您應該將如下許可新增至任務 IAM 角色,並在任務定義中包含任務 IAM 角色。如需詳細資訊,請參閱 IAM User Guide 中的 Adding and Removing IAM Policies。
將以下政策套用至任務 IAM 角色,為需直接與 Amazon ECR 互動的容器應用程式新增必要許可:
ECS Exec 許可
ECS Exec 功能需要任務 IAM 角色,以授予容器在受管 SSM 代理程式 (execute-command 代理程式) 和 SSM 服務之間通訊所需的許可。您應將下列許可新增至任務 IAM 角色,並在任務定義中包含任務 IAM 角色。如需詳細資訊,請參閱 IAM User Guide 中的 Adding and Removing IAM Policies。
針對您的任務 IAM 角色使用下列政策來新增所需的 SSM 許可。
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 AMI。
如果容器執行個體未使用 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=1sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679sudo 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 AMI。
如果容器執行個體未使用 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=1sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679sudo 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