默认情况下,Compute Engine 会对静态客户内容进行加密。Compute Engine 会为您处理和管理这项加密工作,您无需执行任何额外操作。但是,如果您想要自行控制和管理这项加密工作,则可以使用“密钥加密密钥”。密钥加密密钥不会直接加密您的数据,而是用于对加密您数据的“数据加密密钥”进行加密。
ompute Engine 中提供两种密钥加密密钥选择:
使用 Cloud Key Management Service 创建和管理密钥加密密钥。如需了解详情,请参阅密钥管理。本主题会详细介绍此选项(称为“客户管理的加密密钥”(CMEK))。
创建和管理您自己的密钥加密密钥。如需了解此选项(称为“客户提供的加密密钥”(CSEK)),请参阅使用客户提供的加密密钥来加密磁盘。
创建受 Cloud KMS 保护的 Compute Engine 资源后,您无需指定密钥,因为 Compute Engine 知道使用了哪个 KMS 密钥。如果是受客户提供的密钥保护的资源,Compute Engine 的资源访问方式会有所不同。 如需访问此类资源,您需要指定客户提供的密钥。
详细了解 Google Cloud 的加密选项。
准备工作
决定是在同一个 Google Cloud 项目中还是在不同的项目中运行 Compute Engine 和 Cloud KMS。为了方便说明,本文的示例将采用下列惯例:
[PROJECT_ID]
是运行 Compute Engine 的项目的 ID[PROJECT_NUMBER]
是运行 Compute Engine 的项目的编号[KMS_PROJECT_ID]
是运行 Cloud KMS 的项目的 ID(即使该项目就是运行 Compute Engine 的项目)
如需了解 Google Cloud 项目 ID 和项目编号,请参阅识别项目。
对于运行 Compute Engine 的 Google Cloud 项目,请为 Compute Engine 设置 API 访问权限。
对于运行 Cloud KMS 的 Google Cloud 项目,请执行以下操作:
- 启用 Cloud KMS API。
- 按照创建密钥环和密钥中的说明创建密钥环和密钥。
将
Cloud KMS CryptoKey Encrypter/Decrypter
角色分配给 Compute Engine 服务帐号。该帐号的格式如下:service-[PROJECT_NUMBER]@compute-system.iam.gserviceaccount.com
您可以使用
gcloud
命令行工具分配该角色:gcloud projects add-iam-policy-binding [KMS_PROJECT_ID] \ --member serviceAccount:service-[PROJECT_NUMBER]@compute-system.iam.gserviceaccount.com \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
将
[KMS_PROJECT_ID]
替换为运行 Cloud KMS 的 Google Cloud 项目的 ID,并将[PROJECT_NUMBER]
替换为运行 Compute Engine 资源的 Google Cloud 项目的编号(而非项目 ID)。
规范
加密
在 Compute Engine 中保护数据所用的 Cloud KMS 密钥是 AES-256 密钥。此类密钥属于密钥加密密钥,它们会对加密数据的数据加密密钥进行加密。
限制
您只能使用自己的密钥加密新增永久性磁盘、映像和快照,您无法使用自己的密钥加密现有资源。
您不能将自己的密钥用于本地 SSD,因为本地 SSD 的存续时间不会超过虚拟机的生命周期。本地 SSD 已通过一个临时加密密钥受到保护,Google 不会保留该密钥。
使用您自己的密钥加密新的永久性磁盘
您可以在创建实例或磁盘期间通过提供密钥来加密新的永久性磁盘。
控制台
- 在 Google Cloud Console 中,转到磁盘页面。
- 点击创建磁盘,然后输入新磁盘的属性。
- 在加密下选择客户管理的密钥。
- 使用下拉菜单选择用于加密此磁盘的 Cloud KMS 密钥。
- 点击创建以创建磁盘。
命令行
gcloud compute disks \ create encrypted-disk \ --kms-key projects/[KMS_PROJECT_ID]/locations/[REGION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]
API
使用 diskEncryptionKey
和 kmsKeyName
属性加密磁盘。例如,若要在创建实例期间使用 Cloud KMS 密钥加密新磁盘,请使用以下命令:
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances { "machineType": "zones/[ZONE]/machineTypes/e2-standard-2", "disks": [ { "type": "PERSISTENT", "diskEncryptionKey": { "kmsKeyName": "projects/[KMS_PROJECT_ID]/locations/[REGION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]" }, "initializeParams": { "sourceImage": "projects/debian-cloud/global/images/debian-8-jessie-v20160301" }, "boot": true } ], ... }
同样,您也可以使用 API 创建新的独立永久性磁盘,并使用 Cloud KMS 密钥对其进行加密:
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/ [ZONE]/disks?sourceImage=https%3A%2F%2Fwww.googleapis.com%2Fcompute%2F projects%2Fdebian-cloud%2Fglobal%2Fimages%2Fdebian-8-jessie-v20160301 { "name": "new-encrypted-disk-key", "diskEncryptionKey": { "kmsKeyName": "projects/[KMS_PROJECT_ID]/locations/[REGION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]" }, "type": "zones/[ZONE]/diskTypes/pd-standard" }
从加密磁盘创建快照
从使用 CMEK 加密的磁盘创建快照时,快照必须使用您用于加密该磁盘的同一加密密钥进行保护。
控制台
- 在 Google Cloud Console 中,转到快照页面。
- 点击创建快照。
- 在来源磁盘下,选择快照的来源磁盘。快照将使用来源磁盘所用的同一密钥自动进行加密。
命令行
gcloud compute \ disks snapshot encrypted-disk \ --zone [ZONE]
API
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/disks/example-disk/createSnapshot { "snapshotEncryptionKey": { "kmsKeyName": "projects/[KMS_PROJECT_ID]/locations/[REGION]/keyRings/[KEY_RING]/cryptoKeys/[SNAPSHOT_KEY]" }, "name": "snapshot-encrypted-disk" }
除非磁盘本身正受到 CMEK 的保护,否则您无法创建受 CMEK 保护的快照。同样,除非您创建全新的磁盘映像和新的永久性磁盘,否则无法将加密磁盘或加密快照转换为使用 Compute Engine 默认加密。
加密导入的映像
在将自定义映像导入到 Compute Engine 时,可以加密新映像。如需导入映像,您必须先创建并压缩磁盘映像文件,然后将该压缩文件上传到 Google Cloud Storage。
控制台
- 在 Google Cloud Console 中,转到映像页面。
- 点击创建映像。
- 在来源磁盘下,选择您想要创建其映像的磁盘。
- 在加密下选择客户管理的密钥。
- 使用下拉菜单选择用于加密此映像的 Cloud KMS 密钥。
- 继续映像创建过程。
命令行
gcloud compute \ images create [...] \ --kms-key projects/[KMS_PROJECT_ID]/locations/[REGION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]
API
如需加密导入的映像,请指定压缩文件的 URI,将 imageEncryptionKey
属性添加到映像创建请求中,然后在 kmsKeyName
属性中指定要用来加密映像的密钥:
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/images { "rawDisk": { "source": "http://storage.googleapis.com/example-image/example-image.tar.gz" }, "name": "new-encrypted-image", "sourceType": "RAW", "imageEncryptionKey": { "kmsKeyName": "projects/[KMS_PROJECT_ID]/locations/[REGION]/keyRings/[KEY_RING]/cryptoKeys/[IMAGE_KEY]" } }
通过加密资源创建永久性磁盘
从加密快照创建磁盘
要使用加密快照创建新的独立永久性磁盘,请执行以下操作:
控制台
- 在 Google Cloud Console 中,转到磁盘页面。
- 点击创建磁盘,然后输入新磁盘的属性。
- 在来源类型下,选择所需的快照或映像。
- 继续映像永久性磁盘创建过程。
命令行
gcloud compute \ disks create [...] \ --source-snapshot example-snapshot \ --kms-key projects/[KMS_PROJECT_ID]/locations/[REGION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]
如需使用映像而非快照,请将 --source-snapshot
example-snapshot
替换为 --image example-image
。
API
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/disks { "name": "disk-from-encrypted-snapshot", "sourceSnapshot": "global/snapshots/encrypted-snapshot" }
将加密磁盘附加到新实例
控制台
- 在 Google Cloud Console 中,转到虚拟机实例页面。
- 点击创建实例。
- 在启动磁盘下,点击更改。
- 点击现有磁盘。
- 选择要附加到实例的现有磁盘。
- 继续进行实例创建过程。
命令行
gcloud compute instances \ create example-instance \ --disk name=encrypted-disk,boot=yes
API
"disks": [ { "deviceName": "encrypted-disk", "source": "projects/[PROJECT_ID]/zones/[ZONE]/disks/encrypted-disk" } } ]
从永久性磁盘中删除 Cloud KMS 加密密钥
您可以解密加密磁盘的内容,并创建一个使用 Compute Engine 默认加密方法的新磁盘。
- 创建加密磁盘的映像,并指定 Google 管理的密钥以对新映像使用 Compute Engine 默认加密方法。
- 使用新映像创建新的永久性磁盘。
创建新的永久性磁盘后,该磁盘使用 Compute Engine 的默认加密来保护磁盘内容。您从该磁盘创建的所有快照亦必须使用默认加密。
停用或删除加密密钥的影响
- 如果虚拟机附加有受该密钥保护的磁盘,则无法启动
- 受该密钥保护的磁盘无法附加到虚拟机,也无法为它们创建快照
- 受该密钥保护的快照无法用于创建磁盘
- 受该密钥保护的映像无法用于创建磁盘
如果您停用了密钥,则只需再次启用密钥即可消除上述影响。 如果您删除了密钥,则无法消除上述影响。
限制
- 区域资源(磁盘)可以通过位于同一位置或
global
位置的密钥进行加密。例如,us-west1-a
地区中的磁盘可以通过位于us-west1
或global
的密钥进行加密。全球资源(映像、快照)可以通过位于任何位置的密钥进行加密。