使用客户管理的加密密钥 (CMEK)

本页面介绍了如何使用客户管理的加密密钥 (CMEK) 对存储在 Service Extensions 插件中的内容进行加密。

概览

默认情况下,Service Extensions 会静态加密客户内容。Service Extensions 会为您处理加密,您无需执行任何其他操作。此选项称为“Google 默认加密”

如果您想要控制加密密钥,则可以将 Cloud KMS 中客户管理的加密密钥 (CMEK) 与集成 CMEK 的服务(包括 Service Extensions)搭配使用。使用 Cloud KMS 密钥时,您可以控制其保护级别、位置、轮替时间表、使用和访问权限以及加密边界。此外,您还可使用 Cloud KMS 查看审核日志并控制密钥生命周期。这样您就可以在 Cloud KMS 中控制和管理用于保护数据的对称密钥加密密钥 (KEK),而不是由 Google 拥有和管理这些密钥。

使用 CMEK 设置资源后,访问 Service Extensions 资源的体验与使用 Google 默认加密功能类似。如需详细了解加密选项,请参阅客户管理的加密密钥 (CMEK)

所有加密操作都会计入拥有相应密钥的 Google Cloud 项目,无论密钥类型如何。如需了解价格信息,请参阅 Cloud KMS 价格

创建密钥并授予权限

以下说明介绍了如何为插件创建密钥,并授予权限以便使用该密钥加密和解密插件数据。

  1. 在您要用于管理密钥的 Google Cloud 项目中,执行以下操作:

    1. 如需创建密钥,请启用 Cloud Key Management Service API

    2. 使用以下选项之一创建密钥环和密钥:

      Cloud KMS 密钥位置必须与您要加密的插件的位置相匹配。

  2. Service Extensions 服务账号必须存在于您的 Service Extensions 项目中。服务账号名称为 service-PROJECT_NUMBER@gcp-sa-networkactions.iam.gserviceaccount.com,其中 PROJECT_NUMBER 是运行 Service Extensions 的 Google Cloud 项目的项目编号

    当您在 Service Extensions 项目中创建第一个插件时,系统会自动创建服务账号。如果您尚未在项目中创建插件,请运行以下命令来创建服务账号:

    gcloud beta services identity create \
        --service=networkactions.googleapis.com \
        --project=PROJECT
    

    PROJECT 替换为运行 Service Extensions 的项目的 ID。

  3. Cloud KMS CryptoKey Encrypter/Decrypter 角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter) 授予您创建的密钥上的 Service Extensions 服务账号。

    控制台

    1. 在 Google Cloud 控制台中,前往密钥管理页面。

      前往密钥管理

    2. 选择您创建的密钥。

    3. 向 Service Extensions 服务账号授予访问权限:

      1. 选择显示信息面板
      2. 点击添加成员
      3. 添加 Service Extensions 服务账号。服务账号为 service-PROJECT_NUMBER@gcp-sa-networkactions.iam.gserviceaccount.com
      4. 选择角色中,选择 Cloud KMS > Cloud KMS CryptoKey Encrypter/Decrypter
      5. 点击保存
    4. 重复上一步,授予插件创建者的账号访问权限。

    5. 返回到密钥管理页面,然后重新选择密钥。

    6. 选择显示信息面板。您会在角色/成员列中看到角色。

    gcloud

    1. 运行 gcloud kms keys add-iam-policy-binding 命令,向 Service Extensions 服务账号授予访问权限:

      gcloud kms keys add-iam-policy-binding [--project=PROJECT] KEY_NAME \
          --location LOCATION
          --keyring=KEYRING_NAME \
          --member=serviceAccount:service-PROJECT-NUMBER@gcp-sa-networkactions.iam.gserviceaccount.com \
          --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
      

      替换以下内容:

      • PROJECT:包含密钥的项目的 ID
      • KEY_NAME:密钥名称
      • LOCATION:密钥的位置
      • KEYRING_NAME:密钥环名称
      • PROJECT-NUMBER: Google Cloud 项目的项目编号
    2. 重复上一步,并将 member 设置为插件创建者的账号。

创建插件或更新插件时,请指定 CMEK 密钥。该密钥可为插件映像和配置数据提供加密功能。其他插件数据受 Google 默认加密保护。

自动重新加密

当 KMS 密钥的主版本发生更改时(无论是用户手动更改还是自动轮替),受该密钥保护的插件数据会自动使用新的密钥版本重新加密。

密钥跟踪

您可以使用密钥跟踪功能列出密钥所保护的插件资源。如需了解详情,请参阅查看密钥使用情况

Cloud Key Management Service 配额和服务扩展

在 Service Extensions 中使用 CMEK 密钥时(例如在以下操作中),您的项目可能会消耗 Cloud KMS 加密请求配额

  • 创建或更新受 CMEK 保护的插件
  • 添加新版本或更改受 CMEK 保护的插件的主要版本
  • 列出设置了 plugin_config_data 字段的受 CMEK 保护的插件的版本
  • 将插件附加到扩展程序

附加的插件还会随着时间的推移产生解密操作。

如果您使用硬件 (Cloud HSM) 或外部 (Cloud EKM) 密钥,则使用 CMEK 密钥执行的加密和解密操作会影响 Cloud KMS 配额。

移除对采用 CMEK 加密的插件的访问权限

您可以通过多种方式移除对采用 CMEK 加密的插件的访问权限:

我们建议您先撤消 Service Extensions 服务账号的权限,然后再停用或销毁密钥。

移除访问权限的影响

受 CMEK 保护的数据包括从 Artifact Registry 下载的映像,以及直接提供的任何插件配置数据(通过 plugin_config_data 字段)。

停用或销毁插件的加密密钥后,受 CMEK 保护的所有插件数据会在几分钟内变得无法访问。插件的密钥被撤消后,可能需要数十分钟时间,该插件的所有服务副本才会停止提供流量。

插件元数据(例如插件名称、说明、标签或日志记录配置)仍可访问。

因此,移除对保护有效插件(即附加到扩展程序的插件)的密钥的访问权限会导致该插件无法处理流量。对插件的所有请求都会失败。

当插件调用失败时,扩展程序的行为取决于 fail_open 字段:

  • 如果该字段设置为 true,则请求会继续发送到目标服务,而不会提供任何插件调用失败的指示。
  • 如果该字段设置为 false,则请求不会到达目标服务。

限制

  • 针对插件设置的 CMEK 保护仅限于 Service Extensions。

    如需保护其他 Google 产品上的插件资源,请通过这些产品启用 CMEK。对于上传到 Artifact Registry 的插件映像,请为 Artifact Registry 设置 CMEK。如需保护插件生成的日志,请为 Cloud Logging 配置 CMEK

  • 您无法更改插件的加密模式(Google 管理的加密密钥或 CMEK)。不过,您可以更新插件以使用其他 KMS 密钥。

  • 仅支持区域插件。此外,插件只能通过与插件位于同一区域的密钥进行加密。

接下来怎么做?