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

本页面介绍如何为 CMEK 设置服务帐号和密钥,以及如何创建使用 CMEK 的实例。如需详细了解如何在 Cloud SQL 中使用 CMEK,请参阅 CMEK 概览

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 安装并初始化 Cloud SDK
  5. 确保您的用户帐号具有 Cloud SQL Admin 角色。

    转到 IAM 页面

  6. 启用 Cloud Key Management Service API。

    启用 API

  7. 启用 Cloud SQL Admin API。

    启用 API

创建具有 CMEK 的 Cloud SQL 实例的工作流

  1. 仅限 gcloud 和 API 用户:为每个需要 CMEK 的项目创建服务帐号
  2. 创建密钥环和密钥并为每个密钥设置位置。
  3. 仅限 gcloud 和 API 用户向服务帐号授予密钥访问权限
  4. 复制或记下密钥 ID (KMS_RESOURCE_ID) 和密钥的位置,以及密钥环的 ID (KMS_RESOURCE_ID)。您在向服务帐号授予密钥访问权限时需要此信息。
  5. 转到项目并使用以下选项创建 Cloud SQL 实例
    1. CMEK 所在的位置
    2. 客户管理的密钥配置
    3. CMEK ID

您的 Cloud SQL 实例现已启用 CMEK。

创建服务帐号

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

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

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

目前,您只能使用 gcloud 命令行工具命令来为 CMEK 创建所需的服务帐号类型。如果您使用的是控制台,则 Cloud SQL 会自动为您创建此服务帐号。

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

gcloud beta services identity create --service=sqladmin.googleapis.com \
             --project=[USER_PROJECT]

上述命令会按以下格式返回服务帐号名称:

service-[PROJECT_NUMBER]@gcp-sa-cloud-sql.iam.gserviceaccount.com

例如:

service-534582264470@gcp-sa-cloud-sql.iam.gserviceaccount.com

向服务帐号授予密钥访问权限的过程中,您将使用此服务帐号名称。

创建密钥

您可以在 Cloud SQL 实例所属的 Google Cloud 项目中创建密钥,也可以在单独的用户项目中创建密钥。Cloud KMS 密钥环的位置必须与您要在其中创建 Cloud SQL 实例的地区相匹配。多区域密钥或全球区域密钥将不会起作用。如果区域不匹配,Cloud SQL 实例创建请求会失败。

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

控制台

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

gcloud

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

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

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

如需向服务帐号授予访问权限,请执行以下操作:

  gcloud kms keys add-iam-policy-binding 
[KEY_NAME] --location [LOCATION] --keyring [KEY_RING_NAME]
--member serviceAccount:service-[PROJECT_NUMBER]@gcp-sa-cloud-sql.iam.gserviceaccount.com
--role roles/cloudkms.cryptoKeyEncrypterDecrypter

创建具有 CMEK 的 Cloud SQL 实例

如需创建具有 CMEK 的实例,请按如下所述操作:

控制台

  1. 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 点击创建实例
  3. 选择数据库引擎。
  4. 输入实例的名称。请勿在实例名称中包含敏感信息或个人身份信息,因为此名称对外可见。无需在实例名称中包含项目 ID。此 ID 将在适当的位置(例如在日志文件中)自动创建。
  5. 'root'@'%' 用户输入密码。
  6. 为您的实例设置区域。 将实例与访问实例的资源置于相同区域内。大多数情况下,您不需要指定地区。
  7. 配置选项下,选择所有配置选项,一直到机器类型和存储
  8. 展开机器类型和存储
  9. 加密下,选择客户管理的密钥
  10. 从下拉菜单中选择 KMS 密钥或手动输入 KMS_RESOURCE_ID。系统仅显示与该实例位于同一项目和区域的 KMS 密钥。如需选择属于其他项目但位于同一区域的 KMS 密钥,请选择“没有看到您的密钥?输入密钥资源 ID,然后输入之前捕获的 KMS_RESOURCE_ID。
  11. 如果该服务帐号无权使用所选密钥进行加密/解密,则会显示一条消息。如果发生这种情况,请点击授权,向服务帐号授予对所选 KMS 密钥的 IAM 角色。 IAM role on the selected KMS key.
  12. 选择配置选项后,点击创建
  13. 您将看到一条消息,说明使用 CMEK 的影响。阅读并确认该消息,以便进一步创建实例。

gcloud

  gcloud sql instances create [INSTANCE_NAME] \
  --project [PROJECT_ID] \
  --disk-encryption-key [KMS_RESOURCE_ID]
  --database-version=[VERSION]
  --tier= [MACHINE_TYPE] \
  --region=[REGION] \
  --root-password=[INSERT-PASSWORD-HERE]
  

cURL

如需创建具有 CMEK 的实例,请向命令传递 diskEncryptionConfiguration。此参数的值是您通过创建密钥过程获得的 KMS_RESOURCE_ID
  gcloud auth login
  ACCESS_TOKEN="$(gcloud auth print-access-token)"
  curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
       --header 'Content-Type: application/json' \
       --data '{"name":"[INSTANCE_NAME]", "region":"[REGION]",
                "diskEncryptionConfiguration" : {"kmsKeyName" : "[KMS_RESOURCE_ID]"},
                "settings": {"tier":"[MACHINE_TYPE]",
                "backupConfiguration": {"binaryLogEnabled":true, "enabled":true}}}' \
       -X POST \
       https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances
  
