配置消息加密

本文档介绍了如何为 Google Cloud Managed Service for Apache Kafka 集群配置客户管理的加密密钥 (CMEK)。

Managed Service for Apache Kafka 默认使用 Google-owned and Google-managed encryption keys 对静态消息进行加密。无需进行额外设置即可使用 Google-owned and Google-managed encryption keys。

CMEK 简介

CMEK 是您拥有的加密密钥,在 Cloud Key Management Service (Cloud KMS) 中进行管理和存储。如果您需要更好地控制用于保护 Managed Service for Apache Kafka 静态数据的加密密钥,可以使用 CMEK。

如果您为 Managed Service for Apache Kafka 集群配置了 CMEK,该服务会自动使用指定的密钥加密所有静态集群数据。CMEK 的 Cloud KMS 使用量可能会产生额外费用,具体取决于您的使用模式。

与 Managed Service for Apache Kafka 集群关联的 CMEK 是密钥加密密钥 (KEK)。KEK 用于加密数据加密密钥 (DEK)。然后,DEK 用于读取和写入附加到代理的永久性磁盘上的静态数据,以及 Cloud Storage 中分层存储的数据。

如需详细了解磁盘加密,请参阅磁盘加密简介。如需详细了解 Cloud Storage 中的加密,请参阅 Cloud Storage 文档中的客户管理的加密密钥

轮替密钥

如需轮替密钥,可创建新密钥版本并将其设为相应密钥的主密钥版本。

对于附加到代理的磁盘,新的 KEK 仅在代理重启后生效。您可以通过更新集群的容量配置来强制对 broker 进行滚动重启。例如,您可以更改集群 RAM 量。

所有新的分区段文件都使用新的主密钥版本写入分层存储。选择新的主密钥版本后,可能会出现几分钟的延迟。

为 Managed Service for Apache Kafka 集群配置 CMEK

您可以使用Google Cloud 控制台或 Google Cloud CLI 为 Managed Service for Apache Kafka 集群配置 CMEK。

准备工作

完成以下任务:

  • 启用 Cloud KMS API。

  • 在 Cloud KMS 中创建密钥环和密钥。您无法删除密钥和密钥环。由于 Managed Service for Apache Kafka 资源是区域性的,因此我们建议您在 Kafka 集群所在的同一区域中创建 CMEK。

如需了解如何完成这些任务,请参阅 Cloud KMS 快速入门指南

配置 CMEK 所需的角色和权限

Managed Service for Apache Kafka 使用 Google Cloud 服务代理来访问 Cloud KMS。在您创建第一个 Managed Service for Apache Kafka 集群后,系统会自动为您的 Google Cloud项目创建服务代理。

Managed Service for Apache Kafka 会在内部为每个项目保存该服务代理,并且默认情况下不会在 Google Cloud 控制台的服务账号页面中显示该服务代理。

Managed Service for Apache Kafka 服务代理的格式为 service-PROJECT_NUMBER@gcp-sa-managedkafka.iam.gserviceaccount.com

Managed Service for Apache Kafka 需要特定权限才能使用 CMEK 加密和解密数据。

完成以下步骤,以设置所需的访问权限:

  1. 可选:使用 gcloud beta services identity create 命令手动创建 Managed Service for Apache Kafka 服务代理。

    如果您之前已在项目中创建集群,则 Managed Service for Apache Kafka 服务代理已在项目中创建,您可以跳过此步骤。

    gcloud beta services identity create \
        --service=managedkafka.googleapis.com \
        --project=PROJECT_ID
    

    PROJECT_ID 替换为您的项目 ID。

  2. 向 Managed Service for Apache Kafka 服务代理授予 Cloud KMS Crypto Key Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色。

    gcloud kms keys add-iam-policy-binding CLOUD_KMS_KEY_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-managedkafka.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    替换以下内容:

    • CLOUD_KMS_KEY_NAME:Cloud KMS 密钥的名称。

      密钥的格式为 projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY

      例如 projects/test-project/locations/us-central1/keyRings/test-keyring/cryptoKeys/test-key

    • PROJECT_NUMBER:Managed Service for Apache Kafka 项目的项目编号。

如需详细了解如何授予 IAM 角色,请参阅向资源授予角色

创建使用 CMEK 的集群

您可以在创建 Kafka 集群时使用 Google Cloud 控制台或 gcloud CLI 添加加密密钥。

Enable the Apache Kafka for BigQuery, Compute Engine, Cloud DNS, and Cloud KMS APIs.

Roles required to enable APIs

To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

Enable the APIs

在创建集群之前,请查看集群属性的相关文档。

如需创建启用 CMEK 的集群,请按以下步骤操作:

