本页面讨论客户管理的加密密钥及其如何在 Cloud Storage 中使用它们。如需了解其他加密选项,请参阅数据加密选项。
概览
如果您需要更好地控制标准 Cloud Storage 加密所允许的密钥操作,可以使用客户管理的加密密钥。这些密钥是使用 Cloud Key Management Service (Cloud KMS) 创建和管理的,并且您需要将密钥作为软件密钥存储在 HSM 集群中或存储在外部。您可以在单个对象上使用客户管理的加密密钥,或将存储桶配置为在添加到存储桶的所有新对象上默认使用密钥。
使用 CMEK 时,Cloud Storage 会在对象存储到存储桶中时使用该密钥加密对象,并且 Cloud Storage 会在对象传送给请求者时自动解密对象。
您可以直接创建 CMEK,也可以使用 Cloud KMS Autokey(预览版)代表您创建这些密钥。如需了解详情,请参阅 Autokey 概览。
何时使用密钥?
将 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-EAST1
和US-WEST1
对中,则用于加密其中对象的任何密钥环必须在US
多区域中创建。对于
ASIA1
、EUR4
和NAM4
预定义的双区域,您必须在同一预定义的双区域中创建密钥环。如需了解可用的 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 对象所用的密钥替换为新密钥时,请遵循以下准则:
检查您的存储桶,以查看哪些存储桶使用该密钥作为其默认加密密钥。对于这些存储桶,请将旧密钥替换为新密钥。
这样可以确保写入相应存储桶的所有对象以后都使用新密钥。
检查源代码,了解哪些请求在正进行的操作(例如设置存储桶配置以及上传、复制或重写对象)中使用该密钥。请更新这些实例以使用新密钥。
在所有存储桶中检查使用旧密钥加密的对象。通过 Rewrite Object 方法,使用新密钥重新加密每个对象。
停用旧密钥的所有版本。停用旧密钥版本后,请监控客户端和服务日志,以发现因版本不可用而失败的操作。
停用或销毁密钥版本
停用或销毁特定密钥版本后,您无法对当前使用该密钥版本加密的任何对象进行解密。
例如,您无法下载、复制或重写对象;如果您尝试执行此类操作,则会导致错误。
如果您停用了密钥版本,则可以重新启用它。重新启用后,您可以访问由该密钥版本加密的对象。
如果您销毁了密钥版本,则无法再次下载使用该版本进行加密的对象。
在停用或销毁密钥版本之前,您应该识别所有存储桶中使用该特定密钥版本进行加密的所有对象。识别后,请通过 Rewrite Object 方法,使用新的密钥版本、全新的密钥或服务器端密钥重新加密每个对象。
停用或销毁密钥的主要版本后,您在拥有新的主要版本之前无法使用该密钥进行加密。例如,如果没有主要版本,则会出现以下情况:
您无法在对象上传、复制或重写过程中指定该密钥。
您无法将对象上传、复制或重写到将该密钥设置为默认加密密钥的存储桶,除非您在操作过程中指定了其他有效的密钥。
一旦您拥有密钥的主要版本,使用该密钥加密对象的操作就会成功。
在停用或销毁作为密钥主要版本的密钥版本之前,您应首先停止将其用作主要版本。您可以通过以下方式之一执行此操作:
密钥版本和锁定的对象
如果密钥版本加密锁定的对象,则由于该对象存储在具有锁定保留政策的存储桶中,或者由于该对象具有自己的锁定保留配置,因此只有在满足以下条件时才能销毁密钥版本:
- 加密对象的保留到期时间必须是过去的时间。
- 加密对象上不得设置任何对象保全。
所有相关对象都满足了这些条件后,就可以销毁密钥版本,即使不删除对象也是如此。如果您这样做,受影响的对象数据将永久无法访问。
后续步骤
- 在您的 Cloud Storage 存储桶和对象上设置 CMEK。
- 详细了解 Cloud Storage 中的加密。
- 详细了解 Cloud KMS。