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

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

准备工作

  1. 登录您的 Google 帐号。

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

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

    转到项目选择器页面

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

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

    转到 Cloud IAM 页面

  6. 启用 Cloud Key Management Service API。

    启用 API

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

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

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

创建服务帐号

您需要为每个需要 CMEK 的项目创建一个服务帐号。目前,您只能使用 gcloud 命令行工具命令来为 CMEK 创建所需的服务帐号类型。

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

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

控制台

  1. 转到加密密钥页面。

    转到“加密密钥”页面

  2. 点击创建密钥环

  3. 添加密钥环名称

  4. 添加密钥环位置

  5. 点击创建。此时会打开创建密钥页面。

  6. 添加密钥名称

  7. 选择用途(对称或非对称)。

  8. 选择轮替周期开始日期

  9. 点击创建

  10. 密钥表上,点击最后一列中的三个点,然后选择复制资源 ID。这就是 KMS_RESOURCE_ID。创建 Cloud SQL 实例时,您需要提供 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
    

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

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

控制台

  1. 转到加密密钥页面。

    转到 Cloud KMS 页面

  2. 选择您为 CMEK 创建的密钥。

  3. 选择显示信息面板

  4. 点击添加成员

  5. 新成员中添加您创建的服务帐号名称。

  6. 选择角色中,选择 Cloud KMS > Cloud KMS CryptoKey Encrypter/Decrypter

  7. 点击保存

  8. 返回到加密密钥页面,然后重新选择密钥。

  9. 选择显示信息面板。您应该会在 **角色/成员** 列中看到角色。

GCLOUD

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 的实例,请按如下所述操作:

GCLOUD

gcloud sql instances create [INSTANCE_NAME] --project [PROJECT_ID] \
            --disk-encryption-key [KMS_RESOURCE_ID]

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 来加密备份。

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

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

当您创建 Cloud SQL 实例的读取副本时,该副本会继承与父实例相同的 CMEK。

请参阅创建读取副本

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

当您创建 Cloud SQL 实例的克隆时,该克隆会继承与用于加密来源实例的 CMEK 相同的 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 密钥版本位于全球区域或多区域中,则密钥不起作用。 在要创建实例的同一区域中创建密钥版本。请参阅创建密钥。请参阅备注。

后续步骤