配置消息加密

本文档介绍了如何配置客户管理的加密 用于 Pub/Sub 的密钥 (CMEK)。

Pub/Sub 使用 默认情况下由 Google 拥有和 Google 管理的密钥。无需进行额外设置 才能使用 Google 管理的加密密钥。

CMEK 简介

CMEK 是您拥有、管理和存储在其中的加密密钥 Cloud Key Management Service (Cloud KMS)。如果您需要更好地控制 用于保护 Pub/Sub 的加密密钥 则可以使用 CMEK。有些组织还强制要求使用 CMEK

借助 CMEK,您可以完全控制加密密钥,从而管理其密钥 生命周期、轮替和访问权限政策。在配置过程中 使用 CMEK 的 Pub/Sub,该服务会自动加密 使用指定键的所有数据。Cloud KMS 用量 CMEK 可能会产生额外费用,具体取决于您的使用模式。

每封邮件都会按以下状态和层加密:

在应用层,Pub/Sub 会在收到消息后立即对每条消息进行单独加密。此实现增加了以下功能:

适用于 Pub/Sub 的 CMEK

Pub/Sub 通过 CMEK 使用信封加密模式。在此方法中,Cloud KMS 不会对消息进行加密。Cloud KMS 用于对 Pub/Sub 为每个主题创建的 DEK(数据加密密钥)进行加密。这些 DEK 仅由 Pub/Sub 以加密(封装)形式存储。存储 DEK 之前,服务会将 DEK 发送到 Cloud KMS,以便使用在主题上指定的 KEK(密钥加密密钥)对 DEK 进行加密。系统大约每六个小时就会为每个主题生成一个新的 DEK。

Pub/Sub 向订阅发布消息之前,会使用系统为相应主题生成的最新 DEK 对消息进行加密。Pub/Sub 会在消息传送前不久对其进行解密 订阅者。

准备工作

您可以使用 Google Cloud 控制台或 Google Cloud CLI。

完成以下任务:

  • 启用 Cloud KMS API。

  • 在 Cloud KMS 中创建密钥环和密钥。键和键 环。

有关如何完成这些任务的说明,请参阅 Cloud KMS 快速入门指南

由于 Pub/Sub 资源是全球性的,因此我们强烈建议您使用全局 Cloud KMS 密钥配置启用了 CMEK 的主题。根据主题发布者和订阅者的位置,使用区域性 Cloud KMS 密钥可能会产生对跨区域网络链接的依赖,而这种依赖其实是不必要的。

配置 CMEK 所需的角色和权限

Pub/Sub 使用 Google Cloud Service Agent 访问 Cloud KMS。该服务代理由 每个项目都有 Pub/Sub, Google Cloud 控制台页面。

Pub/Sub 服务代理的格式如下: service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com

