本页面介绍了如何搭配 Cloud Storage 使用 Cloud Key Management Service 加密密钥,内容包括该功能的使用入门、如何在存储分区上使用默认密钥以及如何向各个对象添加密钥。Cloud KMS 加密密钥是“客户管理的加密密钥”,该密钥由 Cloud KMS 创建并由您负责管理。如需详细了解此功能(包括支持此功能的国家/地区),请参阅客户管理的加密密钥。如需了解 Cloud Storage 中的其他加密选项,请参阅数据加密选项。
前提条件
在 Cloud Storage 中使用此功能之前,您应该先做好以下准备:
为将用于存储您的加密密钥的项目启用 Cloud KMS API。
对将用于存储您的加密密钥的项目拥有足够的权限:
如果您拥有将用于存储您的密钥的项目,那么您很可能已具备必要的权限。
如果您计划创建新的加密密钥环和密钥,则应具备
cloudkms.keyRings.create
和cloudkms.cryptoKey.create
权限。无论您是计划使用新的密钥环和密钥还是现有的密钥环和密钥,您都应对将用于加密的密钥具有
cloudkms.cryptoKey.setIamPolicy
权限。此权限可让您为 Cloud Storage 服务帐号提供 Cloud KMS 密钥的访问权限。
roles/cloudkms.admin
角色拥有上述权限。如需了解如何获取此角色或其他 Cloud KMS 角色,请参阅将 IAM 与 Cloud KMS 搭配使用。
对 Cloud Storage 存储分区中的对象具备足够的使用权限:
拥有 Cloud KMS 密钥环,并且该密钥环中至少包含一个密钥。
为服务帐号分配 Cloud KMS 密钥
要使用客户管理的加密密钥,您必须向 Cloud Storage 服务帐号授予使用 Cloud KMS 密钥的权限。
Console
- 在 Google Cloud Platform Console 中打开 Cloud Key Management Service 密钥浏览器。
打开 Cloud KMS 密钥浏览器 点击包含所需密钥的密钥环的名称。
选中所需密钥对应的复选框。
右侧窗格中的权限标签变为可用。
在添加成员对话框中,指定要授予访问权限的 Cloud Storage 服务帐号的电子邮件地址。
在选择角色下拉列表中,选择 Cloud KMS CryptoKey Encrypter/Decrypter。
点击添加。
gsutil
使用 gsutil kms authorize
命令,向与您的存储分区关联的服务帐号授予使用 Cloud KMS 密钥加密和解密对象的权限:
gsutil kms authorize -p [PROJECT_STORING_OBJECTS] -k [KEY_RESOURCE]
其中:
[PROJECT_STORING_OBJECTS]
是包含待加密或解密对象的项目的 ID,例如my-pet-project
。[KEY_RESOURCE]
是您的 Cloud KMS 密钥资源,例如projects/my-pet-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key
。
如果您想移除授予的权限,则需要使用 gcloud
命令行工具或 Google Cloud Platform Console。
代码示例
C#
如需了解详情,请参阅 Cloud Storage C# API 参考文档。
Go
如需了解详情,请参阅 Cloud Storage Go API 参考文档。
Java
如需了解详情,请参阅 Cloud Storage Java API 参考文档。
Node.js
如需了解详情,请参阅 Cloud Storage Node.js API 参考文档。
PHP
如需了解详情,请参阅 Cloud Storage PHP API 参考文档。
Python
如需了解详情,请参阅 Cloud Storage Python API 参考文档。
Ruby
如需了解详情,请参阅 Cloud Storage Ruby API 参考文档。
REST API
JSON API
- 从 OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
创建一个包含以下信息的 .json 文件:
{ "policy": { "bindings": { "role": "roles/cloudkms.cryptoKeyEncrypterDecrypter", "members": "[SERVICE_ACCOUNT_EMAIL_ADDRESS]" }, } }
其中,
[SERVICE_ACCOUNT_EMAIL_ADDRESS]
是与您的服务帐号相关联的电子邮件地址,例如service-7550275089395@my-pet-project.iam.gserviceaccount.com
。使用
cURL
,通过POST setIamPolicy
请求调用 Cloud KMS API:curl -X POST --data-binary @[JSON_FILE_NAME].json \ -H "Authorization: Bearer [OAUTH2_TOKEN]" \ -H "Content-Type: application/json" \ "https://cloudkms.googleapis.com/v1/[KEY_RESOURCE]:setIamPolicy"
其中:
[JSON_FILE_NAME]
是您在第 2 步中创建的文件的名称。[OAUTH2_TOKEN]
是您在第 1 步中生成的访问令牌。[KEY_RESOURCE]
是您的 Cloud KMS 密钥资源,例如projects/my-pet-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key
。
XML API
您不能使用 XML API 将 Cloud KMS 分配给服务帐号。请使用其他 Cloud Storage 工具,例如 gsutil。
使用默认加密密钥
添加或更改存储分区的默认密钥
如需添加或更改在将对象写入存储分区时默认使用的 Cloud KMS 密钥,请执行以下操作:
Console
- 在 Google Cloud Platform Console 中打开 Cloud Storage 浏览器。
打开 Cloud Storage 浏览器 在存储分区列表中,点击所需的存储分区。
点击页面顶部的修改存储分区。
在“修改存储分区”页面中,点击可展开的显示高级设置。
如果存储分区当前未使用 Cloud KMS 密钥,请选择客户管理的密钥单选按钮。
在与客户管理的密钥关联的下拉菜单中,选择一个可用密钥。
点击保存。
gsutil
使用 gsutil kms encryption
命令:
gsutil kms encryption -k [KEY_RESOURCE] gs://[BUCKET_NAME]
其中:
[KEY_RESOURCE]
是您的 Cloud KMS 密钥资源,例如projects/my-pet-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key
。[BUCKET_NAME]
是相关存储分区的名称,例如my-bucket
。
如果成功,响应将如下所示:
Authorized service account [SERVICE_ACCOUNT_NAME] to use key: [KEY_RESOURCE]
代码示例
C++
如需了解详情,请参阅 Cloud Storage C++ API 参考文档。
C#
如需了解详情,请参阅 Cloud Storage C# API 参考文档。
Go
如需了解详情,请参阅 Cloud Storage Go API 参考文档。
Java
如需了解详情,请参阅 Cloud Storage Java API 参考文档。
Node.js
如需了解详情,请参阅 Cloud Storage Node.js API 参考文档。
PHP
如需了解详情,请参阅 Cloud Storage PHP API 参考文档。
Python
如需了解详情,请参阅 Cloud Storage Python API 参考文档。
Ruby
如需了解详情,请参阅 Cloud Storage Ruby API 参考文档。
REST API
JSON API
- 从 OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
创建一个包含以下信息的 .json 文件:
{ "encryption": { "defaultKmsKeyName": "[KEY_RESOURCE]" } }
其中,
[KEY_RESOURCE]
是您的 Cloud KMS 密钥资源,例如projects/my-pet-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key
。使用
cURL
,通过PATCH
Bucket 请求调用 JSON API:curl -X PATCH --data-binary @[JSON_FILE_NAME].json \ -H "Authorization: Bearer [OAUTH2_TOKEN]" \ -H "Content-Type: application/json" \ "https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]?fields=encryption"
其中:
[JSON_FILE_NAME]
是您在第 2 步中创建的文件。[OAUTH2_TOKEN]
是您在第 1 步中生成的访问令牌。[BUCKET_NAME]
是相关存储分区的名称,例如my-bucket
。
XML API
- 从 OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
创建一个包含以下信息的 .xml 文件:
<EncryptionConfiguration> <DefaultKmsKeyName>[KEY_RESOURCE]</DefaultKmsKeyName> </EncryptionConfiguration>
其中,
[KEY_RESOURCE]
是您的 Cloud KMS 密钥资源,例如projects/my-pet-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key
。使用
cURL
,通过PUT
Bucket 请求和encryption
查询字符串参数调用 XML API:curl -X PUT --data-binary @[XML_FILE_NAME].xml \ -H "Authorization: Bearer [OAUTH2_TOKEN]" \ "https://storage.googleapis.com/[BUCKET_NAME]?encryptionConfig"
其中:
[XML_FILE_NAME]
是您在第 2 步中创建的文件。[OAUTH2_TOKEN]
是您在第 1 步中生成的访问令牌。[BUCKET_NAME]
是相关存储分区的名称,例如my-bucket
。
查看存储分区的默认密钥
如需查看存储分区当前设置的默认 Cloud KMS 密钥,请执行以下操作:
Console
- 在 Google Cloud Platform Console 中打开 Cloud Storage 浏览器。
打开 Cloud Storage 浏览器 在存储分区列表中,点击所需的存储分区。
在存储分区详细信息页面中,点击概览标签。
存储分区的当前默认密钥会显示在加密密钥字段中。
gsutil
使用 gsutil kms encryption
命令:
gsutil kms encryption gs://[BUCKET_NAME]
其中,[BUCKET_NAME]
是您要查看其密钥的存储分区的名称,例如 my-bucket
。
如果成功,响应将如下所示:
Default encryption key for gs://[BUCKET_NAME]: [KEY_RESOURCE]
REST API
JSON API
- 从 OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
使用
cURL
,通过包含所需fields
的GET
Bucket 请求调用 JSON API:curl -X GET -H "Authorization: Bearer [OAUTH2_TOKEN]" \ "https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]?fields=encryption"
其中:
[OAUTH2_TOKEN]
是您在第 1 步中生成的访问令牌。[BUCKET_NAME]
是您要查看其密钥的存储分区的名称,例如my-bucket
。
响应类似如下示例:
{ "encryption" : { "defaultKmsKeyName": "[KEY_RESOURCE]" }, }
XML API
- 从 OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
使用
cURL
,通过包含encryption
查询参数的GET
Bucket 请求调用 XML API:curl -X GET -H "Authorization: Bearer [OAUTH2_TOKEN]" \ "https://storage.googleapis.com/[BUCKET_NAME]?encryptionConfig"
其中:
[OAUTH2_TOKEN]
是您在第 1 步中生成的访问令牌。[BUCKET_NAME]
是您要查看其密钥的存储分区的名称,例如my-bucket
。
响应类似如下示例:
<EncryptionConfiguration> <DefaultKmsKeyName>[KEY_RESOURCE]</DefaultKmsKeyName> </EncryptionConfiguration>
从存储分区中移除默认密钥
如需移除为存储分区设置的任何默认 Cloud KMS 密钥,请执行以下操作:
Console
- 在 Google Cloud Platform Console 中打开 Cloud Storage 浏览器。
打开 Cloud Storage 浏览器 在存储分区列表中,点击所需的存储分区。
点击页面顶部的修改存储分区。
在“修改存储分区”页面中,点击可展开的显示高级设置。
选择 Google 管理的密钥单选按钮。
点击保存。
gsutil
使用 gsutil kms encryption
命令:
gsutil kms encryption -d gs://[BUCKET_NAME]
其中,[BUCKET_NAME]
为相关存储分区的名称,例如 my-bucket
。
如果成功,响应将如下所示:
Clearing default encryption key for gs://[BUCKET_NAME]...
REST API
JSON API
- 从 OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
创建一个包含以下信息的 .json 文件:
{ "encryption": { "defaultKmsKeyName": null } }
使用
cURL
,通过PATCH
Bucket 请求调用 JSON API:curl -X PATCH --data-binary @[JSON_FILE_NAME].json \ -H "Authorization: Bearer [OAUTH2_TOKEN]" \ -H "Content-Type: application/json" \ "https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]?fields=encryption"
其中:
[JSON_FILE_NAME]
是您在第 2 步中创建的文件。[OAUTH2_TOKEN]
是您在第 1 步中生成的访问令牌。[BUCKET_NAME]
是相关存储分区的名称,例如my-bucket
。
XML API
- 从 OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
创建一个包含以下信息的 .xml 文件:
<EncryptionConfiguration></EncryptionConfiguration>
使用
cURL
,通过PUT
Bucket 请求和encryption
查询字符串参数调用 XML API:curl -X PUT --data-binary @[XML_FILE_NAME].xml \ -H "Authorization: Bearer [OAUTH2_TOKEN]" \ "https://storage.googleapis.com/[BUCKET_NAME]?encryptionConfig"
其中:
[XML_FILE_NAME]
是您在第 2 步中创建的文件。[OAUTH2_TOKEN]
是您在第 1 步中生成的访问令牌。[BUCKET_NAME]
是相关存储分区的名称,例如my-bucket
。
使用 Cloud KMS 密钥加密对象
您可以使用 Cloud KMS 密钥加密单个对象。如果您要使用与存储分区上设置的默认密钥不同的密钥,或者您没有在存储分区上设置默认密钥,则此功能非常有用。
Console
您不能使用 GCP Console 来加密个别对象。 请改用 gsutil 或客户端库。
gsutil
将以下选项添加到 .boto 配置文件的
[GSUtil]
部分:encryption_key = [KEY_RESOURCE]
其中,
[KEY_RESOURCE]
是您的 Cloud KMS 密钥资源,例如projects/my-pet-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key
。按照正常方式将对象写入存储分区,例如使用
gsutil cp
或gsutil rewrite
。
代码示例
C++
如需了解详情,请参阅 Cloud Storage C++ API 参考文档。
C#
如需了解详情,请参阅 Cloud Storage C# API 参考文档。
Go
如需了解详情,请参阅 Cloud Storage Go API 参考文档。
Java
如需了解详情,请参阅 Cloud Storage Java API 参考文档。
Node.js
如需了解详情,请参阅 Cloud Storage Node.js API 参考文档。
PHP
如需了解详情,请参阅 Cloud Storage PHP API 参考文档。
Python
如需了解详情,请参阅 Cloud Storage Python API 参考文档。
Ruby
如需了解详情,请参阅 Cloud Storage Ruby API 参考文档。
REST API
JSON API
- 从 OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
将对象的数据添加到请求正文。
使用
cURL
,通过POST
Object 请求调用 JSON API:curl -X POST --data-binary @[OBJECT] \ -H "Authorization: Bearer [OAUTH2_TOKEN]" \ -H "Content-Type: [OBJECT_CONTENT_TYPE]" \ "https://www.googleapis.com/upload/storage/v1/b/[BUCKET_NAME]/o?uploadType=media&name=[OBJECT_NAME]&kmsKeyName=[KEY_RESOURCE]"
其中:
[OBJECT]
是要上传的对象的路径,例如Desktop/dog.png
。[OAUTH2_TOKEN]
是您在第 1 步中生成的访问令牌。[OBJECT_CONTENT_TYPE]
是该对象的内容类型,例如image/png
。[BUCKET_NAME]
是您要将对象上传到其中的存储分区的名称,例如my-bucket
。[OBJECT_NAME]
是要上传的对象的名称,例如pets/dog.png
。[KEY_RESOURCE]
是 Cloud KMS 密钥资源,例如projects/my-pet-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key
。
XML API
- 从 OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
将对象的数据添加到请求正文。
使用
cURL
,通过PUT
Object 请求调用 XML API:curl -X PUT --data-binary @[OBJECT] \ -H "Authorization: Bearer [OAUTH2_TOKEN]" \ -H "Content-Type: [OBJECT_CONTENT_TYPE]" \ -H "x-goog-encryption-kms-key-name: [KEY_RESOURCE]" \ "https://storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME]"
其中:
[OBJECT]
是要上传的对象的路径,例如Desktop/dog.png
。[OAUTH2_TOKEN]
是您在第 1 步中生成的访问令牌。[OBJECT_CONTENT_TYPE]
是该对象的内容类型,例如image/png
。[BUCKET_NAME]
是您要将对象上传到其中的存储分区的名称,例如my-bucket
。[OBJECT_NAME]
是要上传的对象的名称,例如pets/dog.png
。[KEY_RESOURCE]
是您的 Cloud KMS 密钥资源,例如projects/my-pet-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key
。
确定用于加密对象的密钥
如需查找用于加密对象的 Cloud KMS 密钥的名称,请执行以下操作:
Console
- 在 Google Cloud Platform Console 中打开 Cloud Storage 浏览器。
打开 Cloud Storage 浏览器 导航到相关存储分区中的所需对象。
在加密列中,将鼠标悬停在所需对象的条目上。
密钥名称采用以下格式显示:
[LOCATION]/[KEY_RING_NAME]/[KEY_NAME]/[KEY_VERSION]
gsutil
使用 gsutil stat
命令:
gsutil stat gs://[BUCKET_NAME]/[OBJECT_NAME]
其中:
[BUCKET_NAME]
是包含加密对象的存储分区的名称,例如my-bucket
。[OBJECT_NAME]
是加密对象的名称,例如pets/dog.png
。
如果成功,则响应会包含密钥名称:
gs://[BUCKET_NAME]/[OBJECT_NAME]: ... KMS key: [KEY_RESOURCE] ...
REST API
JSON API
- 从 OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
使用
cURL
,通过GET
Object 请求调用 JSON API:curl -X GET \ -H "Authorization: Bearer [OAUTH2_TOKEN]" \ "https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]/o/[OBJECT_NAME]?fields=kmsKeyName"
其中:
[OAUTH2_TOKEN]
是您在第 1 步中生成的访问令牌。[BUCKET_NAME]
是包含加密对象的存储分区的名称,例如my-bucket
。[OBJECT_NAME]
是加密对象的名称,例如pets/dog.png
。
XML API
- 从 OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
使用
cURL
,通过GET
Object 请求调用 XML API:curl -X GET \ -H "Authorization: Bearer [OAUTH2_TOKEN]" \ "https://storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME]?encryption"
其中:
[OAUTH2_TOKEN]
是您在第 1 步中生成的访问令牌。[BUCKET_NAME]
是包含加密对象的存储分区的名称,例如my-bucket
。[OBJECT_NAME]
是加密对象的名称,例如pets/dog.png
。
解密对象
系统会自动解密使用客户管理的加密密钥加密的对象,前提是相关服务帐号有权访问该密钥。如需了解详情,请参阅具有客户管理的加密密钥的服务帐号。