

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 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 主体](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. 使用以下 AWS CLI 命令将[密钥加密](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/)配置与您的集群相关联。将 example values 替换为您自己的值。

     ```
     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` 权限。