轮替集群的安全密钥

密钥轮替

密钥轮替是指更改密钥加密密钥 (KEK) 中包含的底层加密材料的行为。它可作为计划轮替的一部分自动触发,也可手动触发。通常是在出现安全突发事件导致密钥可能被破解后进行手动触发。密钥轮替仅替换包含原始加密/解密密钥数据的密钥中的单个字段。

自动轮替密钥

AWS Key Management Service (KMS) 支持自动轮替 KMS 密钥。启用后,AWS 每年自动为密钥生成一次新的加密密钥材料。您无需采取任何手动操作。

密钥轮替后,GKE on AWS 会使用新密钥加密每个新 Secret。之前创建的所有 Secret 仍使用其原始密钥进行解密。因此,AWS 会永久保留 CMK 的旧密钥材料,以便在读取旧 Secret 时解密旧 DEK。

您可以使用以下命令查看 KMS 密钥是否启用了自动轮替:

aws kms get-key-rotation --key-id KMS_KEY_ID

KMS_KEY_ID 替换为您的 AWS KMS 密钥 ID。

您可以通过运行以下命令来启用自动密钥轮替:

aws kms enable-key-rotation --key-id KMS_KEY_ID

手动轮替密钥

本部分介绍如何手动轮替控制层面或节点池配置密钥。

控制层面配置密钥

如需手动轮替控制层面配置密钥,请执行以下步骤:

  1. 创建一个新 Cloud Key Management Service 密钥。 保存 KMS 密钥 ARN 的值。您稍后会用到该值。

  2. 确保与集群关联的 IAM 角色有权使用新密钥进行加密和解密。

  3. 使用 gcloud container aws clusters update 命令更新加密密钥。

     gcloud container aws clusters update CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --config-encryption-kms-key-arn=CONFIG_ENCRYPTION_KMS_KEY_ARN
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称
    • GOOGLE_CLOUD_LOCATION:管理集群的受支持的 Google Cloud 区域,例如 us-west1
    • CONFIG_ENCRYPTION_KMS_KEY_ARN:您的新 KMS 密钥 ARN

控制层面根卷

如需手动轮替控制平面根卷密钥,请执行以下步骤:

  1. 创建一个新 Cloud Key Management Service 密钥。 保存 KMS 密钥 ARN 的值。您稍后会用到该值。

  2. 确保与集群关联的 IAM 角色有权使用新密钥进行加密和解密。

  3. 使用 gcloud container aws clusters update 命令更新加密密钥。

     gcloud container aws clusters update CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --root-volume-kms-key-arn=ROOT_VOLUME_KMS_KEY_ARN
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称
    • GOOGLE_CLOUD_LOCATION:管理集群的受支持的 Google Cloud 区域,例如 us-west1
    • ROOT_VOLUME_KMS_KEY_ARN:用于加密根卷的 AWS KMS 密钥的 Amazon 资源名称 (ARN)

节点池配置密钥

如需手动轮替节点池配置密钥,请执行以下步骤:

  1. 创建一个新 Cloud Key Management Service 密钥

  2. 确保与集群关联的 IAM 角色有权使用新密钥进行加密和解密。

  3. 更新正在使用的 KMS 别名:

     aws kms update-alias --alias-name KEY_ALIAS \
         --target-key-id CONFIG_ENCRYPTION_KMS_KEY_ARN
    

    替换以下内容:

    • KEY_ALIAS:现有密钥的别名
    • CONFIG_ENCRYPTION_KMS_KEY_ARN:您的新 KMS 密钥 ARN
  4. 强制集群使用新的加密密钥重新加密所有集群 Secret:

     kubectl get secrets --all-namespaces -o json | \
     kubectl annotate --overwrite -f - encryption-key-rotation-time=`date +"%Y%m%d-%H%M%S"`
    
  5. 停用旧的 AWS KMS 密钥。 如需了解详情,请参阅启用和停用密钥

节点池根卷

如需手动轮替节点池根卷密钥,请执行以下步骤:

  1. 创建一个新 Cloud Key Management Service 密钥

  2. 确保与集群关联的 IAM 角色有权使用新密钥进行加密和解密。

  3. 更新正在使用的 KMS 别名:

     aws kms update-alias --alias-name KEY_ALIAS \
         --target-key-id ROOT_VOLUME_KMS_KEY_ARN
    

    替换以下内容:

    • KEY_ALIAS:现有密钥的别名
    • ROOT_ENCRYPTION_KMS_KEY_ARN:您的新 KMS 密钥 ARN
  4. 更新节点池:

     gcloud container aws node-pools update NODE_POOL_NAME \
         --root-volume-kms-key-arn=ROOT_VOLUME_KMS_KEY_ARN
    

    替换以下内容:

    • NODE_POOL_NAME:节点池的名称
    • ROOT_VOLUME_KMS_KEY_ARN:用于加密根卷的 AWS KMS 密钥的 Amazon 资源名称 (ARN)
  5. 停用旧的 AWS KMS 密钥。 如需了解详情,请参阅启用和停用密钥