

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon ECS 中 IAM 角色的最佳實務
<a name="security-iam-roles"></a>

Amazon ECS 所需的角色取決於任務定義的啟動類型以及您使用的功能。建議在資料表中建立個別角色，而非共用角色。


| Role | 定義 | 適用時機 | 其他資訊 | 
| --- | --- | --- | --- | 
| 任務執行 角色 | 此角色允許 Amazon ECS 代表您使用其他 AWS 服務。 |  您的任務託管於 AWS Fargate 或外部執行個體上，且符合下列條件： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/security-iam-roles.html) 您的任務託管在 AWS Fargate 或 Amazon EC2 執行個體上，並且： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/security-iam-roles.html)  | [Amazon ECS 任務執行 IAM 角色](task_execution_IAM_role.md) | 
| 任務 角色 | 此角色可讓您的應用程式程式碼 （在容器上） 使用其他 AWS 服務。 | 您的應用程式會存取其他 AWS 服務，例如 Amazon S3。 | [Amazon ECS 任務 IAM 角色](task-iam-roles.md) | 
| 容器執行個體角色 | 此角色允許您的 EC2 執行個體或外部執行個體向叢集完成註冊程序。 | 您的任務託管於 Amazon EC2 執行個體或外部執行個體上。 | [Amazon ECS 容器執行個體 IAM 角色](instance_IAM_role.md) | 
| Amazon ECS Anywhere 角色 | 此角色可讓您的外部執行個體存取 AWS APIs。 | 您的任務託管於外部執行個體上。 | [Amazon ECS Anywhere IAM 角色](iam-role-ecsanywhere.md) | 
| Amazon ECS CodeDeploy 角色 | 此角色允許 CodeDeploy 更新您的服務。 | 您可以使用 CodeDeploy 藍/綠部署類型來部署服務。 | [Amazon ECS CodeDeploy IAM 角色](codedeploy_IAM_role.md) | 
| Amazon ECS EventBridge 角色 | 此角色允許 EventBridge 更新您的服務。 | 您可以透過 EventBridge 規則與目標來排程任務。 | [Amazon ECS EventBridge IAM 角色](CWE_IAM_role.md) | 
| Amazon ECS 基礎結構角色 | 此角色允許 Amazon ECS 管理叢集中的基礎結構資源。 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/security-iam-roles.html) | [Amazon ECS 基礎結構 IAM 角色](infrastructure_IAM_role.md) | 

## 任務 角色
<a name="security-iam-task-role"></a>

