使用 Cloud KMS 密钥保护资源

默认情况下,Compute Engine 会加密静态的客户内容。Compute Engine 会为您处理和管理此加密,您无需执行任何额外操作。但是,如果您想要自己控制和管理此加密,则可以使用密钥加密密钥。密钥加密密钥不会直接加密您的数据,而是用于对加密您数据的数据加密密钥进行加密。

ompute Engine 中提供两种密钥加密密钥选择:

创建受 Cloud KMS 保护的 Compute Engine 资源后,您无需指定密钥,因为 Compute Engine 知道使用了哪个 KMS 密钥。这与 Compute Engine 访问受客户提供的密钥保护的资源的方式不同。进行那种访问时,您需要指定客户提供的密钥。

详细了解 Google Cloud Platform 上的加密选项

准备工作

  1. 了解磁盘映像永久性磁盘快照实例

  2. 决定是在同一个 Google Cloud Platform 项目中还是不同的项目中运行 Compute Engine 和 Cloud KMS。为了方便说明,本文的示例将采用下列惯例:

    • [PROJECT_ID] 是运行 Compute Engine 的项目的项目 ID
    • [PROJECT_NUMBER] 是运行 Compute Engine 的项目的项目编号
    • [KMS_PROJECT_ID] 是运行 Cloud KMS 的项目的项目 ID(即使该项目就是运行 Compute Engine 的项目)

    要了解 GCP 项目 ID 和项目编号,请参阅识别项目

  3. 对于运行 Compute Engine 的 GCP 项目,请为 Compute Engine 设置 API 访问

  4. 对于运行 Cloud KMS 的 GCP 项目,请执行以下操作:

    1. 启用 Cloud KMS API
    2. 按照创建密钥环和密钥中的说明创建密钥环和密钥。
  5. 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 的 GCP 项目的 ID,并将 [PROJECT_NUMBER] 替换为运行 Compute Engine 资源的 GCP 项目的项目编号(不是项目 ID)。

规格

加密

在 Compute Engine 中保护数据所用的 Cloud KMS 密钥是 AES-256 密钥。此类密钥属于密钥加密密钥,它们会对加密数据的数据加密密钥进行加密。

限制

  • 您可以使用自己的密钥仅加密新增永久性磁盘、映像和快照。您无法使用自己的密钥加密现有资源。

  • 您不能将自己的密钥用于本地 SSD,因为本地 SSD 的存续时间不会超过虚拟机的生命周期。本地 SSD 已通过一个临时加密密钥受到保护,Google 不会保留该密钥。

使用您自己的密钥加密新的永久性磁盘

您可以在创建实例或磁盘期间通过提供密钥来加密新的永久性磁盘。

Console

  1. 在 Google Cloud Platform Console 中,转到磁盘页面。

    转到“磁盘”页面

  2. 点击创建磁盘,然后输入新磁盘的属性。
  3. 加密下选择客户管理的密钥
  4. 使用下拉菜单选择用于加密此磁盘的 Cloud KMS 密钥。
  5. 点击创建以创建磁盘。

命令行

gcloud compute disks \
create encrypted-disk \
--kms-key projects/[KMS_PROJECT_ID]/locations/[REGION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]

API

使用带有 kmsKeyName 属性的 diskEncryptionKey 属性加密磁盘。例如,要在创建实例期间使用 Cloud KMS 密钥加密新磁盘,请使用以下命令:

POST
https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances

{
"machineType": "zones/[ZONE]/machineTypes/n1-standard-1",
"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://www.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 加密的磁盘创建快照时,快照必须使用您用于加密磁盘的加密密钥进行保护。

Console

  1. 在 Google Cloud Platform Console 中,转到快照页面。

    转到“快照”页面

  2. 点击创建快照
  3. 来源磁盘下,选择快照的来源磁盘。快照将使用来源磁盘所用的密钥自动进行加密。

命令行

gcloud compute \
disks snapshot encrypted-disk \
--zone [ZONE]

API

POST https://www.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

Console

  1. 在 Google Cloud Platform Console 中,转到映像页面。

    转到“映像”页面

  2. 点击创建映像
  3. 来源磁盘下,选择您想要创建其映像的磁盘。
  4. 加密下选择客户管理的密钥
  5. 使用下拉菜单选择用于加密此映像的 Cloud KMS 密钥。
  6. 继续映像创建过程。

命令行

gcloud compute \
images create [...] \
--kms-key projects/[KMS_PROJECT_ID]/locations/[REGION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]

API

要加密导入的映像,请指定压缩文件的网址,然后在映像创建请求中添加新的 imageEncryptionKey 属性,并在 kmsKeyName 属性中指定加密映像的密钥:

POST https://www.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]"
  }
}

从加密资源创建永久性磁盘

从加密快照创建磁盘

要使用加密快照创建新的独立永久性磁盘,请执行以下操作:

Console

  1. 在 Google Cloud Platform Console 中,转到磁盘页面。

    转到“磁盘”页面

  2. 点击创建磁盘,然后输入新磁盘的属性。
  3. 来源类型下,选择所需的快照或映像。
  4. 继续映像永久性磁盘创建过程。

命令行

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://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/disks

{
"name": "disk-from-encrypted-snapshot",
"sourceSnapshot": "global/snapshots/encrypted-snapshot"
}

将加密磁盘附加到新实例

Console

  1. 在 Google Cloud Platform Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 点击创建实例
  3. 启动磁盘下,点击更改
  4. 点击现有磁盘
  5. 选择要附加到实例的现有磁盘。
  6. 继续进行实例创建过程。

命令行

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 默认加密方法的新磁盘。

  1. 创建加密磁盘的映像,并为新映像指定自动加密。
  2. 使用新映像创建新的永久性磁盘

创建新的永久性磁盘后,该磁盘使用 Compute Engine 的默认加密来保护磁盘内容。您从该磁盘创建的所有快照亦必须使用默认加密。

停用或启用加密密钥的效果

停用删除加密密钥会对受该密钥保护的内容产生以下效果:

  • 如果虚拟机附加有受密钥保护的磁盘,则无法启动
  • 受密钥保护的磁盘无法附加到虚拟机,也无法为它们创建快照
  • 受密钥保护的快照无法用于创建磁盘
  • 受密钥保护的映像无法用于创建磁盘

如果停用了密钥,则可以通过启用密钥来逆转上述效果。如果删除了密钥,则上述效果无法逆转。

限制

  • 区域资源(磁盘)可以通过位于相同位置或 global 位置的密钥进行加密。举例来说,区域 us-west1-a 中的磁盘可以通过位于 us-west1global 中的密钥进行加密。全局资源(映像、快照)可以通过位于任何位置的密钥进行加密。
此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档