客户管理的加密密钥

设置

本页面讨论客户管理的加密密钥及其如何在 Cloud Storage 中使用它们。如需了解其他加密选项,请参阅数据加密选项

概览

如果您需要更好地控制标准 Cloud Storage 加密所允许的密钥操作,可以使用客户管理的加密密钥。这些密钥是使用 Cloud Key Management Service (Cloud KMS) 创建和管理的,并且您需要将密钥作为软件密钥存储在 HSM 集群中或存储在外部。您可以在单个对象上使用客户管理的加密密钥,或将存储桶配置为在添加到存储桶的所有新对象上默认使用密钥

使用 CMEK 时,Cloud Storage 会在对象存储到存储桶中时使用该密钥加密对象,并且 Cloud Storage 会在对象传送给请求者时自动解密对象。

何时使用密钥?

将 CMEK 应用于对象时,Cloud Storage 会在加密以下内容时使用该密钥:

  • 对象的数据。
  • 对象的 CRC32C 校验和。
  • 对象的 MD5 哈希值。

Cloud Storage 使用标准服务器端密钥加密对象的其余元数据,包括对象的名称。因此,如果您有足够的权限,即使停用或销毁关联的 CMEK 后,也可以执行诸如读取大部分元数据、列出对象和删除对象等操作。

服务代理

每个项目都有一个特殊的 Cloud Storage 服务账号,称为“服务代理”,该账号使用客户管理的加密密钥 (CMEK) 执行加密和解密。在您授权服务代理访问加密密钥之后,该服务代理会加密以下对象:

在 Cloud Storage 中添加或重写对象时,如果您既在存储桶上设置了默认密钥,又在请求中包含了特定的密钥,Cloud Storage 会使用该特定密钥加密对象。

当请求者想要读取使用 CMEK 加密的对象时,他们只需照常访问该对象即可。在执行此类请求的过程中,服务代理会自动解密请求者请求的对象,前提是满足以下条件:

  • 服务代理仍有权使用密钥进行解密。
  • 您尚未停用或销毁密钥。

如果未满足其中任何一个条件,则服务代理不会解密数据,请求将失败。

限制

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

  • 您无法通过更新对象的元数据来使用 CMEK 加密对象。在对象的重写过程中将该密钥包含在内。

    • gcloud storage 使用 objects update 命令在对象上设置加密密钥,但该命令会在请求中重写对象。
  • 您必须在要加密的数据所在的位置创建 Cloud KMS 密钥环。例如,如果您的存储桶位于 US-EAST1,用于加密其中对象的任何密钥环也必须在 US-EAST1 中创建。

    • 对于大多数双区域,您必须在关联的多区域中创建 Cloud KMS 密钥环。例如,如果您的存储桶位于 US-EAST1US-WEST1 对中,则用于加密其中对象的任何密钥环必须在 US 多区域中创建。

    • 对于 ASIA1EUR4NAM4 预定义的双区域,您必须在同一预定义的双区域中创建密钥环。

      如需了解可用的 Cloud KMS 位置,请参阅 Cloud KMS 位置

  • Cloud KMS 加密和解密费率受配额限制。

  • 使用 JSON API 列出对象时,系统不会返回使用客户管理的加密密钥加密的对象的 CRC32C 校验和和 MD5 哈希。

    • 在适当的情况下,某些工具(例如 gcloud storage)会对使用 CMEK 加密的每个对象执行额外的元数据 GET 请求,以检索 CRC32C 和 MD5 信息。与列出使用标准 Cloud Storage 加密方法加密的对象相比,这些额外的请求可能会大大降低列出的速度。
  • Cloud Storage 不能使用存储在 Cloud KMS 中的非对称密钥的解密部分,按照与 CMEK 相同的方式自动解密相关对象。

与客户提供的加密密钥之间的关系

