加密 etcd 和控制平面启动磁盘


本页介绍了如何使用您在 Cloud Key Management Service (Cloud KMS) 中管理的密钥加密存储在 Google Kubernetes Engine (GKE) 控制平面中的数据。您应当已熟悉 etcdGKE 集群架构Cloud KMS 等概念。

本页介绍了 GKE 中一组可选控制平面功能的一部分,可让您执行各种任务,例如验证控制平面安全状况,或使用您管理的密钥在控制平面中配置加密和凭据签名。 如需了解详情,请参阅 GKE 控制平面授权简介

默认情况下, Google Cloud 会对托管式控制平面应用各种安全措施。 本页介绍了一些可选功能,可让您更好地了解 GKE 控制平面或对其进行控制。

控制平面启动磁盘和 etcd 加密简介

默认情况下,GKE 使用 Google Cloud管理的加密密钥,对控制平面节点的启动磁盘、存储 etcd 中数据的磁盘以及 Google Cloud 的 etcd 内部操作备份进行加密。如需详细了解此默认加密,请参阅默认静态加密。您可以选择使用您使用 Cloud KMS 管理的加密密钥来加密这些资源。如需了解详情,请参阅控制平面启动磁盘和 etcd 加密

您可以在 Cloud KMS 中创建密钥,供 GKE 用于加密控制平面资源。创建这些资源时,请考虑以下事项:

  • 您可以为集群中的所有密钥使用一个密钥环,无论每个密钥的用途如何。如果您有现有密钥环用于其他用途(例如设置自己的证书授权机构),则可以将该密钥环用于本指南。
  • 您应在集群所在的 Google Cloud 位置创建密钥,以缩短延迟时间。
  • 对于大多数用例,您可以使用软件 Cloud KMS 密钥保护级别。您还可以将硬件密钥与 Cloud HSM 搭配使用。
  • 您必须使用 encryption 值指定 --purpose 标志,因为这些密钥用于对称加密。
  • 您不应修改密钥销毁的默认时长

与其他 GKE 控制平面权限功能搭配使用

GKE control 平面 authority 提供与自有密钥相关的以下功能,您必须在创建集群时同时启用这些功能:

您只能在创建新的 GKE 集群时启用这些功能。您无法更新现有集群以使用这些功能。如需在同一集群中同时使用这两项功能,请执行这两份指南中的所有密钥和 CA 配置过程,然后运行集群创建命令以启用这两组功能,如创建集群部分所述。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。
  • 确保您的密钥项目包含适用于集群的 Cloud KMS 密钥环。您可以使用集群位置中的任何现有密钥环。如需创建新的密钥环,请参阅创建密钥环
  • Enable the Cloud Key Management Service API.

    Enable the API

标识项目

我们建议您分别使用 Google Cloud 项目,如下所示:

  • 密钥项目:包含所有密钥。
  • 集群项目:包含您的 GKE 集群。

您可以选择为密钥和 GKE 集群使用同一项目,但我们建议您使用不同的项目,以便管理密钥和加密操作的团队与管理集群的团队分开。

所需的角色和权限

如需获得运行您自己的加密密钥所需的权限,请让管理员向您授予以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

使用要求

您的集群必须运行 GKE 1.31.1-gke.1846000 或更高版本。

限制

  • 您只能在创建集群期间配置启动磁盘和 etcd 加密密钥。
  • 对于区域级 Standard 模式集群和 Autopilot 集群,您创建集群所在的区域必须至少在该区域的三个可用区中具有可用于 Hyperdisk 平衡模式的 Confidential Mode 容量。

    对于可用区级标准模式集群,集群可用区必须具有 Hyperdisk Balanced 容量。如需容量方面的帮助,请与 Cloud Customer Care 团队联系。

    适用于 Hyperdisk Balanced 的机密模式仅在特定区域提供。如需了解详情,请参阅支持以机密模式创建 Hyperdisk Balanced 卷的区域

  • GKE 仅支持来自 Cloud KMS 的密钥。您不能使用其他 Kubernetes KMS 提供程序或其他加密提供程序。

  • 不支持 Cloud External Key Manager (Cloud EKM) 密钥。

  • 您无法访问或与 Google Cloud 的 etcd 内部运维备份进行交互,这些备份仅用于灾难恢复。

  • 不支持多区域密钥环。您必须使用区域密钥环。

创建密钥

