本页面介绍了如何为 Google Cloud Managed Service for Apache Kafka 集群配置客户管理的加密密钥 (CMEK)。
消息加密概览
默认情况下,Managed Service for Apache Kafka 会使用 Google-owned and Google-managed encryption keys加密静态消息。无需进行额外设置。
如果您需要更好地控制用于保护 Managed Service for Apache Kafka 静态数据的加密密钥,可以在创建集群时设置 CMEK。CMEK 是您拥有的加密密钥。这些密钥在 Cloud Key Management Service (Cloud KMS) 中进行管理和存储。当您为集群配置 CMEK 时,该服务会自动使用该密钥对所有存储中的集群数据进行加密。使用 CMEK 可能会产生额外费用,具体取决于您的使用模式。
与 Managed Service for Apache Kafka 集群关联的 CMEK 是密钥加密密钥 (KEK)。KEK 用于加密数据加密密钥 (DEK)。然后,DEK 用于读取和写入附加到代理的永久性磁盘上的存储中的数据(静态数据),以及 Cloud Storage 中分层存储的数据。
由于 Managed Service for Apache Kafka 资源是区域性的,因此我们建议您在与 Kafka 集群相同的区域中创建 CMEK。
所需的角色和权限
Managed Kafka 服务账号必须有权使用 CMEK 加密和解密数据。
向服务账号授予 Cloud KMS 密钥上的 Cloud KMS Crypto Key Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色:
gcloud kms keys add-iam-policy-binding KEY \
--keyring=KEY_RING \
--location=LOCATION \
--member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-managedkafka.iam.gserviceaccount.com \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
替换以下内容:
KEY:密钥的名称。
KEY_RING:密钥环的名称,其中包含密钥。
LOCATION:密钥环的 Cloud KMS 位置。
PROJECT_NUMBER:包含 Managed Service for Apache Kafka 集群的Google Cloud 项目的项目编号。
如需详细了解如何向 Cloud KMS 密钥授予角色,请参阅向资源授予角色。
轮替密钥
您无法更改与集群关联的密钥。不过,您可以创建新的密钥版本并将其设置为主密钥,从而轮替密钥。
对于附加到代理的磁盘,新的 KEK 仅在代理重启后生效。您可以通过更新集群的容量配置来强制对 broker 进行滚动重启。例如,您可以更改集群 RAM 量。
所有新的分区段文件都使用新的主密钥版本写入分层存储。选择新的主密钥版本后,可能会出现几分钟的延迟。
审核日志
当 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) 撤消 Managed Service for Apache Kafka 服务代理的 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 长期不可用,则相当于撤消密钥。
限制
您无法更改与集群关联的密钥。不过,您可以创建新版本来轮替密钥。
如果您停用非主密钥版本,本地磁盘将继续正常运行,不会发生任何变化。每个代理在重启时都会下载新的 KEK。不过,Cloud Storage 无法访问使用原始版本加密的主题段文件,这可能会导致无法从这些段文件中使用消息。您可能无法使用旧数据。
如果停用密钥的主要版本,broker 将无法向分层存储写入新的段文件,这会增加本地磁盘利用率。此外,代理重启也会失败。您可以随时主动触发重启,也可以随时由服务启动集群更新来触发重启。
如果您移除 Managed Service for Apache Kafka 服务代理对密钥的访问权限,其行为与停用主密钥和非主密钥版本类似。
如果您删除密钥,系统会安排关闭集群,并且无法恢复。
您无法请求重新加密静态存储的数据。CMEK 可用作 KEK,但重新加密需要更改数据加密密钥。