此 cURL命令使用 Instances:Insert

为启用了 CMEK 的实例创建备份

创建 Cloud SQL 实例的备份时,请使用与主实例的客户管理的密钥相同的主密钥版本来加密备份。

请参阅创建和管理按需备份与自动备份

您会在创建备份表单中看到一条消息:“您的备份将使用此实例的 CMEK 的主要版本进行加密。如果任何人销毁或停用此密钥版本,则使用此密钥版本加密的所有备份数据都将永久丢失。您可以在 Cloud KMS 中检查密钥的主要版本。”

在备份页面上,使用 CMEK 启用的备份列表有两个额外的列。一列显示备份用于启用 CMEK 的实例,一列显示用于加密备份的密钥版本。

为启用了 CMEK 的实例创建副本

在同一区域中创建 Cloud SQL 实例的读取副本时,该副本会继承与父实例相同的 CMEK。如果您在其他区域创建读取副本,系统会为您提供新的 CMEK 列表供您选择。每个区域使用自己的一组密钥。

请参阅创建读取副本

创建读取副本页面上,您会看到以下信息:

  1. 加密显示由客户管理
  2. 此时会显示副本的加密密钥
  3. 系统会显示一条消息:“您的副本将使用主实例的客户管理的密钥进行加密。如果任何人销毁此密钥,则使用此密钥加密的所有数据都将永久丢失。”

对于跨区域副本,您会看到以下消息:

“您的跨区域副本将使用所选的客户管理的密钥进行加密。如果任何人销毁此密钥,则使用此密钥加密的所有数据都将永久丢失。”

为启用了 CMEK 的实例创建克隆

当您创建 Cloud SQL 实例的克隆时,该克隆会继承与用于加密来源实例的 CMEK 相同的 CMEK。

请参阅克隆实例

创建克隆页面上,您会看到以下信息:

  1. 加密显示由客户管理
  2. 此时会显示克隆的加密密钥
  3. 系统会显示一条消息:“您的克隆将使用源实例的客户管理的密钥进行加密。如果任何人销毁此密钥,则使用此密钥加密的所有数据都将永久丢失。”

查看启用了 CMEK 的实例的密钥信息

成功创建 Cloud SQL 实例后,您可以查看实例列表或实例概览页面,了解该实例是使用 CMEK 创建的。详细信息还显示用于创建实例的密钥。

  1. 转到“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 在实例列表中,滚动到右侧,直到看到加密列。在此列中,您会看到由 Google 管理由客户管理

  3. 点击一个实例名称,打开其概览页面。配置窗格中会列出 CMEK。

停用和重新启用密钥版本

请参阅以下主题:

问题排查

本部分介绍在设置或使用启用了 CMEK 的实例时针对收到的错误消息要尝试的操作。

由于 Cloud KMS 错误以及缺少角色或权限,Cloud SQL 管理员操作(例如创建、克隆或更新)可能会失败。常见的失败原因如下:缺少 Cloud KMS 密钥版本;Cloud KMS 密钥版本已被停用或被销毁;IAM 权限不足,无法访问 Cloud KMS 密钥版本;或者 Cloud KMS 密钥版本与 Cloud SQL 实例位于不同的区域。请使用以下问题排查表来诊断和解决常见问题。

CMEK 问题排查表

错误… 可能的问题… 请尝试以下操作…
找不到各项产品和项目的服务帐号 服务帐号名称不正确。 确保您已为正确的用户项目创建了服务帐号。

转到“服务帐号”页面

无法向服务帐号授予访问权限 用户帐号无权授予对此密钥版本的访问权限。 为您的用户或服务帐号添加 Organization Administrator 角色。

转到“IAM 帐号”页面

Cloud KMS 密钥版本已被销毁 密钥版本已被销毁。 如果密钥版本遭到销毁,您就无法使用该版本来加密或解密数据。
Cloud KMS 密钥版本已停用 密钥版本已停用。 重新启用 Cloud KMS 密钥版本。

转到“加密密钥”页面

权限不足,无法使用 Cloud KMS 密钥 您用于对 Cloud SQL 实例运行操作的用户或服务帐号缺少 cloudkms.cryptoKeyEncrypterDecrypter 角色,或 Cloud KMS 密钥版本不存在。 为您的用户或服务帐号添加 cloudkms.cryptoKeyEncrypterDecrypter 角色。

转到“IAM 帐号”页面


如果您的帐号已具备此角色,请参阅创建密钥,了解如何创建新的密钥版本。请参阅备注。
找不到 Cloud KMS 密钥 密钥版本不存在。 创建新的密钥版本。请参阅创建密钥。 请参阅备注。
Cloud SQL 实例和 Cloud KMS 密钥版本位于不同区域 Cloud KMS 密钥版本和 Cloud SQL 实例必须位于同一区域。如果 Cloud KMS 密钥版本位于全球区域或多区域中,则密钥不起作用。 在要创建实例的同一区域中创建密钥版本。请参阅创建密钥。请参阅备注。

后续步骤