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

概览

本页面介绍了如何将 CMEK 与 Datastream 配合使用。

CMEK 是否适合您?

CMEK 适用于拥有敏感或受监管数据且需要管理其加密密钥的组织。

Google 管理的加密与客户管理的加密

借助 CMEK 功能,您可以为 Datastream 中的静态数据使用自己的加密密钥。添加 CMEK 后,无论何时进行 API 调用,Datastream 都可以使用您的密钥来访问数据。

Datastream 使用 Google 管理的数据加密密钥 (DEK) 和密钥加密密钥 (KEK) 来加密 Datastream。因此存在两层加密:

  1. DEK 加密数据。
  2. KEK 加密 DEK。

Datastream 将加密的 DEK 与加密的数据一起存储,而 Google 管理 Google KEK。借助 CMEK,您可以创建封装 Google KEK 的密钥。借助 CMEK,您可以创建、撤消和删除 KEK。

CMEK(包括软件、硬件和外部密钥)均通过 Cloud Key Management Service (KMS) API 进行管理。

哪些位置支持启用了 CMEK 的 Datastream 数据流?

CMEK 在所有 Datastream 位置均可用。

了解服务账号

如果您的 Datastream 数据流启用了 CMEK,您需要使用服务账号从 Cloud Key Management Service 请求密钥访问权限。

如需在项目上使用 CMEK,您必须拥有服务账号,并且必须向服务账号授予密钥访问权限。该服务账号必须存在于项目内。该服务账号在所有区域均可见。

如果您使用控制台创建数据流,则 Datastream 会在您首次选择客户管理的密钥选项时自动创建服务账号(如果服务账号尚不存在)。当 Datastream 自动创建服务账号时,您不需要对您的用户账号具有特殊权限。

了解密钥

Cloud Key Management Service 中,您需要创建一个包含加密密钥的密钥环,并设置位置。在 Datastream 中创建新数据流时,您可以选择此密钥来加密该数据流。

在创建使用 CMEK 的新数据流时,您需要知道密钥 ID 和密钥区域。您必须将新数据流放在与数据流关联的 CMEK 所在的区域中。您可以为密钥和数据流创建一个项目,也可以为它们分别创建不同的项目。

CMEK 使用以下格式:

projects/[CMEK_ENABLED_PROJECT]/locations/[REGION]/keyRings/[RING_NAME]/cryptoKeys/[KEYNAME]

如果 Datastream 无法访问密钥(例如,您停用密钥版本),则 Datastream 会将数据流状态更改为 FAILED,并显示关联的错误消息。在排查与错误消息关联的任何问题后,密钥可以再次访问,因此 Datastream 会自动恢复数据流。

外部密钥管理器

您可以使用存储在外部密钥管理器(例如 Fortinix、Ionic 或 Thales)中的密钥作为 CMEK。如需了解如何将外部密钥与 Cloud Key Management Service 搭配使用,请参阅 Cloud External Key Manager

如何使 CMEK 加密的数据永远无法访问?

您可能遇到这样的情况,即您需要永久销毁使用 CMEK 加密的数据。为此,您需要销毁 CMEK 版本。您不能销毁密钥环或密钥,但可以销毁密钥的密钥版本。

限制

使用 CMEK 时,存在以下限制:

  • 您无法在正在运行的数据流上更新 CMEK。

  • 虽然您可以使用 CMEK 加密源数据库中的行,但您无法使用这些密钥来加密数据流元数据,例如数据流 ID、源数据库的 IP 地址、源数据库表的名称等。

使用 CMEK

现在您已经了解了 CMEK,接下来就可以为 CMEK 设置服务账号和密钥了。此外,您将学习如何设置 Datastream 以使用 CMEK。如需详细了解 CMEK,请参阅概览

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 安装并初始化 Cloud SDK
  7. 确保您已为您的用户账号分配 Datastream Admin 角色。

    转到 IAM 页面

  8. Enable the Cloud Key Management Service API.

    Enable the API

  9. 启用 Datastream API。

    启用 API

