

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

# Amazon EKS 的加密最佳實務
<a name="eks"></a>

[Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可協助您在 上執行 Kubernetes， AWS 而無需安裝或維護您自己的 Kubernetes 控制平面或節點。在 Kubernetes 中，*機密*可協助您管理敏感資訊，例如使用者憑證、密碼或 API 金鑰。依預設，這些機密以未加密的方式儲存在 API 伺服器的基礎資料儲存 (稱為 [etcd](https://etcd.io/docs/v3.5/faq/)) 中。在 Amazon EKS 上，`etcd`節點的 Amazon Elastic Block Store (Amazon EBS) 磁碟區會使用 [Amazon EBS 加密進行加密](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html)。任何具有 API 存取權或存取 `etcd` 的使用者都可以擷取或修改機密。此外，任何有權在命名空間中建立 Pod 的人都可以使用該存取權來讀取該命名空間中的任何機密。您可以使用 AWS 受管金鑰或客戶受管金鑰 AWS KMS keys，在 Amazon EKS 中加密這些靜態秘密。使用 `etcd` 的另一種方法是使用 [AWS Secrets and Config Provider (ASCP)](https://github.com/aws/secrets-store-csi-driver-provider-aws) (GitHub 儲存庫)。ASCP 與 IAM 和資源型政策整合，以限制和約束對叢集內部特定 Kubernetes Pod 內的機密的存取。

您可以搭配 Kubernetes 使用下列 AWS 儲存服務：
+ 對於 Amazon EBS，您可以使用樹狀內儲存驅動程式或 [Amazon EBS CSI 驅動程式](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)。兩者都包括用於加密磁碟區和提供客戶受管金鑰的參數。
+ 對於 Amazon Elastic File System (Amazon EFS)，您可以使用同時支援動態和靜態佈建的 [Amazon EFS CSI 驅動程式](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html)。

請考慮此服務的下列加密最佳實務：
+ 如果您使用的是 `etcd` (依預設儲存未加密的機密物件)，請執行下列操作以協助保護機密：
  + [加密機密靜態資料](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/) (Kubernetes 文件)。
  +  AWS KMS 用於 Kubernetes 秘密的信封加密。這可讓您使用唯一的資料金鑰來加密秘密。您可以使用 AWS KMS 金鑰加密金鑰來加密資料金鑰。您可以定期自動輪換金鑰加密金鑰。使用適用於 Kubernetes 的 AWS KMS 外掛程式，所有 Kubernetes 秘密都會以加密文字儲存在 `etcd`中。它們只能由 Kubernetes API 伺服器解密。如需詳細資訊，請參閱[使用 Amazon EKS 加密提供者支援進行深度防禦](https://aws.amazon.com/blogs/containers/using-eks-encryption-provider-support-for-defense-in-depth/)，以及在[現有叢集 AWS KMS 上使用 加密 Kubernetes 秘密](https://docs.aws.amazon.com/eks/latest/userguide/enable-kms.html)。
  + 透過限制讀取和寫入機密的角色型存取控制 (RBAC) 規則啟用或設定授權。限制建立新機密或取代現有機密的許可。如需詳細資訊，請參閱[授權概觀](https://kubernetes.io/docs/reference/access-authn-authz/authorization/) (Kubernetes 文件)。
  + 如果您在 Pod 中定義多個容器，且只有其中一個容器需要存取機密，請定義磁碟區掛載，以便其他容器無法存取該機密。以磁碟區掛載的機密會具現化為 `tmpfs` 磁碟區，並在刪除 Pod 時自動從節點中移除。您也可以使用環境變數，但我們不建議使用此方法，因為環境變數的值可能會出現在日誌中。如需詳細資訊，請參閱[機密](https://kubernetes.io/docs/concepts/configuration/secret/) (Kubernetes 文件)。
  + 如果可能，避免授予對命名空間內的機密的 `watch` 和 `list` 請求的存取權。在 Kubernetes API 中，這些請求非常強大，因為其允許用戶端檢查該命名空間中每個機密的值。
  + 僅允許叢集管理員存取 `etcd`，包括唯讀存取權。
  + 如果存在多個 `etcd` 執行個體，請確保 `etcd` 使用 TLS 在 `etcd` 對等項之間進行通訊。
+ 如果您使用的是 ASCP，請執行下列操作以協助保護機密：
  + 使用[服務帳戶的 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html)將機密存取權限制為僅授權的 Pod。
  + 透過使用 [AWS Encryption Provider](https://github.com/kubernetes-sigs/aws-encryption-provider) (GitHub 儲存庫) 啟用 Kubernetes 機密加密，以使用客戶受管 KMS 金鑰實作封套加密。
+ 若要協助降低環境變數資料外洩的風險，建議您使用 [Secret Store CSI Driver 的AWS Secrets Manager 和 Config Provider](https://github.com/aws/secrets-store-csi-driver-provider-aws) (GitHub)。此驅動程式可讓您將儲存在 Secrets Manager 中的機密和儲存在 Parameter Store 中的參數顯示為掛載在 Kubernetes Pod 中的檔案。
**注意**  
AWS Fargate 不支援 。
+ 建立 Amazon CloudWatch 指標篩選條件和警示，以針對管理員指定的操作傳送提醒，例如機密刪除或在等待刪除期間使用機密版本。如需詳細資訊，請參閱[根據異常偵測建立警報](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Create_Anomaly_Detection_Alarm.html)。