在本部分中,您将为控制平面中的启动磁盘和 etcd 磁盘创建一个加密密钥,并为 Google Cloud的 etcd 内部运维备份创建一个单独的加密密钥。您可以使用一个密钥环来存放所有这些密钥以及集群的任何其他密钥。

  1. 为控制平面启动磁盘和 etcd 磁盘创建加密密钥:

    gcloud kms keys create KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

    替换以下内容:

    • KCP_DISK_KEY_NAME:控制平面启动磁盘和 etcd 磁盘的加密密钥的名称。
    • KEYRING_NAME:用于存放集群加密密钥的密钥环的名称。
    • LOCATION:密钥环的 Google Cloud 位置。此值必须与集群位置相同。如需查看区域列表,请在 Cloud KMS 位置表中过滤“区域”。
    • PROTECTION_LEVEL:密钥的保护级别,例如 softwarehsm
    • KEY_PROJECT_ID关键项目的项目 ID。
  2. 创建 etcd 内部备份加密密钥:

    gcloud kms keys create ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

    ETCD_BACKUP_KEY_NAME 替换为 etcd 内部备份加密密钥的名称。

向 GKE 服务代理授予 IAM 角色

在本部分中,您将为集群项目中的 GKE 服务代理授予您创建的密钥的 IAM 角色。GKE 服务代理需要这些角色使用这些密钥来加密相应的控制平面资源。

  1. 查找集群项目编号:

    gcloud projects describe CLUSTER_PROJECT_ID \
        --format='value(projectNumber)'
    

    CLUSTER_PROJECT_ID 替换为您的 GKE 集群项目的项目 ID。

    输出类似于以下内容:

    1234567890
    
  2. 将启动磁盘和 etcd 磁盘加密密钥的 Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色授予集群项目中的 GKE 服务代理:

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project=KEY_PROJECT_ID
    

    替换以下内容:

    • KCP_DISK_KEY_NAME:磁盘加密密钥的名称。
    • LOCATION:密钥的 Google Cloud 位置。
    • KEYRING_NAME:包含加密密钥的密钥环的名称。
    • CLUSTER_PROJECT_NUMBER:集群项目的数字项目编号,您在上一步中找到了该编号。
    • KEY_PROJECT_ID关键项目的项目 ID。
  3. 将启动磁盘和 etcd 磁盘加密密钥的 Cloud KMS CryptoKey Encrypter/Decrypter Via Delegation (roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation) 角色授予集群项目中的 GKE 服务代理:

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation \
        --project=KEY_PROJECT_ID
    
  4. 将 etcd 内部备份加密密钥的 Cloud KMS CryptoKey Encrypter (roles/cloudkms.cryptoKeyEncrypter) 角色授予集群项目中的 GKE 服务代理:

    gcloud kms keys add-iam-policy-binding ETCD_BACKUP_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypter \
        --project=KEY_PROJECT_ID
    

    ETCD_BACKUP_KEY_NAME 替换为 etcd 操作备份加密密钥的名称。

    授予 roles/cloudkms.cryptoKeyEncrypter 角色会阻止 GKE 代表您执行数据库恢复,并会大幅增加发生数据库问题时恢复功能所需的时间。如需允许 GKE 为您执行恢复操作,请改为授予 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色。

在集群中使用加密密钥

本部分介绍了如何确定加密密钥的路径。

  1. 确定磁盘加密密钥的路径:

    gcloud kms keys describe KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

    替换以下内容:

    • KCP_DISK_KEY_NAME:控制平面启动磁盘和 etcd 磁盘的加密密钥的名称。
    • KEYRING_NAME:包含密钥的密钥环的名称。
    • LOCATION:密钥的 Google Cloud 位置。
    • KEY_PROJECT_ID关键项目的项目 ID。

    输出类似于以下内容:

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/disk-encryption-key
    
  2. 确定 etcd 内部备份加密密钥的路径:

    gcloud kms keys describe ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

    ETCD_BACKUP_KEY_NAME 替换为 etcd 操作备份加密密钥的名称。

    输出类似于以下内容:

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/etcd-backup-encryption-key
    

创建集群

