使用 Cloud KMS 密钥保护资源

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

Compute Engine 中提供了以下两种密钥加密密钥选项:

创建受 Cloud KMS 保护的 Compute Engine 资源后,您无需指定密钥,因为 Compute Engine 知道使用了哪个 KMS 密钥。如果是受客户提供的密钥保护的资源,Compute Engine 的资源访问方式会有所不同。如需访问此类资源,您需要指定客户提供的密钥。

详细了解 Google Cloud 的加密选项

准备工作

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

  2. 决定是在同一个 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 和项目编号,请参阅识别项目

  3. 对于运行 Compute Engine 的 Google Cloud 项目,请为 Compute Engine 设置 API 访问权限

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

    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 的 Google Cloud 项目的 ID,并将 [PROJECT_NUMBER] 替换为运行 Compute Engine 资源的 Google Cloud 项目的编号(而非项目 ID)。

规格

加密

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

限制

  • 您只能使用自己的密钥加密新增永久性磁盘、映像和快照,不能用它来加密现有资源。

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

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

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

控制台

  1. 在 Google Cloud 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

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

    POST
    https://compute.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://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 加密的磁盘创建快照时,快照必须使用您用于加密该磁盘的同一加密密钥进行保护。

控制台

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

    转到“快照”页面

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

命令行

    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

控制台

  1. 在 Google Cloud 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

如需加密导入的映像,请指定压缩文件的 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]"
      }
    }
    

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

从加密快照创建磁盘

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

控制台

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

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

将加密磁盘附加到新实例

控制台

  1. 在 Google Cloud 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 的密钥进行加密。全球资源(映像、快照)可以通过位于任何位置的密钥进行加密。