

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

# Amazon ECS 的網路安全最佳實務
<a name="security-network"></a>

網路安全性是包含數個子主題的廣泛主題。其中包括傳輸中加密、網路分隔和隔離、防火牆、流量路由和可觀測性。

## 傳輸中加密
<a name="security-network-encryption"></a>

加密網路流量可防止未經授權的使用者在經由網路傳輸資料時攔截和讀取資料。使用 Amazon ECS，網路加密可以透過以下任何方式來實作。
+ **使用 Nitro 執行個體：**

  根據預設，會自動加密下列 Nitro 執行個體類型之間的流量：C5n、G4、I3en、M5dn、M5n、P3dn、R5dn 和 R5n。當流量透過傳輸閘道、負載平衡器或類似媒介進行路由時，不會加密流量。
  + [傳輸中加密](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/data-protection.html#encryption-transit)
  + [自 2019 年起的新公告](https://aws.amazon.com/about-aws/whats-new/2019/10/introducing-amazon-ec2-m5n-m5dn-r5n-and-r5dn-instances-featuring-100-gbps-of-network-bandwidth/)
  + [這場演講來自 re:Inforce 2019](https://youtu.be/oqHLLbOoxDg?si=Us1YhSiY4deXLFA7)
+ **將伺服器名稱指示 (SNI) 與 Application Load Balancer 搭配使用：**

  應用 Application Load Balancer (ALB) 和 Network Load Balancer (NLB) 支援伺服器名稱指示 (SNI)。透過使用 SNI，您可以將多個安全應用程式置於單一接聽程式之後。為此，每個接聽程式都具有自己的 TLS 憑證。建議您使用 AWS Certificate Manager (ACM) 為負載平衡器佈建憑證，然後將其新增至接聽程式的憑證清單。 AWS 負載平衡器搭配 SNI 使用智慧憑證選取演算法。如果用戶端提供的主機名稱符合憑證清單中的單一憑證，負載平衡器會選擇該憑證。如果用戶端提供的主機名稱符合清單中的多個憑證，負載平衡器會選取用戶端可支援的憑證。範例包括自我簽署憑證或透過 ACM 產生的憑證。
  + [使用 Application Load Balancer 的 SNI](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html#https-listener-certificates)
  + [使用 Network Load Balancer 的 SNI](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-listener.html)
+ **使用 TLS 憑證的端對端加密**

  這涉及部署具有任務的 TLS 憑證。這可以是自我簽署的憑證，也可以是受信任憑證授權機構的憑證。您可以透過參考憑證的秘密來取得憑證。如果不是，您可以選擇執行向 ACM 發出憑證簽署請求 (CSR) 的容器，然後將產生的秘密掛載至共用磁碟區。
  + [使用具有 Amazon ECS 第 1 部分的 Network Load Balancer，一路維護傳輸層安全至您容器](https://aws.amazon.com/blogs//compute/maintaining-transport-layer-security-all-the-way-to-your-container-using-the-network-load-balancer-with-amazon-ecs/)
  + [將 Transport Layer Security (TLS) 維護到容器第 2 部分：使用 AWS 私有憑證授權單位](https://aws.amazon.com/blogs//compute/maintaining-transport-layer-security-all-the-way-to-your-container-part-2-using-aws-certificate-manager-private-certificate-authority/)

## 任務聯網
<a name="security-network-task-networking"></a>

以下建議是考量 Amazon ECS 的運作方式。Amazon ECS 不使用覆蓋網路。反之，任務會設定為在不同的網路模式下運作。例如，設定為使用 `bridge` 模式的任務會從每部主機上執行的 Docker 網路取得不可路由的 IP 地址。設定為使用 `awsvpc` 網路模式的任務會從主機的子網路取得 IP 地址。設定為使用 `host` 聯網的任務會使用主機的網路介面。`awsvpc` 是偏好的網路模式。這是因為此模式為唯一可用來為任務指派安全群組的模式。它也是 Amazon ECS 上可用於 AWS Fargate 任務的唯一模式。

### 任務的安全群組
<a name="security-network-task-networking-security-group"></a>

建議您將任務設定為使用 `awsvpc` 網路模式。將任務設定為使用此模式後，Amazon ECS 代理程式會自動佈建彈性網絡介面 (ENI) 並將其附加至任務。佈建 ENI 時，任務會註冊在 AWS 安全群組中。安全群組做為虛擬防火牆，可用於控制傳入及傳出的流量。

如果使用自訂防火牆搭配任務或服務，請新增傳出規則，允許 Amazon ECS 代理程式管理端點 (`ecs-a-*.region.amazonaws.com`)、遙測端點 (`ecs-t-*.region.amazonaws.com`) 與 Service Connect Envoy 管理端點 (`ecs-sc.region.api.aws`) 的流量。

## AWS PrivateLink 和 Amazon ECS
<a name="security-network-privatelink"></a>

AWS PrivateLink 是一種聯網技術，可讓您為不同的 AWS 服務建立私有端點，包括 Amazon ECS。在沒有網際網路閘道 (IGW) 連接至 Amazon VPC 且沒有其他路由到網際網路的沙盒環境中，則需要端點。使用 AWS PrivateLink 可確保對 Amazon ECS 服務的呼叫保留在 Amazon VPC 中，並且不會周遊網際網路。如需如何為 Amazon ECS 和其他相關服務建立 AWS PrivateLink 端點的說明，請參閱 [Amazon ECS 介面 Amazon VPC 端點](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/vpc-endpoints.html)。

**重要**  
AWS Fargate 任務不需要 Amazon ECS 的 AWS PrivateLink 端點。

Amazon ECR 和 Amazon ECS 都支援端點政策。這些政策可讓您完善服務的 API 存取。例如，您可以為 Amazon ECR 建立端點政策，該政策僅允許將映像推送到特定 AWS 帳戶的登錄檔。這類政策可用於防止透過容器映像洩漏資料，同時仍允許使用者推送至授權的 Amazon ECR 登錄檔。如需詳細資訊，請參閱[使用 VPC 端點政策](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html#vpc-endpoint-policies)。

下列政策允許帳戶中的所有 AWS 主體僅對 Amazon ECR 儲存庫執行所有動作：

```
{
  "Statement": [
    {
      "Sid": "LimitECRAccess",
      "Principal": "*",
      "Action": "*",
      "Effect": "Allow",
      "Resource": "arn:aws:ecr:region:account_id:repository/*"
    },
  ]
}
```

您可以透過設定使用新 `PrincipalOrgID` 屬性的條件來進一步增強此功能。這可防止不屬於 的 IAM 主體推送和提取映像 AWS Organizations。如需詳細資訊，請參閱 [aws:PrincipalOrgID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid)。

建議對 `com.amazonaws.region.ecr.dkr` 和 `com.amazonaws.region.ecr.api` 端點套用相同的政策。

## 容器代理程式設定
<a name="security-network-ecs-agent-settings"></a>

Amazon ECS 容器代理程式組態檔案包含數個與網路安全相關的環境變數。`ECS_AWSVPC_BLOCK_IMDS` 和 `ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST` 用於封鎖任務對 Amazon EC2 中繼資料的存取。`HTTP_PROXY` 用於設定代理程式，以透過 HTTP Proxy 路由連線至網際網路。如需設定代理程式和 Docker 執行期以透過 Proxy 路由的指示，請參閱 [HTTP Proxy 組態](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/http_proxy_config.html)。

**重要**  
這些設定在您使用 AWS Fargate時無法使用。

## 網路安全建議
<a name="security-network-recommendations"></a>

建議您在設定 Amazon VPC、負載平衡器和網路時執行下列動作。

### 在適用的情況下搭配 Amazon ECS 使用網路加密
<a name="security-network-recommendations-network-encryption"></a>

您應該在適用的情況下使用網路加密。如果資料包含持卡人資料，某些合規計劃 (例如 PCI DSS) 會要求您加密傳輸中的資料。如果您的工作負載有類似的需求，請設定網路加密。

現代瀏覽器在連接至不安全的站點時警告使用者。如果面向大眾的負載平衡器前端是您的伺服器，請使用 TLS/SSL 加密從用戶端瀏覽器到負載平衡器的流量，並在授權時重新加密至後端。

### 使用 `awsvpc` 網路模式和安全群組控制 Amazon ECS 中任務與其他資源之間的流量
<a name="security-network-recommendations-awsvpc-networking-mode"></a>

當您需要控制任務之間以及任務與其他網路資源之間的流量時，您應該使用 `awsvpc` 網路模式和安全群組。如果服務位於 ALB 之後，請使用安全群組，僅允許來自其他使用與 ALB 相同安全群組之網路資源的傳入流量。如果您的應用程式位於 NLB 之後，請將任務的安全群組設定為僅允許來自 Amazon VPC CIDR 範圍以及指派給 NLB 的靜態 IP 地址的輸入流量。

安全群組也應該用來控制 Amazon VPC 內任務與其他資源 (例如 Amazon RDS 資料庫) 之間的流量。

### 當網路流量需要嚴格隔離時，在獨立的 Amazon VPC 中建立 Amazon ECS 叢集
<a name="security-network-recommendations-separate-vpcs-for-isolated-traffic"></a>

當網路流量需要嚴格隔離時，您應該在獨立的 Amazon VPC 中建立叢集。避免在叢集上執行具有嚴格安全要求的工作負載，而工作負載不必遵循這些要求。當強制執行嚴格的網路隔離時，請在獨立的 Amazon VPC 中建立叢集，並使用 Amazon VPC 端點將服務選擇性公開給其他 Amazon VPC。如需詳細資訊，請參閱 [VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/concepts.html#concepts-vpc-endpoints)。

### 在 Amazon ECS 需要時設定 AWS PrivateLink 端點
<a name="security-network-privatelink-endpoints"></a>

您應該在必要時設定 AWS PrivateLink 端點。如果您的安全政策阻止您將網際網路閘道 (IGW) 連接至 Amazon VPCs，請設定 Amazon ECS 和其他服務的 AWS PrivateLink 端點，例如 Amazon ECR、 AWS Secrets Manager和 Amazon CloudWatch。

### 使用 Amazon VPC Flow Logs 分析 Amazon ECS 中長時間執行任務的流入及流出流量
<a name="security-network-vpc-flow-logs"></a>

您應該使用 Amazon VPC 流程日誌分析流入及流出長時間執行任務的流量。使用 `awsvpc` 網路模式的任務會取得自己的 ENI。執行此操作，您可以使用 Amazon VPC 流程日誌監控進出個別任務的流量。Amazon VPC 流程日誌 (v3) 的近期更新使用流量中繼資料 (包括 VPC ID、子網路 ID 和執行個體 ID) 來豐富日誌。此中繼資料可用於協助縮小調查範圍。如需詳細資訊，請參閱 [Amazon VPC 流程日誌](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-logs-basics)。

**注意**  
由於容器的暫時性本質，流程日誌不一定是分析不同容器或容器以及其他網路資源之間流量模式的有效方法。