本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon 中IAM角色的最佳實務 ECS
我們建議您指派任務角色。其角色可以與其執行中的 Amazon EC2執行個體角色區分開來。為每項任務指派一個角色的做法符合最低權限存取原則,並且允許對動作和資源進行更精細的控制。
為任務指派IAM角色時,您必須使用下列信任政策,以便每個任務可以擔任與EC2執行個體使用角色不同的IAM角色。如此一來,您的任務就不會繼承EC2執行個體的角色。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
當您將任務角色新增至任務定義時,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
環境變數擷取這些登入資料。如需如何續約登入資料的資訊,請參閱在 續約 AWS 登入資料
輸出包含存取金鑰對,其中包含私密存取金鑰 ID 和您的應用程式用來存取 AWS 資源的私密金鑰。它還包括一個字符, AWS 用於驗證登入資料是否有效。依預設,指派給使用任務角色之任務的憑證有效期為六小時。之後,Amazon ECS容器代理程式會自動輪換它們。
任務執行角色
任務執行角色用於授予 Amazon ECS容器代理程式代表您呼叫特定 AWS API動作的許可。例如,當您使用 時 AWS Fargate,Fargate 需要一個IAM角色,允許它從 Amazon 提取影像ECR並將日誌寫入 CloudWatch 日誌。當任務參考存放在 中的秘密時 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:PutLogEvents
– (選用) 允許委託人將一批日誌事件上傳到指定的日誌串流。
下列政策包含必要的許可。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:DiscoverPollEndpoint", "ecs:Poll", "ecs:RegisterContainerInstance", "ecs:UpdateContainerInstancesState", "ecs:Submit*" ], "Resource": "*" } ] }
服務連結角色
您可以使用 Amazon 的服務連結角色ECS,授予 Amazon ECS服務APIs代表您呼叫其他服務的許可。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
。
您應該在 false
ecs-agent config
檔案中將ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST
變數設定為 ,以防止在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呼叫相關聯的可疑行為。這可能包括呼叫量的激增。這些提醒包括異常活動發生的時間,以及ARN導致 的前 個身分等資訊APIs。
您可以查看事件的 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", ... }