使用客户提供的加密密钥来加密磁盘


本主题介绍了如何使用客户提供的加密密钥来加密磁盘

如需了解磁盘加密,请参阅磁盘加密简介

如需了解如何使用客户管理的加密密钥 (CMEK) 加密磁盘,请参阅使用 Cloud KMS 密钥保护资源

使用 CSEK 意味着您提供自己的加密密钥,Compute Engine 会使用您的密钥来保护 Google 生成的用于加密和解密数据的密钥。只有能够提供正确密钥的用户才能使用由 CSEK(客户提供的加密密钥)保护的资源。

Google 不会将密钥存储在其服务器上,并且也无法访问您受保护的数据,除非您提供密钥。这也意味着,如果您忘记或丢失密钥,Google 无法恢复密钥或恢复使用丢失的密钥加密的任何数据

删除永久性磁盘时,Google 会舍弃加密密钥,导致数据无法恢复。此过程是不可逆转的。

准备工作

  • 了解磁盘映像磁盘快照
  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. Python

      如需在本地开发环境中使用本页面上的 Python 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      如需了解详情,请参阅 Set up authentication for a local development environment

      REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

限制

对于 CSEK,存在以下限制:

一般限制

客户提供的加密密钥的可用性取决于结算账号的位置,而不是资源的位置。

客户提供的加密密钥不适用于以下国家/地区的结算账号:

  • 巴西
  • 印度

技术限制

  • 您只能使用自己的密钥加密新的永久性磁盘。您无法使用自己的密钥加密现有的永久性磁盘。

  • 您不能将自己的密钥用于本地 SSD 磁盘,因为这些密钥由 Google 基础设施管理并在虚拟机终止时被删除。

  • Compute Engine 不会将加密密钥与实例模板存储在一起,因此您需要将自己的密钥存储在 KMS 中,以加密托管实例组中的磁盘。

  • 您无法暂停挂接了受 CSEK 保护的磁盘的实例。

规格

本部分介绍了 CSEK 的加密规范和格式。

加密

Compute Engine 使用您的加密密钥保护使用 AES-256 加密的 Google 加密密钥。

要求的密钥格式

您可以决定生成和管理密钥。您必须向 Compute Engine 提供密钥,该密钥是使用 RFC 4648 标准 base64 编码的 256 位字符串。

以下是 base64 编码密钥的示例,使用字符串“Hello from Google Cloud Platform”生成

SGVsbG8gZnJvbSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0=

该密钥可以使用以下脚本生成:

read -sp "String:" ; \
    [[ ${#REPLY} == 32 ]] && \
        echo "$(echo -n "$REPLY" | base64)" || \
        (>&2 echo -e "\nERROR:Wrong Size"; false)

RSA 密钥封装

除了以 base64 编码密钥之外,您还可以选择使用 Google 提供的 RSA 公钥证书封装密钥,以 base64 编码密钥,然后在请求中使用该密钥。

RSA 封装是一个使用公钥加密数据的过程。数据在使用公钥加密之后,只能使用相应的私钥解密。在本例中,只有 Google Cloud 服务知道该私钥。通过使用 RSA 证书封装密钥,确保了只有 Google Cloud 服务可以解封密钥并用它保护数据。

如需了解详情,请参阅 RSA 加密

如需为 Compute Engine 创建 RSA 封装密钥,请执行以下操作:

  1. 使用 Compute Engine 管理的证书中提供的公钥封装密钥。确保使用 OAEP 填充而不是 PKCS #1 v1.5 填充来封装密钥。
  2. 使用标准 base64 编码对 RSA 封装密钥进行编码。

从以下网址下载 Compute Engine 维护的公共证书:

https://cloud-certs.storage.googleapis.com/google-cloud-csek-ingress.pem

生成密钥并以 RSA 封装有多种方法;请使用您熟悉的方法。下面是两个您可以使用的 RSA 封装密钥示例。

示例 1

以下说明使用 openssl 命令行实用程序,以 RSA 封装密钥并进行编码。

  1. 可选:生成 256 位(32 字节)随机密钥。如果您已经拥有要使用的密钥,则可以跳过此步骤。您可以通过多种方式生成密钥。例如:

    $ head -c 32 /dev/urandom | LC_CTYPE=C tr '\n' = > mykey.txt
    
  2. 下载公钥证书

    $  curl -s -O -L https://cloud-certs.storage.googleapis.com/google-cloud-csek-ingress.pem
  3. 从证书中提取公钥:

    $ openssl x509 -pubkey -noout -in google-cloud-csek-ingress.pem > pubkey.pem
    
  4. 以 RSA 封装密钥,确保用您自己的密钥文件替换 mykey.txt

    $ openssl rsautl -oaep -encrypt -pubin -inkey pubkey.pem -in mykey.txt -out rsawrappedkey.txt
    
  5. 使用 base64 对 RSA 封装密钥进行编码。

    $ openssl enc -base64 -in rsawrappedkey.txt | tr -d '\n' | sed -e '$a\' > rsawrapencodedkey.txt
    

示例 2

以下 Python 脚本样本生成 256 位(32 字节)随机字符串,并使用加密库创建 base64 编码的 RSA 封装密钥:

import argparse
import base64
import os
from typing import Optional

from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicKey
import requests


GOOGLE_PUBLIC_CERT_URL = (
    "https://cloud-certs.storage.googleapis.com/google-cloud-csek-ingress.pem"
)


def get_google_public_cert_key() -> RSAPublicKey:
    """
    Downloads the Google public certificate.

    Returns:
        RSAPublicKey object with the Google public certificate.
    """
    r = requests.get(GOOGLE_PUBLIC_CERT_URL)
    r.raise_for_status()

    # Load the certificate.
    certificate = x509.load_pem_x509_certificate(r.content, default_backend())

    # Get the certicate's public key.
    public_key = certificate.public_key()

    return public_key


def wrap_rsa_key(public_key: RSAPublicKey, private_key_bytes: bytes) -> bytes:
    """
    Use the Google public key to encrypt the customer private key.

    This means that only the Google private key is capable of decrypting
    the customer private key.

    Args:
        public_key: The public key to use for encrypting.
        private_key_bytes: The private key to be encrypted.

    Returns:
        private_key_bytes encrypted using the public_key. Encoded using
        base64.
    """
    wrapped_key = public_key.encrypt(
        private_key_bytes,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA1()),
            algorithm=hashes.SHA1(),
            label=None,
        ),
    )
    encoded_wrapped_key = base64.b64encode(wrapped_key)
    return encoded_wrapped_key


def main(key_file: Optional[str]) -> None:
    """
    This script will encrypt a private key with Google public key.

    Args:
        key_file: path to a file containing your private key. If not
            provided, a new key will be generated (256 bit).
    """
    # Generate a new 256-bit private key if no key is specified.
    if not key_file:
        customer_key_bytes = os.urandom(32)
    else:
        with open(key_file, "rb") as f:
            customer_key_bytes = f.read()

    google_public_key = get_google_public_cert_key()
    wrapped_rsa_key = wrap_rsa_key(google_public_key, customer_key_bytes)

    b64_key = base64.b64encode(customer_key_bytes).decode("utf-8")

    print(f"Base-64 encoded private key: {b64_key}")
    print(f"Wrapped RSA key: {wrapped_rsa_key.decode('utf-8')}")


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("--key_file", help="File containing your binary private key.")

    args = parser.parse_args()

    main(args.key_file)

您的密钥现在可以使用了!

使用 RSA 封装密钥

使用 Google Cloud CLI 时,您可以按照相同方式提供常规密钥和 RSA 封装密钥。

API 中,如果您要改用 RSA 封装密钥,请使用 sha256 属性(而非 rawKey)。

使用命令行工具通过 CSEK 加密资源

设置

您可以通过 Google Cloud CLI 使用加密密钥。

下载并安装 gcloud

密钥文件

在使用 gcloud compute 命令行工具设置密钥时,您可以使用包含编码密钥的密钥文件,以 JSON 列表的形式提供编码密钥。密钥文件可以包含多个密钥,因此您可以在一个位置管理多个密钥。或者,您可以创建单独的密钥文件来分别处理每个密钥。密钥文件仅可用于 gcloud CLI。使用 REST 时,必须直接在请求中提供密钥。

密钥文件中的每个条目都必须提供以下内容:

  • 密钥保护的资源的完全限定 URI
  • 对应的密钥
  • 密钥的类型,rawrsa-encrypted

在请求中使用密钥文件时,该工具会查找匹配的资源并使用相应的密钥。如果未找到匹配的资源,则请求将失败。

示例密钥文件如下所示:

[
  {
  "uri": "https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks/example-disk",
  "key": "acXTX3rxrKAFTF0tYVLvydU1riRZTvUNC4g5I11NY+c=",
  "key-type": "raw"
  },
  {
  "uri": "https://www.googleapis.com/compute/v1/projects/myproject/global/snapshots/my-private-snapshot",
  "key": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA==",
  "key-type": "rsa-encrypted"
  }
]

管理密钥文件的最佳做法

在使用密钥文件时,请将文件的访问权限仅限于需要该文件的用户。请务必对这些文件设置适当的权限,并考虑使用额外工具加密这些文件:

使用 CMEK 加密新的永久性磁盘

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

控制台

  1. 转到磁盘页面。

    转到“磁盘”

  2. 点击创建磁盘,然后输入新磁盘的属性。

  3. 加密下选择客户提供的密钥

  4. 在文本框中提供磁盘的加密密钥,如果密钥已使用公开 RSA 密钥封装,请选择已封装的密钥

gcloud

gcloud compute 工具中,在创建虚拟机期间使用 --csek-key-file 标志加密磁盘。如果您使用的是 RSA 封装密钥,请使用 gcloud beta 组件:

gcloud (beta) compute instances create example-instance --csek-key-file example-file.json

如需加密独立的永久性磁盘,请使用以下命令:

gcloud (beta) compute disks create example-disk --csek-key-file example-file.json

REST

您可以使用 diskEncryptionKey 属性向 v1 API 请求原始(非 RSA 封装)密钥,或向 Beta 版 API 请求 RSA 封装密钥来加密磁盘。在您的请求中提供以下一种属性:

  • rawKey:如果您的密钥采用 base64 编码
  • rsaEncryptedKey:如果密钥以 RSA 封装并采用 base64 编码

例如,如需在创建虚拟机期间使用 RSA 封装密钥加密新磁盘,请使用以下命令:

POST https://compute.googleapis.com/compute/beta/projects/myproject/zones/us-central1-a/instances

{
"machineType": "zones/us-central1-a/machineTypes/e2-standard-2",
"disks": [
 {
  "type": "PERSISTENT",
  "diskEncryptionKey": {
    "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  },
  "initializeParams": {
   "sourceImage": "projects/debian-cloud/global/images/debian-9-stretch-v20170619"
  },
  "boot": true
 }
],
...
}

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

POST https://compute.googleapis.com/compute/beta/projects/myproject/zones/
us-central1-a/disks?sourceImage=https%3A%2F%2Fwww.googleapis.com%2Fcompute%2F
alpha%2Fprojects%2Fdebian-cloud%2Fglobal%2Fimages%2Fdebian-9-stretch-v20170619

{
 "name": "new-encrypted-disk-key",
 "diskEncryptionKey": {
   "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  },
 "type": "zones/us-central1-a/diskTypes/pd-standard"
}

通过使用 CSEK 加密的磁盘创建快照

如果从加密磁盘创建快照,还必须加密快照。您必须指定用于加密快照的密钥。除非您创建新的磁盘映像和新的永久性磁盘,否则无法将加密磁盘或加密快照转换为使用 Compute Engine 默认加密。

使用 CSEK 加密的磁盘快照始终是完整快照。这与使用 CMEK(客户管理的加密密钥)加密的磁盘快照不同,后者为增量式快照。快照的价格取决于快照的总大小,因此完整快照的费用可能高于增量式快照。

要从加密磁盘创建永久性磁盘快照,您的快照创建请求必须提供用于加密永久性磁盘的加密密钥。

在创建快照之前,请查看创建永久性磁盘快照的最佳做法

控制台

  1. 转到快照页面。

    转到“快照”

  2. 点击创建快照

  3. 来源磁盘下,选择您要为其创建快照的加密磁盘。

  4. 在文本框中提供磁盘的加密密钥,如果密钥已使用公开 RSA 密钥封装,请选择已封装的密钥

  5. 通过在加密部分下提供额外加密密钥来加密新快照。

REST

如需发出请求,请提供 sourceDiskEncryptionKey 属性以访问来源永久性磁盘。您必须使用 snapshotEncryptionKey 属性加密新快照。

向 v1 API 请求原始(非 RSA 封装)密钥,或向 Beta 版 API 请求 RSA 封装密钥。

POST https://compute.googleapis.com/compute/beta/projects/myproject/zones/us-central1-a/disks/example-disk/createSnapshot

{
 "snapshotEncryptionKey":  {
   "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
 },
  "sourceDiskEncryptionKey": {
   "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  },
 "name": "snapshot-encrypted-disk"
}

sourceDiskEncryptionKey 属性必须与用于加密永久性磁盘的密钥匹配。否则,请求将失败。

由于 snapshotEncryptionKey 允许您提供密钥来加密快照,因此在快照用于创建新的永久性磁盘时,就要求必须提供匹配的密钥。该密钥必须遵循上述密钥格式。您也可以选择将此属性保留未定义,快照无需密钥即可用于创建新的永久性磁盘。

通过使用 CSEK 加密的磁盘或自定义映像创建新映像

您可以从加密的永久性磁盘创建自定义映像或复制加密映像。您无法使用控制台复制映像。请使用 Google Cloud CLI 或 REST 复制映像。

控制台

  1. 转到映像页面。

    转到“映像”

  2. 点击创建映像

  3. 来源磁盘下,选择要为其创建映像的加密磁盘。

  4. 加密下,选择加密密钥管理解决方案。

  5. 如果密钥已使用公开 RSA 密钥封装,请选择已封装的密钥

gcloud

按照说明创建映像,并添加 --csek-key-file 标志(其中包含指向已加密来源对象的加密密钥文件路径)。如果您使用的是 RSA 封装密钥,请使用 gcloud beta 组件:

gcloud (beta) compute images create .... --csek-key-file example-file.json

如果您要使用密钥加密新映像,请将密钥添加到密钥文件中:

[
  {
  "uri": "https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks/source-disk",
  "key": "acX3RqzxrKAFTF0tYVLvydU1riRZTvUNC4g5I11NY-c=",
  "key-type": "raw"
  },
  {
  "uri": "https://www.googleapis.com/compute/v1/projects/myproject/global/snapshots/the-new-image",
  "key": "TF0t-cSfl7CT7xRF1LTbAgi7U6XXUNC4zU_dNgx0nQc=",
  "key-type": "raw"
  }
]

REST

您的 API 创建请求必须包含来源对象的加密密钥属性。例如,请根据来源对象类型添加以下属性之一:

  • 永久性磁盘:sourceDiskEncryptionKey
  • 映像:sourceImageEncryptionKey

另外,还请根据密钥类型添加 rawKeyrsaEncryptedKey 属性。向 v1 API 请求原始(非 RSA 封装)密钥,或向测试版 API 请求 RSA 封装密钥。以下示例将已加密和 RSA 封装的永久性磁盘转换为使用相同加密密钥的映像。

POST https://compute.googleapis.com/compute/beta/projects/myproject/global/images

{
 "name": "image-encrypted-disk",
 "sourceDiskEncryptionKey": {
    "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  }
 "imageEncryptionKey": {
    "rsaEncryptedKey":  "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
    },
 "sourceDisk": "projects/myproject/zones/us-central1-a/disks/source-disks"
}

由于可选的 imageEncryptionKey 属性允许您提供密钥来加密映像,因此在映像用于创建新的永久性磁盘时,就要求必须提供匹配的密钥。该密钥必须遵循上述相同的密钥格式。您也可以选择将此属性保留未定义,映像无需密钥即可用于创建新的永久性磁盘。

使用 CSEK 加密导入的映像

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

导入要加密的自定义 Compute Engine 映像。指定压缩文件的 URI,然后指定加密密钥文件的路径。

控制台

  1. 转到映像页面。

    转到“映像”

  2. 点击创建映像

  3. 来源下,选择 Cloud Storage 文件

  4. Cloud Storage 文件下,输入 Cloud Storage URI。

  5. 加密下,选择客户管理的密钥并在文本框中提供该加密密钥来加密映像。

gcloud

使用 compute images create 命令创建新映像,并用加密密钥文件指定 --csek-key-file 标志。如果您使用的是 RSA 封装密钥,请使用 gcloud beta 组件:

gcloud (beta) compute images create [IMAGE_NAME] \
    --source-uri gs://[BUCKET_NAME]/[COMPRESSED_FILE] \
    --csek-key-file [KEY_FILE]

替换以下内容:

  • [IMAGE_NAME]:新的自定义映像的名称。
  • [BUCKET_NAME]:用于保存压缩映像文件的 Cloud Storage 存储桶的名称。
  • [COMPRESSED_FILE]:压缩的映像文件的名称。
  • [KEY_FILE]:指向本地工作站上的加密密钥文件的路径。

REST

如需加密从 RAW 文件创建的新映像,请在映像创建请求中添加新的 imageEncryptionKey 属性,后跟 rawKeyrsaEncryptedKey。向 v1 API 请求原始(非 RSA 封装)密钥,或向测试版 API 请求 RSA 封装密钥。

POST https://compute.googleapis.com/compute/beta/projects/myproject/global/images

{
"rawDisk": {
 "source": "http://storage.googleapis.com/example-image/example-image.tar.gz"
},
"name": "new-encrypted-image",
"sourceType": "RAW",
"imageEncryptionKey": {
  "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  }
}

通过使用 CMEK 加密的资源创建永久性磁盘

通过使用 CSEK 加密的快照创建磁盘

控制台

  1. 转到磁盘页面。

    转到“磁盘”

  2. 点击创建磁盘

  3. 来源类型下,选择快照

  4. 加密下,选择加密密钥管理解决方案。

  5. 如果密钥已使用公开 RSA 密钥封装,请选择已封装的密钥

gcloud

gcloud compute 工具中,在创建磁盘时使用 --csek-key-file 标志为快照提供加密密钥。如果您使用的是 RSA 封装密钥,请使用 gcloud beta 组件:

gcloud (beta) compute disks create ... --source-snapshot example-snapshot --csek-key-file example-file.json

REST

如需使用加密快照,请在请求中提供 sourceSnapshotEncryptionKey,后跟 rawKeyrsaEncryptedKey。向 v1 API 请求原始(非 RSA 封装)密钥,或向测试版 API 请求 RSA 封装密钥。例如,若要使用加密快照创建新的独立永久性磁盘,请执行以下操作:

POST https://compute.googleapis.com/compute/beta/projects/myproject/zones/us-central1-a/disks

{
"name": "disk-from-encrypted-snapshot",
"sourceSnapshot": "global/snapshots/encrypted-snapshot",
"sourceSnapshotEncryptionKey": {
  "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  }
}

通过使用 CSEK 加密的映像创建磁盘

控制台

  1. 转到磁盘页面。

    转到“磁盘”

  2. 点击创建磁盘

  3. 来源类型下,选择映像

  4. 加密下,选择加密密钥管理解决方案。

  5. 如果密钥已使用公开 RSA 密钥封装,请选择已封装的密钥

gcloud

gcloud compute 工具中,在创建磁盘时使用 --csek-key-file 标志为映像提供加密密钥。如果您使用的是 RSA 封装密钥,请使用 gcloud beta 组件:

gcloud (beta) compute disks create ... --image example-image --csek-key-file example-file.json

REST

如需使用加密映像,请提供 sourceImageEncryptionKey,后跟 rawKeyrsaEncryptedKey。向 v1 API 请求原始(非 RSA 封装)密钥,或向测试版 API 请求 RSA 封装密钥。

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks

{
"name": "disk-from-encrypted-image",
"sourceImageEncryptionKey": {
  "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  },
"sourceImage": "global/images/encrypted-image"
}

将使用 CSEK 加密的磁盘挂接到新虚拟机

控制台

  1. 转到创建实例页面。

    转到“创建实例”

  2. 启动磁盘部分,点击更改,然后执行以下操作:

    1. 启动磁盘页面上,点击现有磁盘标签页。
    2. 磁盘列表中,选择要挂接到虚拟机的现有加密磁盘。
    3. 在文本框中输入加密密钥,如果密钥已使用公开 RSA 密钥封装,请选择已封装的密钥

    4. 点击选择

  3. 继续虚拟机创建过程。

gcloud

如需创建虚拟机并挂接加密磁盘,请创建密钥文件,并在创建虚拟机时使用 --csek-key-file 标志提供密钥。如果您使用的是 RSA 封装密钥,请使用 gcloud beta 组件:

gcloud (beta) compute instances create example-instance \
    --disk name=example-disk,boot=yes \
    --csek-key-file example-file.json

REST

使用 Compute Engine API 创建虚拟机,并提供包含磁盘规格的 rawKeyrsaEncryptedKey。向 v1 API 请求原始(非 RSA 封装)密钥,或向测试版 API 请求 RSA 封装密钥。

以下是示例磁盘规格的代码段:

"disks": [
{
  "deviceName": "encrypted-disk",
  "source": "projects/myproject/zones/us-central1-f/disks/encrypted-disk",
  "diskEncryptionKey": {
    "rawKey": "SGVsbG8gZnJvbSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0="
  }
 }
]

启动或重启具有使用 CSEK 加密的磁盘的虚拟机

如需详细了解如何停止或启动具有加密磁盘的虚拟机,请参阅重启具有加密磁盘的虚拟机

使用命令行创建混合资源

如果要使用 Google Cloud CLI 在单个请求中同时创建客户加密资源和标准加密资源,您可以在请求中使用 --csek-key-file 标志与密钥文件以及 --no-require-csek-key-create 标志。通过提供这两个标志,gcloud CLI 可以创建在密钥文件中明确定义的任何客户加密资源,还可以创建您指定的任何标准资源。

例如,假设密钥文件包含以下内容:

[
  {
  "uri": "https://www.googleapis.com/compute/beta/projects/myproject/zones/us-central1-a/disks/example-disk",
  "key": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA==",
  "key-type": "rsa-encrypted"
  }
]

如果您要使用密钥文件创建挂接了客户加密磁盘的虚拟机,并在同一请求中同时创建挂接了标准加密磁盘的虚拟机,则可以按如下方式执行此操作:

gcloud beta compute instances create example-disk example-disk-2 \
    --csek-key-file mykeyfile.json --no-require-csek-key-create

通常,如果您指定了 --csek-key-file 标志,则无法创建 example-disk-2,这是因为密钥文件中未明确定义该磁盘。添加 --no-require-csek-key-create 将同时创建这两个磁盘,一个使用密钥文件加密,另一个使用 Google 加密方法加密。

从永久性磁盘中移除 CSEK

您可以解密客户加密磁盘的内容,并创建一个使用 Compute Engine 默认加密方法的新磁盘。

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

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