Pub/Sub 需要特定权限才能加密和 使用 CMEK 解密数据。

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

  • 向 Pub/Sub 服务代理授予 Cloud KMS 加密密钥加密者/解密者 (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色。

    gcloud kms keys add-iam-policy-binding CLOUD_KMS_KEY_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.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: Pub/Sub 项目。

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

使用 CMEK 配置主题

您可以使用 Google Cloud 控制台或 gcloud CLI。

控制台

如需使用 CMEK 创建主题,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,转到 Pub/Sub 主题页面。

    转到“主题”

  2. 点击创建主题

  3. 主题 ID 字段中,输入主题的 ID。

    如需详细了解如何为主题命名,请参阅命名准则

  4. 对于加密,点击 Cloud KMS 密钥

  5. 选择密钥类型。如果没有看到选择客户管理的 key 下拉列表,请确保您已针对 项目。

  6. 点击创建主题

gcloud

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 如需创建具有 CMEK 的主题,请运行 gcloud pubsub topics create 命令:

        gcloud pubsub topics create TOPIC_ID --topic-encryption-key=ENCRYPTION_KEY
        

    替换以下内容:

    • TOPIC_ID:主题的 ID 或名称。

      有关如何命名主题的详情,请参见 关于命名主题、订阅、架构或快照的指南

    • ENCRYPTION_KEY:要用于主题的 CMEK 的 ID。

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

更新主题的 CMEK

您可以灵活地更改与 Pub/Sub 主题。您可以使用 gcloud CLI 更新 CMEK。 不过,此更改不溯及既往。

在密钥更改之前发布到该主题的消息仍将使用 原始密钥。如果创建的主题没有 CMEK,您可以稍后添加。 现有邮件会继续受到由 Google 管理的默认 加密。更改主题的 CMEK 不会重新加密之前发布的 消息。这些邮件将继续使用 凭据最初加密时使用的是

Pub/Sub 为密钥使用 大约 5 分钟。对于 Pub/Sub 识别并开始使用新密钥版本。

审核日志

启用密钥、停用密钥或 Pub/Sub 使用密钥对消息进行加密和解密时,Cloud KMS 会生成审核日志。这在排查发布或传送问题时很有用。

Cloud KMS 密钥会附加到 Pub/Sub 主题资源的审核日志中。Pub/Sub 不包含与 Cloud KMS 相关的任何其他信息。

价格和费用

对于以下 Pub/Sub 请求,使用 CMEK 会产生基于 Pub/Sub 价格的 Cloud KMS 服务使用费:

  • 对于使用 CMEK 的每个主题,系统每六个小时会对新的 DEK 进行加密和存储。

  • 系统每六分钟会使用该密钥对 DEK 进行解密。解密操作会执行三次(运行 Pub/Sub 服务的区域中的每个地区执行一次)。

例如,假设有一个主题,该主题具备以下条件:

  • 至少有一个订阅

  • 发布者和订阅者客户端位于同一区域

Cloud KMS 加密操作的数量可按以下公式估算:

1 key access for ENCRYPT * (30 days / month * 24 hours / day) / 6 hours
 + 3 key accesses for DECRYPT
   * (30 days / month * 24 hours / day * 60 minutes / hour ) / 6 minutes
   = 21,720 Cloud KMS key access events
给定的价格结构,其中加密操作 每 10,000 次操作花费 $0.03,上述使用费用约为 $0.07。 如需了解最新信息,请参阅 Cloud KMS 价格 定价信息。

实际上,提取密钥的频率可能会更高或更低,具体取决于访问模式。请仅将这些数字用作估算值。

监控和问题排查

密钥访问问题可能会产生以下影响:

  • 消息传送延迟

  • 发布出错

您可以使用以下指标监控发布和拉取请求错误(按 response_classresponse_code 分组):

  • topic/send_request_count
  • subscription/pull_request_count
  • subscription/streaming_pull_response_count

StreamingPull 响应的错误率为 100%。这表示视频流已结束,并不表示请求 出现故障如需监控 StreamingPull,请查找 FAILED_PRECONDITION 响应代码。

发布和消息传送可能会因多个原因而失败并显示 FAILED_PRECONDITION 错误。

对于推送订阅,无法直接检测特定于 CMEK 的传送问题。请改用以下方法:

  • 使用 subscription/num_unacked_messages 监控推送订阅积压输入量的大小和存在时长。

  • 监控 subscription/oldest_unacked_message_age 是否存在异常峰值。

  • 使用发布错误和 CMEK 审核日志来发现问题。

停用和重新启用密钥

您可以通过以下两种方法阻止 Pub/Sub 对消息数据进行解密:

虽然这两项操作均无法确认即时访问权限撤消, IAM 更改通常传播得更快。学习内容 请参阅 Cloud KMS 资源一致性访问变更传播

如果 Pub/Sub 无法访问 Cloud KMS 密钥,则使用 StreamingPull 或拉取方法发布和传送消息的操作将失败,并显示 FAILED_PRECONDITION 错误。向推送端点传送消息的操作将停止。要恢复传送和发布,请恢复对 Cloud KMS 密钥的访问

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

即使间歇性服务中断不到一分钟 Cloud KMS 会显著中断发布和传送,扩展了 Cloud KMS unavailability 与撤消密钥具有相同的效果。