借助 Cloud KMS 密钥保护资源

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

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

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

详细了解 Google Cloud 的加密选项

准备工作

  1. 了解磁盘映像永久性磁盘快照虚拟机 (VM) 实例

  2. 决定是在同一个 Google Cloud 项目中还是在不同的项目中运行 Compute Engine 和 Cloud KMS。

    如需了解 Cloud 项目 ID 和项目编号,请参阅识别项目

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

  4. 对于运行 Cloud KMS 的 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 的 Cloud 项目的 ID(即使该项目就是运行 Compute Engine 的项目)
    • PROJECT_NUMBER:运行 Compute Engine 资源的 Cloud 项目的编号(不是 Cloud 项目 ID)

规格

本部分介绍加密规格以及使用 Cloud KMS 密钥的限制。

加密

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

限制

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

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

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

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

控制台

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

    转到“磁盘”

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

gcloud

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

请替换以下内容:

  • REGION:磁盘所在的区域
  • KEY_RING:包含密钥的密钥环的名称
  • KEY:用于加密磁盘的密钥的名称

API

使用 diskEncryptionKeykmsKeyName 属性加密磁盘。例如,在创建虚拟机期间,您可以通过以下方式,使用 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
 }
],
...
}

请替换以下内容:

  • PROJECT_ID:运行 Compute Engine 的 Cloud 项目的 ID
  • ZONE:要在其中创建虚拟机的可用区
  • REGION:磁盘所在的区域
  • KEY_RING:包含密钥的密钥环的名称
  • KEY:用于加密磁盘的密钥的名称

同样,您也可以使用 API 创建新的独立永久性磁盘,并使用 Cloud KMS 密钥对其进行加密:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks?sourceImage=https%3A%2F%2Fwww.googleapis.com%2Fcompute%2Fprojects%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 加密的磁盘创建快照时,您必须使用加密该磁盘所用的相同加密密钥来保护这一快照。

从使用 CMEK 加密的磁盘创建的快照是增量式快照。

控制台

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

    转到“快照”

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

gcloud

gcloud compute \
disks snapshot encrypted-disk \
    --zone 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"
}

SNAPSHOT_KEY 替换为用于加密来源磁盘的密钥的名称。

除非来源磁盘也使用 CMEK,否则您无法创建使用 CMEK 的快照。此外,除非您创建全新的磁盘映像和新的永久性磁盘,否则无法将加密磁盘或加密快照转换为使用 Compute Engine 默认加密。

加密导入的映像

将自定义映像导入到 Compute Engine 时,可以加密新映像。如需导入映像,您必须先创建并压缩磁盘映像文件,然后将该压缩文件上传到 Cloud Storage

控制台

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

    转到“映像”

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

gcloud

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"
  }
}

IMAGE_KEY 替换为要用于加密此映像的密钥的名称。

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

从加密快照创建磁盘

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

控制台

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

    转到“磁盘”

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

gcloud

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

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 默认加密方法的新磁盘。默认情况下,Compute Engine 会对所有静态数据进行加密

  1. 创建加密磁盘的快照
  2. 使用新映像创建新的永久性磁盘

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

轮替永久性磁盘的 Cloud KMS 加密密钥

通过创建使用新 Cloud KMS 密钥版本的新磁盘来轮替用于加密磁盘的密钥。轮替密钥是遵循标准化安全做法的最佳做法。要轮替密钥,请执行以下操作:

  1. 轮替 Cloud KMS 密钥
  2. 创建加密磁盘的快照
  3. 使用新快照来创建新的永久性磁盘,其中的密钥是第 1 步中轮替的密钥。

在您创建新的永久性磁盘时,该磁盘会使用新的密钥版本进行加密。您通过该磁盘创建的任何快照也会使用相同的密钥版本。

停用或删除加密密钥的影响

停用删除加密密钥会对受该密钥保护的如下资源产生下面这些影响:

  • 挂接了磁盘的虚拟机无法启动。如果您启用了密钥撤消后的虚拟机关停功能,则挂接了受该密钥保护的磁盘的虚拟机将会关停。
  • 磁盘无法挂接到虚拟机,也不能为它们创建快照。
  • 快照不能用于创建磁盘。
  • 映像不能用于创建磁盘。

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

在 Cloud KMS 密钥撤消时配置虚拟机关停

您可以将虚拟机配置为在撤消 Cloud KMS 密钥时自动关停,这有助于保护挂接到虚拟机的永久性磁盘。您可以撤消密钥,方法是停用删除该密钥。启用此设置后,虚拟机将在密钥撤消后的 3 小时内关停。

如果您再次启用密钥,则可以重启挂接了受该密钥保护的磁盘的虚拟机。启用密钥后,虚拟机不会自动重启。

您可以在创建虚拟机时,使用 gcloud 工具Compute Engine API,配置在密钥撤销后要关停的虚拟机。

gcloud

使用 gcloud beta compute instances create 命令创建虚拟机,并设置字段 --post-key-revocation-action-type=shutdown

gcloud beta compute instances create VM_NAME
    --image IMAGE
    --post-key-revocation-action-type=shutdown

API

使用 instances.insert 方法创建虚拟机,并设置字段 "postKeyRevocationActionType": "SHUTDOWN"。以下示例通过公共映像创建虚拟机。

 POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances

{ "machineType": "zones/MACHINE_TYPE_ZONE/machineTypes/MACHINE_TYPE", "name": "VM_NAME", "disks": [ { "initializeParams": { "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE" }, "boot": true } ], "postKeyRevocationActionType": "SHUTDOWN" }

或者,您可以配置实例模板,以使用 gcloud 工具Compute Engine API 创建在密钥吊销后关闭的虚拟机。

gcloud

使用 instance-templates create 命令创建实例模板,并设置字段 --post-key-revocation-action-type=shutdown

gcloud beta compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --post-key-revocation-action-type=shutdown

API

使用 instanceTemplates().insert 方法创建实例模板。在实例模板 API 中,您必须明确定义所有必需的配置字段。如果您希望通过此模板创建的虚拟机在撤销密钥后关停,请指定 "postKeyRevocationActionType": "SHUTDOWN"。例如,具有最少必需字段的实例模板将创建在密钥撤销后关停的虚拟机,如下所示:

  {
  "name": "example-template",
  "properties": {
    "machineType": "e2-standard-4",
    "networkInterfaces": [
      {
        "network": "global/networks/default",
        "accessConfigs":
        [
          {
            "name": "external-IP",
            "type": "ONE_TO_ONE_NAT"
          }
        ]
      }
    ],
    "disks":
    [
      {
        "type": "PERSISTENT",
        "boot": true,
        "mode": "READ_WRITE",
        "initializeParams":
        {
          "sourceImage": "projects/debian-cloud/global/images/family/debian-9"
        }
      }
    ],
    "postKeyRevocationActionType": "SHUTDOWN"
    }
  }
  

创建已配置为撤销 Cloud KMS 后关停的虚拟机后,请创建附加使用 Cloud KMS 密钥加密的永久性磁盘。

限制

  • 区域资源(磁盘)可以通过位于同一位置或 global 位置的密钥进行加密。例如,us-west1-a 地区中的磁盘可以通过位于 us-west1global 的密钥进行加密。全球资源(映像、快照)可以通过位于任何位置的密钥进行加密。

  • 使用密钥加密磁盘、快照或映像的操作是永久性的。您不能从资源中移除加密,也不能更改所用的密钥。移除加密或更改密钥的唯一方法是在指定新的加密选项时创建资源的副本。