在本部分中,您将创建一个集群,并根据要配置的 GKE 控制平面授权功能指定不同的选项。您只能在创建集群期间在集群上配置这些功能。以下命令可创建 Autopilot 模式集群。如需改为创建标准模式集群,请将相同的标志与 gcloud container clusters create 命令搭配使用。

  • 如需创建一个集群来配置磁盘加密并运行您自己的 CA 和服务账号签名密钥,请执行以下操作:

    1. 执行运行您自己的证书授权机构和密钥中的所有密钥和 CA 配置步骤。
    2. 按照在新集群上设置 CA 和密钥中的说明,找到每个服务账号密钥和 CA 的路径。
    3. 创建集群:

      gcloud container clusters create-auto CLUSTER_NAME \
          --location=LOCATION \
          --project=CLUSTER_PROJECT_ID \
          --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
          --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY \
          --service-account-signing-keys=PATH_TO_SIGNING_KEY_VERSION \
          --service-account-verification-keys=PATH_TO_VERIFICATION_KEY_VERSION \
          --cluster-ca=PATH_TO_CLUSTER_CA \
          --etcd-peer-ca=PATH_TO_ETCD_PEER_CA \
          --etcd-api-ca=PATH_TO_ETCD_API_CA \
          --aggregation-ca=PATH_TO_AGGREGATION_CA
      

      请替换以下内容:

      • CLUSTER_NAME:新集群的名称。
      • LOCATION:新集群的位置。
      • CLUSTER_PROJECT_ID:您的集群项目的项目 ID。
      • PATH_TO_DISK_KEY:此页面上前几步中磁盘加密密钥的路径。
      • PATH_TO_ETCD_BACKUP_KEY:本页面上前几步中 etcd 内部备份加密密钥的路径。
      • PATH_TO_SIGNING_KEY_VERSION:Cloud KMS 中 Kubernetes ServiceAccount 签名密钥版本的路径。
      • PATH_TO_VERIFICATION_KEY_VERSION:Cloud KMS 中 Kubernetes ServiceAccount 验证密钥版本的路径。
      • PATH_TO_CLUSTER_CA:集群 CA 池的路径。
      • PATH_TO_ETCD_PEER_CA:etcd 对等 CA 池的路径。
      • PATH_TO_ETCD_API_CA:etcd API CA 池的路径。
      • PATH_TO_AGGREGATION_CA:汇总 CA 池的路径。
  • 如需创建仅使用您在此指南中创建的密钥配置磁盘加密的集群,请运行以下命令:

    gcloud container clusters create-auto CLUSTER_NAME \
        --location=LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
        --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY
    

    替换以下内容:

    • CLUSTER_NAME:新集群的名称。
    • LOCATION:新集群的位置。
    • CLUSTER_PROJECT_ID:您的集群项目的项目 ID。
    • PATH_TO_DISK_KEY:上一步中的磁盘加密密钥的路径。
    • PATH_TO_ETCD_BACKUP_KEY:上一步中 etcd 内部备份加密密钥的路径。

您还可以在创建新的标准模式集群时指定所有这些标志。

验证加密密钥状态

本部分介绍了如何验证在创建集群期间使用的加密密钥。您可以使用 Cloud Logging 或 Google Cloud CLI 执行此验证。

使用日志记录功能验证密钥

如需使用 Logging 验证密钥,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 Logs Explorer 页面:

    转到 Logs Explorer

  2. 通过指定以下查询来获取集群创建日志:

    resource.type="gke_cluster" 
    resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.location="CLUSTER_LOCATION"
    protoPayload.serviceName="container.googleapis.com"
    protoPayload.methodName=~"google.container.v(1|1alpha1|1beta1).ClusterManager.CreateCluster"
    protoPayload.request.cluster.userManagedKeysConfig:*
    
  3. 点击运行查询

在输出中,检查集群创建参数是否包含与您在 Cloud KMS 中设置的密钥对应的密钥路径,如以下示例所示:

# lines omitted for clarity
userManagedKeysConfig: {
  controlPlaneDiskEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KCP_DISK_KEY_NAME"
  gkeopsEtcdBackupEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/ETCD_BACKUP_KEY_NAME"
}

使用 gcloud CLI 验证密钥

如需使用 gcloud CLI 验证加密密钥,请执行以下操作:

  1. 对于磁盘加密密钥,请运行以下命令:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.controlPlaneDiskEncryptionKey)"
    
  2. 对于 etcd 内部备份加密密钥,请运行以下命令:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.gkeopsEtcdBackupEncryptionKey)"
    

后续步骤