客户管理的加密密钥 (CMEK) 简介

默认情况下,Cloud SQL for MySQL 会对以静态方式存储的客户内容进行加密。Cloud SQL for MySQL 会为您处理加密,您无需执行任何其他操作。此选项称为 Google 默认加密

如果您想要控制加密密钥,则可以将 Cloud KMS 中客户管理的加密密钥 (CMEK) 与集成 CMEK 的服务(包括 Cloud SQL for MySQL)结合使用。使用 Cloud KMS 密钥时,您可以控制其保护级别、位置、轮替时间表、使用和访问权限以及加密边界。此外,您还可使用 Cloud KMS 跟踪密钥使用情况、查看审核日志并控制密钥生命周期。这样您就可以在 Cloud KMS 中控制和管理用于保护您数据的对称密钥加密密钥 (KEK),而不是由 Google 拥有和管理这些密钥。

使用 CMEK 设置资源后,访问 Cloud SQL for MySQL 资源的体验与使用 Google 默认加密功能类似。如需详细了解加密选项,请参阅客户管理的加密密钥 (CMEK)

将 CMEK 与 Cloud KMS Autokey 结合使用

您可以手动创建 CMEK 以保护 Cloud SQL for MySQL 资源,也可以使用 Cloud KMS Autokey。借助 Autokey,在 Cloud SQL for MySQL 中创建资源时,系统会按需生成密钥环和密钥。系统会创建使用密钥执行加密和解密操作的服务代理(如果它们尚不存在),并授予所需的 Identity and Access Management (IAM) 角色。如需了解详情,请参阅 Autokey 概览

Autokey 不会为 Cloud SQL for MySQL BackupRun 资源创建密钥。创建 Cloud SQL for MySQL 实例的备份时,系统会使用主实例的客户管理密钥加密备份。

只有在使用 Terraform 或 REST API 创建资源时,Cloud SQL for MySQL 才与 Cloud KMS Autokey 兼容。

如需了解如何使用手动创建的 CMEK 来保护 Cloud SQL for MySQL 资源,请参阅使用客户管理的加密密钥 (CMEK)

如需使用 Cloud KMS Autokey 创建的 CMEK 来保护 Cloud SQL for MySQL 资源,请使用将 Autokey 与 Secret Manager 资源结合使用中针对 Secret Manager 提供的步骤作为示例。

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

下图分别展示了在使用默认 Google 加密与使用 CMEK 时,静态数据加密在 Cloud SQL 实例中的工作原理。

不使用 CMEK

数据会上传到 Google,然后进行分块,每个区块使用自己的数据加密密钥进行加密。数据加密密钥使用密钥加密密钥进行封装。如果使用默认 Google 加密,系统会从 Google 的内部密钥库检索密钥加密密钥。加密的区块和封装的加密密钥分布在 Google 的存储基础架构中。

使用 CMEK

数据会上传到 Google,然后进行分块,每个区块使用自己的数据加密密钥进行加密。数据加密密钥使用密钥加密密钥进行封装。通过使用 Cloud KMS 的 CMEK,系统会从 Cloud KMS 中检索密钥加密密钥。加密的区块和封装的加密密钥分布在 Google 的存储基础架构中。

在解密使用 CMEK 封装的数据时,Cloud SQL 会使用 KEK 来解密 DEK,并使用未加密的 DEK 来解密静态数据。

数据区块使用 DEK 进行加密,使用封装的 DEK 进行存储。系统会将解封 DEK 的请求发送到 KMS 存储空间,该存储空间用于存储不可导出的 KEK。KMS 存储空间返回解封后的 DEK。

Cloud SQL 何时与 CMEK 密钥进行交互?

操作 备注
创建实例 在创建实例期间,您可以将实例配置为使用 CMEK。
创建备份 在对启用了 CMEK 的实例进行备份期间,CMEK 会加密用户查询和响应等用户数据。启用了 CMEK 的实例中的备份会继承与来源实例具有相同 Cloud KMS 密钥的加密。
恢复实例 在对启用了 CMEK 的实例进行恢复期间,Cloud SQL 会使用该密钥访问待恢复的备份实例上的数据。当恢复到不同实例时,目标实例可使用不同的密钥进行加密。
创建副本 在同一区域中创建 Cloud SQL 实例的读取或故障切换副本时,该副本会从父实例继承 CMEK。如果您在不同区域中创建读取或故障切换副本,则必须从其他区域选择 CMEK。每个区域都使用自己的一组密钥。
创建克隆 启用了 CMEK 的实例中的克隆会继承与来源实例具有相同 Cloud KMS 密钥的 CMEK 加密。
更新实例 在对启用了 CMEK 的实例进行更新期间,Cloud SQL 会检查 CMEK 密钥。

哪些位置支持启用了 CMEK 的 Cloud SQL 实例?

CMEK 在所有 Cloud SQL 实例位置均可用。

服务账号简介

在 Cloud SQL 实例启用 CMEK 后,您需要使用服务账号向 Cloud KMS 请求密钥访问权限。

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

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

密钥简介

在 Cloud KMS 中,您需要创建一个包含加密密钥的密钥环,并设置位置。在创建新的 Cloud SQL 实例时,您可以选择使用此密钥来加密该实例。

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

CMEK 使用以下格式:

projects/[KMS_PROJECT_ID]/locations/[LOCATION]/keyRings/[KEY_RING]/cryptoKeys/[KEY_NAME]

如果 Cloud SQL 无法访问密钥(例如,您停用密钥版本),则 Cloud SQL 将暂停该实例。该密钥再次可供访问后,Cloud SQL 会自动恢复该实例。

轮替密钥时,使用该密钥加密的实例不会自动使用新的主密钥版本重新加密。您可以使用新的主密钥版本重新加密任何现有 CMEK 主实例或副本。如需详细了解如何在密钥轮替后重新加密 Cloud SQL 实例或副本,请参阅重新加密现有的启用了 CMEK 的实例或副本

外部密钥管理器

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

Key Access Justifications

您可以在 Cloud EKM 中使用 Key Access Justifications。Key Access Justifications 使您可以查看每个 Cloud EKM 请求的原因。此外,根据提供的理由,您可以自动批准或拒绝请求。如需了解详情,请参阅 Key Access Justifications 概览

因此,Key Access Justifications 通过为每次解密数据的尝试提供理由来提供对数据的额外控制。

如需了解如何将密钥与 Cloud SQL 实例搭配使用,请参阅创建具有 CMEK 的 Cloud SQL 实例

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

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

如何为启用了 CMEK 的实例导出和导入数据?

如果您希望在导出或导入期间仍使用客户管理的密钥加密数据,则必须先在 Cloud Storage 存储桶上设置 CMEK,然后再将数据导出到其中。如果数据此前存储在启用了 CMEK 的实例上,则将数据导入到新实例时不存在特殊要求或限制。

限制

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

  • 您无法在现有实例上启用 CMEK。
  • 您无法为与主实例位于同一区域的副本分配其他密钥。对于跨区域副本,您需要为副本区域创建新密钥。
  • 您无法为克隆分配其他密钥。
  • 您无法使用 CMEK 进行加密:
    • 外部服务器(外部主实例和外部副本)
    • 实例元数据,例如实例 ID、数据库版本、机器类型、标志、备份时间表等。
  • 您无法使用 CMEK 来加密传输中的用户数据,例如用户查询和响应。
  • 创建 Cloud SQL 实例后,您将无法更改加密密钥类型。您无法从 Google 管理的加密密钥切换到 Cloud Key Management Service (KMS) 密钥,反之亦然。

后续步骤