除了客户管理的加密,Cloud Storage 还提供客户提供的加密密钥作为控制数据加密的手段。您可以使用不同的加密方法加密单个存储桶中的不同对象,但请注意以下事项:

  • 一次只能通过其中一种方法加密单个对象。

  • 如果为您的存储桶设置了默认的客户管理的密钥,而您在请求中指定了客户提供的密钥,则 Cloud Storage 会使用客户提供的密钥来加密对象。

密钥管理

本部分讨论在轮替密钥、替换密钥以及停用或销毁密钥版本时的注意事项。

密钥轮替

Cloud KMS 支持自动和手动将密钥轮替到新的版本。轮替密钥后,Cloud Storage 会对使用该密钥进行加密的所有操作使用新版本,这些操作的示例如下:

  • 目标存储桶使用该密钥作为其默认加密密钥时的对象上传操作。

  • 在操作中明确使用该密钥的对象上传、复制和重写操作。

以前的密钥版本不会被停用或销毁,因此 Cloud Storage 仍然可以对之前使用这些版本加密的现有对象进行解密。

密钥替换

在将加密 Cloud Storage 对象所用的密钥替换为新密钥时,请遵循以下准则:

  1. 检查您的存储桶,以查看哪些存储桶使用该密钥作为其默认加密密钥。对于这些存储桶,请将旧密钥替换为新密钥。

    这样可以确保写入相应存储桶的所有对象以后都使用新密钥。

  2. 检查源代码,了解哪些请求在正进行的操作(例如设置存储桶配置以及上传、复制或重写对象)中使用该密钥。请更新这些实例以使用新密钥。

  3. 在所有存储桶中检查使用旧密钥加密的对象。通过 Rewrite Object 方法,使用新密钥重新加密每个对象。

  4. 停用旧密钥的所有版本。停用旧密钥版本后,请监控客户端和服务日志,以发现因版本不可用而失败的操作。

停用或销毁密钥版本

  • 停用销毁特定密钥版本后,您无法对当前使用该密钥版本加密的任何对象进行解密。

    例如,您无法下载、复制或重写对象;如果您尝试执行此类操作,则会导致错误。

    • 如果您停用了密钥版本,则可以重新启用它。重新启用后,您可以访问由该密钥版本加密的对象。

    • 如果您销毁了密钥版本,则无法再次下载使用该版本进行加密的对象。

    在停用或销毁密钥版本之前,您应该识别所有存储桶中使用该特定密钥版本进行加密的所有对象。识别后,请通过 Rewrite Object 方法,使用新的密钥版本、全新的密钥或服务器端密钥重新加密每个对象。

  • 停用或销毁密钥的主要版本后,您在拥有新的主要版本之前无法使用该密钥进行加密。例如,如果没有主要版本,则会出现以下情况:

    • 您无法在对象上传、复制或重写过程中指定该密钥。

    • 您无法将对象上传、复制或重写到将该密钥设置为默认加密密钥的存储桶,除非您在操作过程中指定了其他有效的密钥。

    一旦您拥有密钥的主要版本,使用该密钥加密对象的操作就会成功。

    在停用或销毁作为密钥主要版本的密钥版本之前,您应首先停止将其用作主要版本。您可以通过以下方式之一执行此操作:

    • 将其替换为新的主要版本(通常是通过执行密钥轮替来实现)。
    • 移除您在其中使用该密钥进行加密的实例。执行此操作后,Cloud Storage 会改用服务器端密钥来进行加密。

密钥版本和锁定的对象

如果密钥版本加密锁定的对象,则由于该对象存储在具有锁定保留政策的存储桶中,或者由于该对象具有自己的锁定保留配置,因此只有在满足以下条件时才能销毁密钥版本:

  • 加密对象的保留到期时间必须是过去的时间。
  • 加密对象不得设置任何对象保全

所有相关对象都满足了这些条件后,就可以销毁密钥版本,即使不删除对象也是如此。否则,受影响的对象数据将永远无法访问。

后续步骤