本页面介绍如何为 CMEK 设置服务帐号和密钥,以及如何创建使用 CMEK 的实例。如需详细了解如何在 Cloud SQL 中使用 CMEK,请参阅 CMEK 概览。
准备工作
-
登录您的 Google 帐号。
如果您还没有 Google 帐号,请注册新帐号。
-
在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能。
- 安装并初始化 Cloud SDK。
- 确保您的用户帐号具有 Cloud SQL Admin 角色。
- 启用 Cloud Key Management Service API。
- 启用 Cloud SQL Admin API。
创建具有 CMEK 的 Cloud SQL 实例的工作流
- 仅限 gcloud 和 API 用户:为每个需要 CMEK 的项目创建服务帐号。
- 创建密钥环和密钥并为每个密钥设置位置。
- 仅限 gcloud 和 API 用户:向服务帐号授予密钥访问权限。
- 复制或记下密钥 ID (KMS_RESOURCE_ID) 和密钥的位置,以及密钥环的 ID (KMS_RESOURCE_ID)。您在向服务帐号授予密钥访问权限时需要此信息。
- 转到项目并使用以下选项创建 Cloud SQL 实例:
- CMEK 所在的位置
- 客户管理的密钥配置
- 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 密钥,请执行以下操作:
控制台
- 转到加密密钥页面。
转到“加密密钥”页面 - 点击创建密钥环。
- 添加密钥环名称。记录此名称,因为您在向服务帐号授予密钥访问权限时需要用到此名称。
- 添加密钥环位置。
- 点击创建。此时会打开创建密钥页面。
- 添加密钥名称。
- 选择用途(对称或非对称)。
- 选择轮替周期和开始日期。
- 点击创建。
- 在密钥表上,点击最后一列中的三个点,然后选择复制资源 ID 或将其记录下来。这就是 KMS_RESOURCE_ID。在向服务帐号授予密钥访问权限时,您需要 KMS_RESOURCE_ID。
gcloud
- 创建新的密钥环。
gcloud kms keyrings create [KEYRING_NAME] --location [LOCATION]
记录此名称,因为您在向服务帐号授予密钥访问权限时需要用到此名称。 - 针对该密钥环创建密钥。
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 的实例,请按如下所述操作:
控制台
- 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。
- 点击创建实例。
- 选择数据库引擎。
- 输入实例的名称。请勿在实例名称中包含敏感信息或个人身份信息,因为此名称对外可见。无需在实例名称中包含项目 ID。此 ID 将在适当的位置(例如在日志文件中)自动创建。
- 为
'root'@'%'
用户输入密码。 - 为您的实例设置区域。 将实例与访问实例的资源置于相同区域内。大多数情况下,您不需要指定地区。
- 在配置选项下,选择所有配置选项,一直到机器类型和存储。
- 展开机器类型和存储。
- 在加密下,选择客户管理的密钥。
- 从下拉菜单中选择 KMS 密钥或手动输入 KMS_RESOURCE_ID。系统仅显示与该实例位于同一项目和区域的 KMS 密钥。如需选择属于其他项目但位于同一区域的 KMS 密钥,请选择“没有看到您的密钥?输入密钥资源 ID,然后输入之前捕获的 KMS_RESOURCE_ID。
- 如果该服务帐号无权使用所选密钥进行加密/解密,则会显示一条消息。如果发生这种情况,请点击授权,向服务帐号授予对所选 KMS 密钥的 IAM 角色。
IAM role on the selected KMS key. - 选择配置选项后,点击创建。
- 您将看到一条消息,说明使用 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]
REST v1beta4
如需创建具有 CMEK 的实例,请向命令传递diskEncryptionConfiguration
。
在使用下面的请求数据之前,请先进行以下替换:
- project-id:项目 ID
- instance-id:实例 ID
- region:区域
- database-version:Emum 版本字符串(例如 MYSQL_8_0)
- kms-resource-id:您通过创建密钥收到的 ID。
HTTP 方法和网址:
POST https://www.googleapis.com/sql/v1beta4/projects/project-id/instances
请求 JSON 正文:
{ "name":"instance-id", "region":"region", "databaseVersion": "database-version", "diskEncryptionConfiguration" : { "kmsKeyName" : "kms-resource-id" }, "settings": { "backupConfiguration": { "binaryLogEnabled": true, "enabled":true } } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "kind": "sql#operation", "targetLink": "https://www.googleapis.com/sql/v1beta4/projects/project-id/instances", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-16T02:32:12.281Z", "operationType": "UPDATE", "name": "operation-id", "targetId": "instance-id", "selfLink": "https://www.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id", "targetProject": "project-id" }
为启用了 CMEK 的实例创建备份
创建 Cloud SQL 实例的备份时,请使用与主实例的客户管理的密钥相同的主密钥版本来加密备份。
请参阅创建和管理按需备份与自动备份。
您会在创建备份表单中看到一条消息:“您的备份将使用此实例的 CMEK 的主要版本进行加密。如果任何人销毁或停用此密钥版本,则使用此密钥版本加密的所有备份数据都将永久丢失。您可以在 Cloud KMS 中检查密钥的主要版本。”
在备份页面上,使用 CMEK 启用的备份列表有两个额外的列。一列显示备份用于启用 CMEK 的实例,一列显示用于加密备份的密钥版本。
为启用了 CMEK 的实例创建副本
在同一区域中创建 Cloud SQL 实例的读取副本时,该副本会继承与父实例相同的 CMEK。如果您在其他区域创建读取副本,系统会为您提供新的 CMEK 列表供您选择。每个区域使用自己的一组密钥。
请参阅创建读取副本。
在创建读取副本页面上,您会看到以下信息:
- 加密显示由客户管理。
- 此时会显示副本的加密密钥。
- 系统会显示一条消息:“您的副本将使用主实例的客户管理的密钥进行加密。如果任何人销毁此密钥,则使用此密钥加密的所有数据都将永久丢失。”
对于跨区域副本,您会看到以下消息:
“您的跨区域副本将使用所选的客户管理的密钥进行加密。如果任何人销毁此密钥,则使用此密钥加密的所有数据都将永久丢失。”
为启用了 CMEK 的实例创建克隆
当您创建 Cloud SQL 实例的克隆时,该克隆会继承与用于加密来源实例的 CMEK 相同的 CMEK。
请参阅克隆实例。
在创建克隆页面上,您会看到以下信息:
- 加密显示由客户管理。
- 此时会显示克隆的加密密钥。
- 系统会显示一条消息:“您的克隆将使用源实例的客户管理的密钥进行加密。如果任何人销毁此密钥,则使用此密钥加密的所有数据都将永久丢失。”
查看启用了 CMEK 的实例的密钥信息
成功创建 Cloud SQL 实例后,您可以查看实例列表或实例概览页面,了解该实例是使用 CMEK 创建的。详细信息还显示用于创建实例的密钥。
转到“Cloud SQL 实例”页面。
在实例列表中,滚动到右侧,直到看到加密列。在此列中,您会看到由 Google 管理和由客户管理。
点击一个实例名称,打开其概览页面。配置窗格中会列出 CMEK。
停用和重新启用密钥版本
请参阅以下主题:
问题排查
本部分介绍在设置或使用启用了 CMEK 的实例时针对收到的错误消息要尝试的操作。
由于 Cloud KMS 错误以及缺少角色或权限,Cloud SQL 管理员操作(例如创建、克隆或更新)可能会失败。常见的失败原因如下:缺少 Cloud KMS 密钥版本;Cloud KMS 密钥版本已被停用或被销毁;IAM 权限不足,无法访问 Cloud KMS 密钥版本;或者 Cloud KMS 密钥版本与 Cloud SQL 实例位于不同的区域。请使用以下问题排查表来诊断和解决常见问题。
CMEK 问题排查表
错误… | 可能的问题… | 请尝试以下操作… |
---|---|---|
找不到各项产品和项目的服务帐号 | 服务帐号名称不正确。 | 确保您已为正确的用户项目创建了服务帐号。 |
无法向服务帐号授予访问权限 | 用户帐号无权授予对此密钥版本的访问权限。 | 为您的用户或服务帐号添加 Organization Administrator 角色。 |
Cloud KMS 密钥版本已被销毁 | 密钥版本已被销毁。 | 如果密钥版本遭到销毁,您就无法使用该版本来加密或解密数据。 |
Cloud KMS 密钥版本已停用 | 密钥版本已停用。 | 重新启用 Cloud KMS 密钥版本。 |
权限不足,无法使用 Cloud KMS 密钥 | 您用于对 Cloud SQL 实例运行操作的用户或服务帐号缺少 cloudkms.cryptoKeyEncrypterDecrypter 角色,或 Cloud KMS 密钥版本不存在。 |
为您的用户或服务帐号添加 cloudkms.cryptoKeyEncrypterDecrypter 角色。如果您的帐号已具备此角色,请参阅创建密钥,了解如何创建新的密钥版本。请参阅备注。 |
找不到 Cloud KMS 密钥 | 密钥版本不存在。 | 创建新的密钥版本。请参阅创建密钥。 请参阅备注。 |
Cloud SQL 实例和 Cloud KMS 密钥版本位于不同区域 | Cloud KMS 密钥版本和 Cloud SQL 实例必须位于同一区域。如果 Cloud KMS 密钥版本位于全球区域或多区域中,则密钥不起作用。 | 在要创建实例的同一区域中创建密钥版本。请参阅创建密钥。请参阅备注。 |