控制台

  1. 在 Google Cloud 控制台中,前往集群页面。

    前往“集群”

  2. 选择创建

    系统会打开创建 Kafka 集群页面。

  3. 对于集群名称,输入一个字符串。

    如需详细了解如何命名集群,请参阅 Managed Service for Apache Kafka 资源命名指南

  4. 位置部分中,输入受支持的位置。

    如需详细了解支持的位置,请参阅 支持的 Managed Service for Apache Kafka 位置

  5. 对于容量配置,请输入内存vCPU 的值。

    vCPU 与内存的比率必须介于 1:1 和 1:8 之间。

    如需详细了解如何确定 Managed Service for Apache Kafka 集群的大小,请参阅 规划 Kafka 集群大小

  6. 对于网络配置,请输入以下详细信息:
    1. 项目:子网所在的项目。 子网必须与集群位于同一区域,但项目可能不同。
    2. 网络:子网连接到的网络。
    3. 子网:子网的名称。
    4. 子网 URI 路径:系统会自动填充此字段。或者,您也可以在此处输入子网路径。子网的名称必须采用以下格式: projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_ID
    5. 点击完成
  7. (可选)点击添加已连接的子网,添加其他子网。

    您可以添加其他子网,但最多只能添加 10 个。

  8. 加密部分中,选择 Cloud KMS 密钥
  9. 密钥类型中,选择 Cloud KMS,然后在选择客户管理的密钥中,输入您创建的 CMEK。
  10. 点击创建

gcloud

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  1. 运行 gcloud managed-kafka clusters create 命令:

    gcloud managed-kafka clusters create CLUSTER_ID \
        --location=LOCATION \
        --cpu=CPU \
        --memory=MEMORY \
        --subnets=SUBNETS \
        --encryption-key=CLOUD_KMS_KEY \

    替换以下内容:

    • CLUSTER_ID:集群的 ID 或名称。

      如需详细了解如何命名集群,请参阅 Managed Service for Apache Kafka 资源命名指南

    • LOCATION:集群的位置。

      如需详细了解支持的位置,请参阅 支持的 Managed Service for Apache Kafka 位置

    • CPU:集群的虚拟 CPU 数量。vCPU 与内存的比率必须介于 1:1 到 1:8 之间。

      如需详细了解如何确定 Managed Service for Apache Kafka 集群的大小,请参阅 规划 Kafka 集群大小

    • MEMORY:集群的内存量。使用“MB”“MiB”“GB”“GiB”“TB”或“TiB”单位。例如,“10GiB”。

    • SUBNETS:要连接到的子网列表。 使用英文逗号分隔多个子网值。

      子网的格式为 projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_ID

    • ENCRYPTION_KEY:要用于集群的 CMEK 的 ID。

      格式为 projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY

确认集群创建

运行 gcloud managed-kafka clusters describe 命令,确认集群已配置为使用 CMEK。

gcloud managed-kafka clusters describe CLUSTER_ID \
    --location=LOCATION

输出包含已配置的 CMEK。

审核日志

当 Managed Service for Apache Kafka 启用密钥、停用密钥或使用密钥来加密和解密消息时,Cloud KMS 会生成审核日志。这在排查发布或传送问题时很有用。

Cloud KMS 密钥 ID 会附加到 Managed Service for Apache Kafka 集群资源的审核日志中。Managed Service for Apache Kafka 不会在审核日志中包含与 Cloud KMS 相关的任何其他信息。

停用并重新启用 CMEK

您可以通过两种方式停用 CMEK。选择以下方法之一:

  • 停用与集群相关联的 Cloud KMS 密钥。此方法会影响与该密钥关联的所有 Cloud 资源。

  • 使用 Identity and Access Management (IAM) 撤消 CryptoKey Encrypter/Decrypter 服务代理service-${PROJECT_NUMBER}@gcp-sa-managedkafka.iam.gserviceaccount.com此方法会影响项目中的所有 Managed Service for Apache Kafka 集群以及使用 CMEK 加密的消息。

虽然这两项操作均不能保证即时撤消访问权限,但 IAM 更改通常会传播得更快。

如需了解详情,请参阅 Cloud KMS 资源一致性访问权限更改传播

如果 Managed Service for Apache Kafka 无法访问 Cloud KMS 密钥,则消息发布和传送会失败并显示错误。如需继续传送和发布,请恢复对 Cloud KMS 密钥的访问权限

一旦 Managed Service for Apache Kafka 可以访问 Cloud KMS 密钥,系统就会在 12 小时内继续发布消息,并且在 2 小时内继续传送消息。

虽然间歇性 Cloud KMS 故障(持续时间不到 1 分钟)不太可能严重中断消息的发布和传送,但如果 Cloud KMS 长期不可用,则相当于撤消密钥。

限制

  • Cloud KMS 密钥与 Managed Service for Apache Kafka 集群之间的关联关系设定后不可更改。您无法更改与集群关联的密钥。不过,您可以创建新版本来轮替密钥

  • 如果您停用非主密钥版本,本地磁盘将继续正常运行,不会发生任何变化。每个代理在重新启动时都会下载新的 KEK。不过,Cloud Storage 无法访问使用原始版本加密的主题段文件,这可能会导致无法从这些段文件中使用消息。这意味着您可能无法使用旧数据。

  • 如果停用密钥的主要版本,broker 将无法向分层存储写入新的段文件,从而导致本地磁盘利用率提高。此外,代理重启也会失败。您可以随时主动触发重启,也可以随时由服务启动集群更新来触发重启。

  • 如果您移除 Managed Service for Apache Kafka 服务代理对某个密钥的访问权限,其行为与同时停用主密钥和非主密钥版本类似。

  • 如果您删除密钥,系统会安排关闭集群,并且无法恢复。

  • 您无法请求重新加密静态存储的数据。CMEK 可用作 KEK,但重新加密需要更改数据加密密钥。

Apache Kafka® 是 Apache Software Foundation 或其关联公司在美国和/或其他国家/地区的注册商标。