

 **協助改進此頁面** 

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

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

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

# 在現有叢集上使用 KMS 加密 Kubernetes 秘密
<a name="enable-kms"></a>

**重要**  
此程序僅適用於執行 Kubernetes 版本 1.27 或更低版本的 EKS 叢集。如果您執行的是 Kubernetes 版本 1.28 或更新版本，則根據預設，會使用封套加密來保護 Kubernetes 秘密。如需詳細資訊，請參閱[針對所有 Kubernetes API 資料的預設封套加密](envelope-encryption.md)。

如果您啟用[秘密加密](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/)，則會使用您選取的 AWS KMS 金鑰來加密 Kubernetes 秘密。KMS 金鑰必須滿足以下條件：
+ 對稱
+ 可加密和解密資料
+ 在與叢集相同的 AWS 區域中建立
+ 如果 KMS 金鑰是在其他帳戶中建立，則 [IAM p主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)必須具有 KMS 金鑰的存取權。

如需詳細資訊，請參閱 * [AWS Key Management Service 開發人員指南](https://docs.aws.amazon.com/kms/latest/developerguide/)*中的[允許其他帳戶中的 IAM 主體使用 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html)。

**警告**  
啟用秘密加密後，您無法予以停用。此動作不可復原。

eksctl   
此程序僅適用於執行 Kubernetes 版本 1.27 或更低版本的 EKS 叢集。如需詳細資訊，請參閱[針對所有 Kubernetes API 資料的預設封套加密](envelope-encryption.md)。

您可以在以兩種方式啟用加密：
+ 使用單一命令將加密新增至叢集。

  若要自動重新加密您的秘密，請執行下列命令。

  ```
  eksctl utils enable-secrets-encryption \
      --cluster my-cluster \
      --key-arn arn:aws: kms:region-code:account:key/key
  ```

  若要退出自動重新加密您的密碼，請執行下列命令。

  ```
  eksctl utils enable-secrets-encryption
      --cluster my-cluster \
      --key-arn arn:aws: kms:region-code:account:key/key \
      --encrypt-existing-secrets=false
  ```
+ 使用 `kms-cluster.yaml` 檔案將加密新增到您的叢集中。

  ```
  apiVersion: eksctl.io/v1alpha5
  kind: ClusterConfig
  
  metadata:
    name: my-cluster
    region: region-code
  
  secretsEncryption:
    keyARN: arn:aws: kms:region-code:account:key/key
  ```

  若要讓您的秘密自動重新加密，請執行下列命令。

  ```
  eksctl utils enable-secrets-encryption -f kms-cluster.yaml
  ```

  若要退出自動重新加密您的密碼，請執行下列命令。

  ```
  eksctl utils enable-secrets-encryption -f kms-cluster.yaml --encrypt-existing-secrets=false
  ```  
 AWS 管理主控台   

  1. 此程序僅適用於執行 Kubernetes 版本 1.27 或更低版本的 EKS 叢集。如需詳細資訊，請參閱[針對所有 Kubernetes API 資料的預設封套加密](envelope-encryption.md)。

  1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

  1. 選擇您要向其新增 KMS 加密的叢集。

  1. 選擇 **Overview** (概觀) 索引標籤 (預設選取此項)。

  1. 向下捲動到 **Secrets encryption** (私密加密) 區段，然後選擇 **Enable** (啟用)。

  1. 從下拉式清單中選取金鑰，然後選擇 **Enable** (啟用) 按鈕。如果未列出任何金鑰，您必須先建立一個。如需詳細資訊，請參閱[建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

  1. 選擇 **Confirm** (確認) 按鈕以使用選擇的金鑰。  
 AWS CLI  

  1. 此程序僅適用於執行 Kubernetes 版本 1.27 或更低版本的 EKS 叢集。如需詳細資訊，請參閱[針對所有 Kubernetes API 資料的預設封套加密](envelope-encryption.md)。

  1. 使用下列 CLI AWS 命令，將[秘密加密](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/)組態與叢集建立關聯。使用自己的取代範例值。

     ```
     aws eks associate-encryption-config \
         --cluster-name my-cluster \
         --encryption-config '[{"resources":["secrets"],"provider":{"keyArn":"arn:aws: kms:region-code:account:key/key"}}]'
     ```

     範例輸出如下。

     ```
     {
       "update": {
         "id": "3141b835-8103-423a-8e68-12c2521ffa4d",
         "status": "InProgress",
         "type": "AssociateEncryptionConfig",
         "params": [
           {
             "type": "EncryptionConfig",
             "value": "[{\"resources\":[\"secrets\"],\"provider\":{\"keyArn\":\"arn:aws: kms:region-code:account:key/key\"}}]"
           }
         ],
         "createdAt": 1613754188.734,
         "errors": []
       }
     }
     ```

  1. 您可以使用下列命令來監控您的加密更新的狀態。使用之前輸出傳回的特定 `cluster name` 和 `update ID`。顯示 `Successful` 狀態時，即表示更新已完成。

     ```
     aws eks describe-update \
         --region region-code \
         --name my-cluster \
         --update-id 3141b835-8103-423a-8e68-12c2521ffa4d
     ```

     範例輸出如下。

     ```
     {
       "update": {
         "id": "3141b835-8103-423a-8e68-12c2521ffa4d",
         "status": "Successful",
         "type": "AssociateEncryptionConfig",
         "params": [
           {
             "type": "EncryptionConfig",
             "value": "[{\"resources\":[\"secrets\"],\"provider\":{\"keyArn\":\"arn:aws: kms:region-code:account:key/key\"}}]"
           }
         ],
         "createdAt": 1613754188.734>,
         "errors": []
       }
     }
     ```

  1. 若要驗證您的叢集中是否已啟用加密，請執行 `describe-cluster` 命令。回應包含 `EncryptionConfig` 字串。

     ```
     aws eks describe-cluster --region region-code --name my-cluster
     ```

在叢集上啟用加密之後，您須使用新金鑰來加密所有現有的密碼：

**注意**  
如果您使用 `eksctl`，則僅當您選擇退出自動重新加密秘密時，才需要執行以下命令。

```
kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - kms-encryption-timestamp="time value"
```

**警告**  
如果針對現有叢集啟用[秘密加密](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/)，且使用的 KMS 金鑰已被刪除，則無法復原叢集的路徑。若刪除 KMS 金鑰，即會永久使叢集處於降級狀態。如需詳細資訊，請參閱[刪除 AWS KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html)。

**注意**  
根據預設， `create-key`命令會使用金鑰政策來建立[對稱加密 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html)，讓帳戶根管理員能夠存取 AWS KMS 動作和資源。如果您想要縮小許可範圍，請確保要呼叫 `create-cluster` API 之主體的政策上允許 `kms:DescribeKey` 和 `kms:CreateGrant` 動作。  
對於使用 KMS 封套加密的叢集，需要 `kms:CreateGrant` 許可。CreateCluster 動作不支援條件 `kms:GrantIsForAWSResource`，並且不應在 KMS 政策中使用該條件來控制執行 CreateCluster 的使用者的 `kms:CreateGrant` 許可。