使用 CMEK 在 Datastream 中创建数据流的工作流

  1. 仅限 gcloud 和 API 用户:确保每个需要 CMEK 的项目都有一个服务账号。如果尚未创建该服务账号,请参阅创建服务账号
  2. 创建密钥环和密钥并为每个密钥设置位置。该位置指的是 Google Cloud 区域。
  3. 仅限 gcloud 和 API 用户向服务账号授予密钥访问权限
  4. 复制或记下密钥 ID (KMS_KEY_ID) 和密钥的位置,以及密钥环的 ID (KMS_KEYRING_ID)。您在向服务账号授予密钥访问权限时需要此信息。
  5. 转到项目并使用以下选项在 Datastream 中创建流
    1. CMEK 所在的位置
    2. CMEK 配置
    3. CMEK ID

Datastream 中的数据流现已通过 CMEK 启用。

创建服务账号

您需要为每个需要 CMEK 的项目创建一个服务账号。

要允许用户管理服务账号,请授予以下角色之一:

  • Service Account User (roles/iam.serviceAccountUser):包括列出服务账号、获取服务账号的详细信息以及模拟服务账号的权限。
  • Service Account Admin (roles/iam.serviceAccountAdmin):包括列出服务账号和获取服务账号的详细信息的权限。此外,还包括创建、更新和删除服务账号的权限,以及查看或更改服务账号的 Datastream 政策的权限。

目前,您只能使用 gcloud 命令创建 CMEK 所需的服务账号类型。如果您使用的是 Console,则 Datastream 会自动为您创建此服务账号。

如需使用 gcloud 创建服务账号,请运行以下命令:

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

上述命令会返回服务账号名称。在向服务账号授予密钥访问权限的过程中,您将使用此服务账号名称。

创建密钥

您可以在 Datastream 中的数据流所属的 Google Cloud 项目中创建密钥,也可以在单独的用户项目中创建密钥。Cloud KMS 密钥环的位置必须与您要在其中创建数据流的区域相匹配。多区域密钥或全球区域密钥将不会起作用。如果区域不匹配,则无法创建数据流。

如需创建 Cloud KMS 密钥,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往加密密钥页面。
  2. 点击创建密钥环
  3. 添加密钥环名称。请记下此名称,因为您在向服务账号授予密钥访问权限时需要用到此名称。
  4. 添加密钥环位置
  5. 点击创建。此时会打开创建密钥页面。
  6. 添加密钥名称
  7. 选择用途(对称或非对称)。
  8. 选择轮替周期开始日期
  9. 点击创建
  10. 密钥表上,点击最后一列中的三个点,然后选择复制资源 ID 或将其记录下来。这是 KMS_KEY_ID。在向服务账号授予密钥访问权限时,您需要 KMS_KEY_ID

gcloud

  1. 创建新的密钥环。
    gcloud kms keyrings create KMS_KEYRING_ID \
    --location=GCP_REGION
      
    记录此名称,因为您在向服务账号授予密钥访问权限时需要用到此名称。
  2. 针对该密钥环创建密钥。
    gcloud kms keys create KMS_KEY_ID \
    --location=GCP_REGION \
    --keyring=KMS_KEYRING_ID \
    --purpose=encryption
      
    记录此名称,因为您在向服务账号授予密钥访问权限时需要用到此名称。

向服务账号授予密钥访问权限

您只需在使用 gcloud 或 API 时执行此过程。

如需向服务账号授予访问权限,请使用以下代码:

gcloud kms keys add-iam-policy-binding KMS_KEY_ID \
--location=GCP_REGION \
--keyring=KMS_KEYRING_ID \
--member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-datastream.iam.gserviceaccount.com \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter

使用 CMEK 在 Datastream 中创建数据流

作为在 Datastream 中创建数据流的一部分,您可以使用 CMEK 管理数据的加密。

后续步骤