建議您為任務指派角色。其角色可以與執行 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 登入](https://repost.aws/questions/QUgcf1EIOPS7GZNboeAiyO9Q/renewing-aws-credentials)資料。

輸出包含存取金鑰對，其中包含私密存取金鑰 ID 和您的應用程式用來存取 AWS 資源的私密金鑰。它還包含一個字符， AWS 用於驗證登入資料是否有效。依預設，指派給使用任務角色之任務的憑證有效期為六小時。之後，Amazon ECS 容器代理程式會自動輪換。

## 任務執行 角色
<a name="security-iam-roles-task-execution"></a>

任務執行角色用於授予 Amazon ECS 容器代理程式代表您呼叫特定 AWS API 動作的許可。例如，當您使用 AWS Fargate時，Fargate 需要 IAM 角色，以允許其從 Amazon ECR 提取映像並將日誌寫入 CloudWatch Logs。當任務參考存放在 中的秘密時 AWS Secrets Manager，例如映像提取秘密時，也需要 IAM 角色。

**注意**  
如果您以經身份驗證的使用者提取映像，則不太可能受到 [Docker Hub 提取速率限制](https://www.docker.com/pricing/resource-consumption-updates)所發生的變更影響。如需詳細資訊，請參閱[容器執行個體的私有登錄檔身分驗證](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/private-auth-container-instances.html)。  
透過使用 Amazon ECR 和 Amazon ECR Public，您可以避免 Docker 施加的限制。如果您從 Amazon ECR 提取映像，這也有助於縮短網路提取時間，並減少流量離開 VPC 時的資料傳輸變更。

**重要**  
當您使用 Fargate 時，您必須使用 `repositoryCredentials` 對私有映像登錄檔進行驗證。無法為 Fargate 上託管的任務設定 Amazon ECS 容器代理程式環境變數 `ECS_ENGINE_AUTH_TYPE` 或 `ECS_ENGINE_AUTH_DATA` 或修改 `ecs.config` 檔案。如需詳細資訊，請參閱[任務的私有登錄檔身分驗證](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/private-auth.html)。

## 容器執行個體角色
<a name="security-iam-roles-ec2-container-instance"></a>

`AmazonEC2ContainerServiceforEC2Role` 受管 IAM 政策包含下列許可。遵循授予最低權限的標準安全建議，`AmazonEC2ContainerServiceforEC2Role` 受管政策可作為指南。如果您的使用案例不需要受管政策中授予的任何許可，請建立自訂政策並僅新增您需要的許可。
+ `ec2:DescribeTags` – (選用) 允許主體描述與 Amazon EC2 執行個體相關聯的標籤。Amazon ECS 容器代理程式會使用此許可，以支援資源標籤傳播。如需詳細資訊，請參閱[如何標記資源](ecs-using-tags.md#tag-resources)。
+ `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` – (選用) 允許主體將批次日誌事件上傳至指定的日誌串流。

## 服務連結角色
<a name="security-iam-roles-service-linked"></a>

您可以使用 Amazon ECS 的服務連結角色來授予 Amazon ECS 服務代表您呼叫其他服務 API 的許可。Amazon ECS 需要許可，才能使用目標群組建立和刪除網路介面、註冊和取消註冊目標。其也需要必要的許可，才能建立和刪除擴展政策。透過任務連結角色授予許可。在您第一次使用服務時代表您建立此角色。

**注意**  
如果您不小心刪除服務連結角色，您可以重新建立角色。如需指示，請參閱[建立服務連結角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html#create-service-linked-role)。

## 角色建議
<a name="security-iam-roles-recommendations"></a>

建議您在設定任務 IAM 角色和政策時執行下列動作。

### 封鎖 Amazon EC2 中繼資料的存取
<a name="security-iam-roles-recommendations-ec2-metadata"></a>

當您在 Amazon EC2 執行個體上執行任務時，強烈建議您封鎖 Amazon EC2 中繼資料的存取，以防止容器繼承指派給這些執行個體的角色。如果您的應用程式必須呼叫 AWS API 動作，請改為將 IAM 角色用於任務。

若要防止以**橋接**模式執行的任務存取 Amazon EC2 中繼資料，請執行以下命令或更新執行個體的使用者資料。如需更新執行個體使用者資料的詳細指示，請參閱此 [AWS 支援文章](https://aws.amazon.com/premiumsupport/knowledge-center/ecs-container-ec2-metadata/)。如需有關任務定義橋接模式的詳細資訊，請參閱[任務定義網路模式](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#network_mode)。

```
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` 網路模式
<a name="security-iam-roles-recommendations-awsvpc-networking-mode"></a>

使用網路 `awsvpc` 網路模式來限制不同任務之間的流量，或是您的任務與 Amazon VPC 中執行的其他服務之間的流量。此新增其他的安全層。`awsvpc` 網路模式可為 Amazon EC2 上執行的任務提供任務層級的網路隔離。它是 上的預設模式 AWS Fargate。它是您可以用來將安全群組指派給任務的唯一網路模式。

### 使用上次存取的資訊來精簡角色
<a name="security-iam-roles-recommendations-iam-access-advisor-refine-roles"></a>

建議您移除任何從未使用或已有一段時間未使用的動作。這樣可以防止不必要的存取發生。若要這麼做，請檢閱 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 使用上次存取資訊在 中精簡許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_last-accessed.html)。

### 監控 AWS CloudTrail 可疑活動
<a name="security-iam-roles-recommendations-cloudtrail-monitoring"></a>

您可以監控 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 角色日誌](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/logs.html#task_iam_roles-logs)和[記錄追蹤的 Insights 事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-insights-events-with-cloudtrail.html)。