本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon ECS 中 IAM 角色的最佳實務
Amazon ECS 所需的角色取決於任務定義啟動類型和您使用的功能。我們建議您在資料表中建立個別角色,而不是共用角色。
角色 | 定義 | 需要時 | 其他資訊 |
---|---|---|---|
任務執行角色 | 此角色允許 Amazon ECS 代表您使用其他 AWS 服務。 |
您的任務託管在 AWS Fargate外部執行個體上或外部執行個體上,並且:
您的任務託管於 AWS Fargate 或 Amazon EC2 執行個體,且:
|
Amazon ECS 任務執行 IAM 角色 |
任務角色 | 此角色可讓您的應用程式程式碼 (在容器上) 使用其他 AWS 服務。 | 您的應用程式會存取其他 AWS 服務,例如 Amazon S3。 | Amazon ECS 任務 IAM 角色 |
容器執行個體角色 | 此角色可讓您的 EC2 執行個體或外部執行個體向叢集註冊。 | 您的任務託管在 Amazon EC2 執行個體或外部執行個體上。 | Amazon ECS 容器執行個體 IAM 角色 |
Amazon ECS Anywhere 角色 | 此角色可讓您的外部執行個體存取 AWS APIs。 | 您的任務託管在外部執行個體上。 | Amazon ECS Anywhere IAM 角色 |
Amazon ECS CodeDeploy 角色 | 此角色允許 CodeDeploy 更新 服務。 | 您可以使用 CodeDeploy 藍/綠部署類型來部署 服務。 | Amazon ECS CodeDeploy IAM 角色 |
Amazon ECS EventBridge 角色 | 此角色可讓 EventBridge 更新 服務。 | 您可以使用 EventBridge 規則和目標來排程任務。 | Amazon ECS EventBridge IAM 角色 |
Amazon ECS 基礎設施角色 | 此角色允許 Amazon ECS 管理叢集中的基礎設施資源。 |
|
Amazon ECS 基礎設施 IAM 角色 |
任務角色
我們建議您指派任務角色。其角色可以與執行 Amazon EC2 執行個體所使用的角色有所區別。為每項任務指派一個角色的做法符合最低權限存取原則,並且允許對動作和資源進行更精細的控制。
當您將任務角色新增至任務定義時,Amazon ECS 容器代理程式會自動為該任務建立具有唯一憑證 ID 的字符 (例如 12345678-90ab-cdef-1234-567890abcdef
)。然後,此字符和角色憑證會新增至代理程式的內部快取。代理程式會以憑證 ID 的 URI 填入容器中的環境變數 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
(例如 /v2/credentials/12345678-90ab-cdef-1234-567890abcdef
)。
您可以透過將環境變數附加至 Amazon ECS 容器代理程式的 IP 地址,然後在產生的字串上執行 curl
命令,從容器內手動擷取暫時性角色憑證。
curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
預期的輸出如下:
{ "RoleArn": "arn:aws:iam::123456789012:role/SSMTaskRole-SSMFargateTaskIAMRole-DASWWSF2WGD6", "AccessKeyId": "AKIAIOSFODNN7EXAMPLE", "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "Token": "IQoJb3JpZ2luX2VjEEM/Example==", "Expiration": "2021-01-16T00:51:53Z" }
較新版本的 AWS SDKs 在進行 AWS API 呼叫時,會自動從AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
環境變數擷取這些登入資料。如需如何續約登入資料的資訊,請參閱在 rePost 上續約 AWS 登入
輸出包含存取金鑰對,其中包含私密存取金鑰 ID 和您的應用程式用來存取 AWS 資源的私密金鑰。它還包含一個字符, AWS 用於驗證登入資料是否有效。依預設,指派給使用任務角色之任務的憑證有效期為六小時。之後,Amazon ECS 容器代理程式會自動輪換。
任務執行角色
任務執行角色用於授予 Amazon ECS 容器代理程式代表您呼叫特定 AWS API 動作的許可。例如,當您使用 AWS Fargate時,Fargate 需要 IAM 角色,以允許其從 Amazon ECR 提取映像並將日誌寫入 CloudWatch Logs。當任務參考存放在 中的秘密時 AWS Secrets Manager,例如映像提取秘密時,也需要 IAM 角色。
注意
如果您以經身份驗證的使用者提取映像,則不太可能受到 Docker Hub 提取速率限制
透過使用 Amazon ECR 和 Amazon ECR Public,您可以避免 Docker 施加的限制。如果您從 Amazon ECR 提取映像,這也有助於縮短網路提取時間,並減少流量離開 VPC 時的資料傳輸變更。
重要
當您使用 Fargate 時,您必須使用 repositoryCredentials
對私有映像登錄檔進行驗證。無法為 Fargate 上託管的任務設定 Amazon ECS 容器代理程式環境變數 ECS_ENGINE_AUTH_TYPE
或 ECS_ENGINE_AUTH_DATA
或修改 ecs.config
檔案。如需詳細資訊,請參閱任務的私有登錄檔身分驗證。
容器執行個體角色
AmazonEC2ContainerServiceforEC2Role
受管 IAM 政策包含下列許可。遵循授予最低權限的標準安全建議,AmazonEC2ContainerServiceforEC2Role
受管政策可作為指南。如果您的使用案例不需要受管政策中授予的任何許可,請建立自訂政策並僅新增您需要的許可。
-
ec2:DescribeTags
– (選用) 允許委託人描述與 Amazon EC2 執行個體相關聯的標籤。Amazon ECS 容器代理程式會使用此許可,以支援資源標籤傳播。如需詳細資訊,請參閱如何標記資源。 -
ecs:CreateCluster
– (選用) 允許主體建立 Amazon ECS 叢集。Amazon ECS 容器代理程式會使用此許可來建立default
叢集 (如果叢集尚不存在)。 -
ecs:DeregisterContainerInstance
– (選用) 允許主體從叢集取消註冊 Amazon ECS 容器執行個體。Amazon ECS 容器代理程式不會呼叫此 API 操作,但此許可仍會保留,以協助確保回溯相容性。 -
ecs:DiscoverPollEndpoint
– (必要) 此動作會傳回 Amazon ECS 容器代理程式用來輪詢更新的端點。 -
ecs:Poll
– (必要) 允許 Amazon ECS 容器代理程式與 Amazon ECS 控制平面通訊,以報告任務狀態變更。 -
ecs:RegisterContainerInstance
– (必要) 允許主體向叢集註冊容器執行個體。Amazon ECS 容器代理程式使用此許可向叢集註冊 Amazon EC2 執行個體,並支援資源標籤傳播。 -
ecs:StartTelemetrySession
– (選用) 允許 Amazon ECS 容器代理程式與 Amazon ECS 控制平面通訊,以報告每個容器和任務的健康資訊和指標。雖然不需要此許可,但我們建議您新增它,以允許容器執行個體指標開始擴展動作,並接收與運作狀態檢查命令相關的報告。
-
ecs:TagResource
– (選用) 允許 Amazon ECS 容器代理程式在建立叢集時加上標籤,並在容器執行個體註冊至叢集時加上標籤。 -
ecs:UpdateContainerInstancesState
- 允許委託人修改 Amazon ECS 容器執行個體的狀態。Amazon ECS 容器代理程式使用此許可,用於 Spot 執行個體耗盡。 -
ecs:Submit*
– (必要) 這包括SubmitAttachmentStateChanges
、SubmitContainerStateChange
和SubmitTaskStateChange
API 動作。Amazon ECS 容器代理程式會使用它們,將每個資源的狀態變更報告給 Amazon ECS 控制平面。Amazon ECS 容器代理程式不再使用SubmitContainerStateChange
許可,但仍保留此許可,以協助確保回溯相容性。 -
ecr:GetAuthorizationToken
– (選用) 允許委託人擷取授權字符。授權字符代表您的 IAM 身分驗證憑證,且可用來存取 IAM 委託人有存取權限的任何 Amazon ECR 登錄檔。收到的授權字符的有效期為 12 小時。 -
ecr:BatchCheckLayerAvailability
– (選用) 將容器映像推送至 Amazon ECR 私有儲存庫時,會檢查每個映像層以確認是否已推送。如果已推送,則會略過映像層。 -
ecr:GetDownloadUrlForLayer
– (選用) 從 Amazon ECR 私有儲存庫提取容器映像時,此 API 會針對尚未快取的每個映像層呼叫一次。 -
ecr:BatchGetImage
– (選用) 從 Amazon ECR 私有儲存庫提取容器映像時,會呼叫此 API 一次以擷取映像資訊清單。 -
logs:CreateLogStream
– (選用) 允許主體為指定的日誌群組建立 CloudWatch Logs 日誌串流。 -
logs:PutLogEvents
– (選用) 允許委託人將一批日誌事件上傳到指定的日誌串流。
服務連結角色
您可以使用 Amazon ECS 的服務連結角色來授予 Amazon ECS 服務代表您呼叫其他服務 API 的許可。Amazon ECS 需要許可,才能使用目標群組建立和刪除網路介面、註冊和取消註冊目標。其也需要必要的許可,才能建立和刪除擴展政策。透過任務連結角色授予許可。在您第一次使用服務時代表您建立此角色。
注意
如果您不小心刪除服務連結角色,您可以重新建立角色。如需指示,請參閱建立服務連結角色。
角色建議
建議您在設定任務 IAM 角色和政策時執行下列動作。
封鎖 Amazon EC2 中繼資料的存取
當您在 Amazon EC2 執行個體上執行任務時,強烈建議您封鎖 Amazon EC2 中繼資料的存取,以防止容器繼承指派給這些執行個體的角色。如果您的應用程式必須呼叫 AWS API 動作,請改為將 IAM 角色用於任務。
若要防止以橋接模式執行的任務存取 Amazon EC2 中繼資料,請執行以下命令或更新執行個體的使用者資料。如需更新執行個體使用者資料的詳細指示,請參閱此 AWS 支援文章
sudo yum install -y iptables-services; sudo iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP
如需在重新開機後保留此變更,請執行下列 Amazon Machine Image (AMI) 專用的命令:
-
Amazon Linux 2
sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
-
Amazon Linux
sudo service iptables save
對於使用 awsvpc
網路模式的任務,請在 /etc/ecs/ecs.config
檔案中將環境變數 ECS_AWSVPC_BLOCK_IMDS
設定為 true
。
您應該在 ecs-agent config
檔案中將 ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST
變數設定為 false
,以防止在 host
網路中執行的容器存取 Amazon EC2 中繼資料。
使用 awsvpc
網路模式
使用網路 awsvpc
網路模式來限制不同任務之間的流量,或是您的任務與 Amazon VPC 中執行的其他服務之間的流量。此新增其他的安全層。awsvpc
網路模式可為 Amazon EC2 上執行的任務提供任務層級的網路隔離。它是 上的預設模式 AWS Fargate。它是您可以用來將安全群組指派給任務的唯一網路模式。
使用上次存取的資訊來精簡角色
建議您移除任何從未使用或已有一段時間未使用的動作。這樣可以防止不必要的存取發生。若要執行此作業,請檢閱 IAM 提供的上次存取資訊,然後移除未曾使用或最近未曾使用的動作。您可以按照下列步驟執行此操作。
執行下列命令來產生報告,其中顯示參考政策的上次存取資訊:
aws iam generate-service-last-accessed-details --arn arn:aws:iam::123456789012:policy/ExamplePolicy1
使用輸出中的 JobId
來執行以下命令。執行這項操作之後,您可以檢視報告的結果。
aws iam get-service-last-accessed-details --job-id 98a765b4-3cde-2101-2345-example678f9
如需詳細資訊,請參閱AWS 使用上次存取資訊在 中精簡許可。
監控 AWS CloudTrail 可疑活動
您可以監控 AWS CloudTrail 任何可疑活動。大多數 AWS API 呼叫都會記錄 AWS CloudTrail 為事件。它們由 AWS CloudTrail Insights 進行分析,並且您會收到與 write
API 呼叫相關的任何可疑行為的提醒。這可能包括呼叫量的激增。這些警示包括異常活動發生的時間和為 API 貢獻的頂端身份 ARN 等資訊。
您可以查看事件的 userIdentity
屬性,來識別 AWS CloudTrail 中具有 IAM 角色的任務所執行的動作。在下列範例中,arn
包含擔任角色的名稱 s3-write-go-bucket-role
,後面接著任務名稱 7e9894e088ad416eb5cab92afExample
。
"userIdentity": { "type": "AssumedRole", "principalId": "AROA36C6WWEJ2YEXAMPLE:7e9894e088ad416eb5cab92afExample", "arn": "arn:aws:sts::123456789012:assumed-role/s3-write-go-bucket-role/7e9894e088ad416eb5cab92afExample", ... }
注意
當擔任角色的任務在 Amazon EC2 容器執行個體上執行時,Amazon ECS 容器代理程式會將請求記錄到位於 /var/log/ecs/audit.log.YYYY-MM-DD-HH
格式地址的代理程式稽核日誌中。如需詳細資訊,請參閱任務 IAM 角色日誌和記錄追蹤的 Insights 事件。