本页介绍了如何为 Spanner 使用手动创建的客户管理的加密密钥 (CMEK)。
如需详细了解 CMEK,请参阅 客户管理的加密密钥 (CMEK) 概览。
创建启用 CMEK 的数据库
在 Cloud Key Management Service (Cloud KMS) 中创建一个密钥。Spanner 支持创建以下 Cloud KMS 类型:
密钥必须与 Spanner 实例位于同一位置。例如,如果您的 Spanner 实例配置位于
us-west1
,则您的 Cloud KMS 密钥环位置也必须是us-west1
。并非每个 Spanner 多区域实例配置都有相应的 Cloud KMS 密钥环位置。对于采用自定义、双区域或多区域实例配置的 Spanner 数据库,您可以使用多个区域性(单区域)Cloud KMS 密钥来保护数据库。例如:
- 如果您的 Spanner 数据库采用多区域实例配置
nam14
,则可以在us-east4
、northamerica-northeast1
和us-east1
中创建 Cloud KMS 密钥。 - 如果您的数据库采用使用
nam3
的自定义实例配置 作为基本实例配置,并在us-central2
,那么您可以在us-east4
中创建 Cloud KMS 密钥,us-east1
、us-central1
和us-central2
。
可选:如需查看 Spanner 实例配置中的副本位置列表,请使用
gcloud spanner instances get-locations
命令:gcloud spanner instances get-locations <var>INSTANCE_ID</var>
如需了解详情,请参阅以下资源:
- 如果您的 Spanner 数据库采用多区域实例配置
向 Spanner 授予对密钥的访问权限。
在 Cloud Shell 中,创建并显示服务代理,或者如果该账号已存在,则显示该账号:
gcloud beta services identity create --service=spanner.googleapis.com \ --project=PROJECT_ID
如果系统提示您安装 gcloud Beta 命令组件,请输入
Y
。安装后,该命令会自动重启。通过
gcloud services identity
命令会创建或获取 服务代理 Spanner 可用于访问 Cloud KMS 密钥, 。服务账号 ID 的格式与电子邮件地址类似:
Service identity created: service-xxx@gcp-sa-spanner.iam.gserviceaccount.com
将 Cloud KMS CryptoKey Encrypter/Decrypter (
cloudkms.cryptoKeyEncrypterDecrypter
) 角色授予 Spanner 实例配置中每个区域 (--location
) 的服务账号。为此,请运行gcloud kms keys add-iam-policybinding
命令:gcloud kms keys add-iam-policy-binding KMS_KEY \ --location KMS_KEY_LOCATION \ --keyring KMS_KEY_RING \ --project=PROJECT_ID \ --member serviceAccount:service-xxx@gcp-sa-spanner.iam.gserviceaccount.com \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
以下是输出示例:
Updated IAM policy for key [KMS_KEY]
如果您使用多个 Cloud KMS 密钥来保护数据库,请针对所有密钥运行
gcloud kms keys add-iam-policybinding
命令。此角色可确保服务账号同时拥有 使用 Cloud KMS 密钥进行加密和解密。如需了解详情,请参阅 Cloud KMS 权限和角色。
创建数据库并指定您的 Cloud KMS 密钥。
控制台
使用控制台在区域实例配置中创建数据库。
在 Google Cloud 控制台中,进入实例页面。
点击要在其中创建数据库的实例。
点击创建数据库并填写必填字段。
点击显示加密选项。
选择 Cloud KMS 密钥。
从下拉列表中选择一个密钥。
密钥列表仅限于当前 Google Cloud 项目。如需使用其他 Google Cloud 项目中的密钥,请使用 gcloud CLI 而不是 Google Cloud 控制台来创建数据库。
创建数据库后,您可以通过查看数据库概览页面来验证该数据库是否为启用 CMEK 的数据库。
gcloud
在单区域、自定义或多区域中创建启用了 CMEK 的数据库
实例配置,请运行 gcloud spanner databases create
命令:
gcloud spanner databases create DATABASE \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID \
--ddl="CREATE TABLE Users (Id INT64 NOT NULL, FirstName STRING(100) NOT NULL, LastName STRING(100) NOT NULL,) PRIMARY KEY (Id)" \
--kms-project=KMS_PROJECT_ID \
--kms-location=KMS_KEY_LOCATION \
--kms-keyring=KMS_KEYRING \
--kms-keys=KMS_KEY_1[, KMS_KEY_2 ... ]
如需验证数据库是否启用了 CMEK,请运行
gcloud spanner databases describe
命令:
gcloud spanner databases describe DATABASE \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID
启用 CMEK 的数据库包含一个 encryptionConfig
字段,如以下示例输出所示:
encryptionConfig:
kmsKeyNames:projects/my-kms-project/locations/eur5/keyRings/my-kms-key-ring/cryptoKeys/my-kms-key
name: projects/my-spanner-project/instances/my-instance/databases/my-db
state: READY
客户端库
C#
如需在区域级实例配置中创建支持 CMEK 的数据库,请执行以下操作:
C++
如需在区域级实例配置中创建支持 CMEK 的数据库,请执行以下操作:
Go
如需在单区域实例配置中创建启用 CMEK 的数据库,请执行以下操作:
Java
如需在区域级实例配置中创建支持 CMEK 的数据库,请执行以下操作:
Node.js
如需在区域级实例配置中创建支持 CMEK 的数据库,请执行以下操作:
PHP
如需在单区域实例配置中创建启用 CMEK 的数据库,请执行以下操作:
Python
如需在区域级实例配置中创建支持 CMEK 的数据库,请执行以下操作:
Ruby
如需在区域级实例配置中创建支持 CMEK 的数据库,请执行以下操作:
查看正在使用的密钥版本
数据库的 encryption_info
字段会显示密钥版本的相关信息。
当数据库的密钥版本发生更改时,更改不会立即传播
发送至 encryption_info
。更改可能会延迟一段时间才会反映在此字段中。
控制台
在 Google Cloud 控制台中,进入实例页面。
点击包含您要查看的数据库的实例。
点击数据库。
加密信息显示在数据库详细信息页面上。
gcloud
您可以通过运行 gcloud spanner databases describe
或 gcloud spanner databases list
命令来获取数据库的 encryption_info
。例如:
gcloud spanner databases describe DATABASE \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID
以下是输出示例:
name: projects/my-project/instances/test-instance/databases/example-db
encryptionInfo:
- encryptionType: CUSTOMER_MANAGED_ENCRYPTION
kmsKeyVersion: projects/my-kms-project/locations/my-kms-key1-location/keyRings/my-kms-key-ring1/cryptoKeys/my-kms-key1/cryptoKeyVersions/1
- encryptionType: CUSTOMER_MANAGED_ENCRYPTION
kmsKeyVersion: projects/my-kms-project/locations/my-kms-key2-location/keyRings/my-kms-key-ring2/cryptoKeys/my-kms-key2/cryptoKeyVersions/1
停用密钥
按照每个密钥版本的下列说明,停用正在使用的密钥版本。
等待更改生效。停用密钥可能需要长达 3 小时来完成传播。
如需确认数据库是否不再可访问,请在已停用 CMEK 的数据库中执行查询:
gcloud spanner databases execute-sql DATABASE \ --project=SPANNER_PROJECT_ID \ --instance=INSTANCE_ID \ --sql='SELECT * FROM Users'
系统会显示以下错误消息:
KMS key required by the Spanner resource is not accessible.
启用密钥
按照每个密钥版本的说明,启用数据库正在使用的密钥版本。
等待更改生效。启用密钥可能需要长达 3 小时才能完成传播。
如需确认数据库是否不再可访问,请在启用 CMEK 的数据库中执行查询:
gcloud spanner databases execute-sql DATABASE \ --project=SPANNER_PROJECT_ID \ --instance=INSTANCE_ID \ --sql='SELECT * FROM Users'
如果更改生效,则该命令会成功执行。
备份数据库
您可以使用 Spanner 备份为数据库创建备份。默认情况下,系统会创建 使用相同的加密配置 数据库本身(可选)可为备份指定不同的加密配置。
控制台
使用控制台在区域实例配置中创建备份。
在 Google Cloud 控制台中,进入实例页面。
点击包含要备份的数据库的实例名称。
点击相应数据库。
在导航窗格中,点击备份/恢复。
在备份标签页中,点击创建备份。
输入备份名称,然后选择失效日期。
可选:点击显示加密选项。
a. 如果您想为备份使用其他加密配置,请点击使用现有加密配置旁边的滑块。
a. 选择 Cloud KMS 密钥。
a. 从下拉列表中选择一个键。
密钥列表仅限于当前 Google Cloud 项目。如需使用其他 Google Cloud 项目中的密钥,请创建 使用 gcloud CLI Google Cloud 控制台。
点击创建。
备份表会显示每个备份的加密信息。
gcloud
在单区域、自定义或多区域中创建启用了 CMEK 的备份
实例配置,请运行 gcloud spanner backups create
命令:
gcloud spanner backups create BACKUP \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID \
--database=DATABASE \
--retention-period=RETENTION_PERIOD \
--encryption-type=customer_managed_encryption \
--kms-project=KMS_PROJECT_ID \
--kms-location=KMS_KEY_LOCATION \
--kms-keyring=KMS_KEY_RING \
--kms-keys=KMS_KEY_1[, KMS_KEY_2 ... ]
--async
如需验证创建的备份是否采用了 CMEK 加密,请执行以下操作:
gcloud spanner backups describe BACKUP \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID
客户端库
C#
如需在单区域实例配置中创建启用了 CMEK 的备份,请执行以下操作:
C++
如需在单区域实例配置中创建启用了 CMEK 的备份,请执行以下操作:
Go
如需在单区域实例配置中创建启用了 CMEK 的备份,请执行以下操作:
Java
如需在区域级实例配置中创建启用了 CMEK 的备份,请执行以下操作:
Node.js
如需在区域级实例配置中创建启用了 CMEK 的备份,请执行以下操作:
PHP
如需在单区域实例配置中创建启用了 CMEK 的备份,请执行以下操作:
Python
如需在区域级实例配置中创建启用了 CMEK 的备份,请执行以下操作:
Ruby
如需在区域级实例配置中创建启用了 CMEK 的备份,请执行以下操作:
复制备份
您可以复制备份 将 Spanner 数据库从一个实例复制到另一个实例 其他区域或项目。默认情况下,复制的备份使用与其来源备份加密相同的加密配置(Google 管理或客户管理)。您可以通过在复制备份时指定不同的加密配置来替换此行为。如果您希望 复制备份以进行跨区域复制时使用 CMEK 加密,请指定 与目标区域对应的 Cloud KMS 密钥。
控制台
使用控制台在区域实例配置中复制备份。
在 Google Cloud 控制台中,进入实例页面。
点击包含要备份的数据库的实例名称。
点击相应数据库。
在导航窗格中,点击备份/恢复。
在备份表中,选择备份的操作,然后点击复制。
选择目标实例、提供名称并选择备份副本的到期日期,以填写表单。
可选:如果您想为备份使用其他加密配置,请点击显示加密选项。
a. 选择 Cloud KMS 密钥。
a. 从下拉列表中选择一个键。
密钥列表仅限于当前 Google Cloud 项目。如需使用其他 Google Cloud 项目中的密钥,请创建 使用 gcloud CLI Google Cloud 控制台。
点击复制。
gcloud
如需将具有新加密配置的备份复制到同一项目中的其他实例,请运行以下 gcloud spanner backups copy
命令:
gcloud spanner backups copy --async \
--source-instance=INSTANCE_ID \
--source-backup=SOURCE_BACKUP_NAME \
--destination-instance=DESTINATION_INSTANCE_ID \
--destination-backup=DESTINATION_BACKUP_NAME \
--expiration-date=EXPIRATION_DATE \
--encryption-type=CUSTOMER_MANAGED_ENCRYPTION \
--kms-keys=KMS_KEY_1[, KMS_KEY_2 ... ]
将采用新加密配置的备份复制到其他实例
在其他项目中,请运行以下 gcloud spanner backups copy
命令:
gcloud spanner backups copy --async \
--source-backup=SOURCE_BACKUP_NAME \
--destination-backup=DESTINATION_BACKUP_NAME \
--encryption-type=CUSTOMER_MANAGED_ENCRYPTION \
--kms-keys=KMS_KEY_1[, KMS_KEY_2 ... ]
如需验证复制的备份是否经过 CMEK 加密,请执行以下操作:
gcloud spanner backups describe BACKUP \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID
使用备份进行恢复
您可以将 Spanner 数据库的备份恢复到新数据库。默认情况下 使用相同的加密配置从备份恢复 作为备份本身,但您可以通过指定 为恢复的数据库使用不同的加密配置。如果备份受 CMEK 保护,则用于创建备份的密钥版本必须可用才能进行解密。
控制台
使用控制台在区域级实例配置中恢复备份。
在 Google Cloud 控制台中,进入实例页面。
点击包含您要恢复的数据库的实例。
点击相应数据库。
在导航窗格中,点击备份/恢复。
在备份表格中,为备份选择操作,然后点击 恢复。
选择要恢复的实例并命名所恢复的数据库。
可选:如果您想为已恢复的数据库使用其他加密配置,请点击使用现有加密旁边的滑块。
a. 选择 Cloud KMS 密钥。
a. 从下拉列表中选择一个键。
密钥列表仅限于当前 Google Cloud 项目。如需使用其他 Google Cloud 项目中的密钥,请创建 使用 gcloud CLI Google Cloud 控制台。
点击恢复。
gcloud
如需使用新的加密配置恢复备份,请运行以下 gcloud spanner databases restore
命令:
gcloud spanner databases restore --async \
--project=SPANNER_PROJECT_ID \
--destination-instance=DESTINATION_INSTANCE_ID \
--destination-database=DESTINATION_DATABASE_ID \
--source-instance=SOURCE_INSTANCE_ID \
--source-backup=SOURCE_BACKUP_NAME
如需验证恢复的数据库是否采用了 CMEK 加密,请执行以下操作:
gcloud spanner databases describe DATABASE \
--project=SPANNER_PROJECT_ID \
--instance=INSTANCE_ID
如需了解详情,请参阅使用备份进行恢复。
客户端库
C#
如需在区域性实例配置中恢复启用了 CMEK 的备份,请执行以下操作:
C++
如需在区域级实例配置中恢复启用了 CMEK 的备份,请执行以下操作:
Go
如需在区域级实例配置中恢复启用了 CMEK 的备份,请执行以下操作:
Java
如需在区域级实例配置中恢复启用了 CMEK 的备份,请执行以下操作:
Node.js
如需在区域性实例配置中恢复启用了 CMEK 的备份,请执行以下操作:
PHP
如需在区域级实例配置中恢复启用了 CMEK 的备份,请执行以下操作:
Python
如需在区域性实例配置中恢复启用了 CMEK 的备份,请执行以下操作:
Ruby
如需在区域级实例配置中恢复启用了 CMEK 的备份,请执行以下操作:
查看 Cloud KMS 密钥的审核日志
确保针对您的项目中的 Cloud KMS API 启用日志记录。
在 Google Cloud 控制台中,打开日志浏览器。
通过将以下行添加到查询构建器,将日志条目限制为 Cloud KMS 密钥:
resource.type="cloudkms_cryptokey" resource.labels.location="KMS_KEY_LOCATION" resource.labels.key_ring_id="KMS_KEY_RING_ID" resource.labels.crypto_key_id="KMS_KEY_ID"
在正常操作下,系统会使用
INFO
严重程度记录加密和解密操作。当 Spanner 实例中的可用区轮询 Cloud KMS 密钥时(大约每 5 分钟一次),系统会记录这些条目。如果 Spanner 无法访问密钥,系统就会记录操作 名称:
ERROR
。