使用客戶提供的加密金鑰來為磁碟加密


本文件將說明如何使用客戶提供的加密金鑰來加密磁碟

如要瞭解磁碟加密功能,請參閱「關於磁碟加密」。

如要瞭解如何使用客戶管理加密金鑰 (CMEK) 為磁碟加密,請參閱「使用 Cloud KMS 金鑰保護資源」一文。

使用 CSEK 表示您提供自己的加密金鑰,而 Compute Engine 會使用您的金鑰來保護用於加密及解密資料的 Google-owned and Google-managed encryption keys 。只有能夠提供正確金鑰的使用者,才能使用由客戶提供的加密金鑰 (CSEK) 保護的資源。

Google 不會將您的金鑰儲存在伺服器中,除非您提供金鑰,否則 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. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.

    Python

    To use the Python samples on this page in a local development environment, install and initialize the gcloud CLI, and then set up Application Default Credentials with your user credentials.

    1. Install the Google Cloud CLI.
    2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. To initialize the gcloud CLI, run the following command:

      gcloud init
    4. 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.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    For more information, see Set up authentication for a local development environment.

    REST

    To use the REST API samples on this page in a local development environment, you use the credentials you provide to the gcloud CLI.

      After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    For more information, see Authenticate for using REST in the Google Cloud authentication documentation.

限制

針對 CSEK,適用下列限制:

一般限制

客戶提供的加密金鑰是否可用,取決於您的帳單帳戶位置,而非資源位置。

下列國家/地區的帳單帳戶無法使用客戶提供的加密金鑰:

  • 巴西
  • 印度

技術限制

  • 您只能使用自己的金鑰加密新的永久磁碟。無法使用自己的金鑰加密現有的永久磁碟。

  • 您無法在本機 SSD 磁碟使用自己的金鑰,因為本機 SSD 磁碟使用的是 Google-owned and Google-managed encryption keys。終止 VM 時,系統會刪除這些金鑰。

  • Compute Engine 不會利用執行個體範本儲存加密金鑰,因此您需要在 KMS 中儲存自己的金鑰,才能加密代管執行個體群組中的磁碟。

  • 您無法暫停已連接 CSEK 保護磁碟的執行個體。

規格

本節將說明 CSEK 的加密規格和格式。

加密

Compute Engine 使用您的加密金鑰來保護以 AES-256 加密的 Google 加密金鑰。

金鑰格式規定

個人金鑰的產生與管理由您負責。您必須提供金鑰,也就是以 RFC 4648 標準 Base64 編碼的 256 位元字串,並將其提供給 Compute Engine。

以下是使用「Hello from Google Cloud Platform」字串產生的 base64 編碼金鑰範例:

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

以下是產生 256 位元 (32 位元組) 隨機字串,並使用密碼編譯庫採 Base-64 編碼 RSA 包裝金鑰的範例 Python 指令碼:

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
  • 對應的金鑰
  • 金鑰類型,raw 或是 rsa-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"
  }
]

管理金鑰檔案的最佳做法

如果您使用金鑰檔案,請將檔案的存取權限設定為僅限有需要的使用者。請確保為這些檔案設定適當的權限,並考慮使用其他工具為這些檔案加密:

使用 CSEK 為新的永久磁碟加密

您可以在建立 VM 或磁碟時提供金鑰,藉此加密新的永久磁碟。

主控台

  1. 前往「Disks」(磁碟) 頁面。

    前往「Disks」(磁碟) 頁面

  2. 按一下 [Create disk] (建立磁碟),然後輸入新磁碟的屬性。

  3. 在「Encryption」下方,選取「Customer-supplied key」

  4. 在文字方塊中提供磁碟的加密金鑰,如果金鑰已使用公開 RSA 金鑰包裝,請選取 [Wrapped key] (經過包裝的金鑰)

gcloud

gcloud compute 工具中,請使用 --csek-key-file 旗標在 VM 建立期間為磁碟加密。如果您使用的是 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 包裝金鑰在建立 VM 期間加密新磁碟:

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. 前往「Snapshots」(快照) 頁面。

    前往「快照」

  2. 按一下 [Create snapshot] (建立快照)。

  3. 在「Source disk」(來源磁碟) 底下,選擇要建立快照的加密磁碟。

  4. 在文字方塊中提供磁碟的加密金鑰,如果金鑰已使用公開 RSA 金鑰包裝,請選取 [Wrapped key] (經過包裝的金鑰)

  5. 在「Encryption」(加密) 區段底下,提供其他加密金鑰來為新快照加密。

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. 前往「Images」(映像檔) 頁面。

    前往「圖片」

  2. 按一下「建立映像檔」

  3. 在「Source disk」(來源磁碟) 底下,選擇要為其建立映像檔的加密磁碟。

  4. 在「Encryption」下方,選取加密金鑰管理解決方案。

  5. 如果金鑰已使用公開 RSA 金鑰包裝,請選取「Wrapped key」

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 包裝) 金鑰,或是 Beta 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. 前往「Images」(映像檔) 頁面。

    前往「圖片」

  2. 按一下「建立映像檔」

  3. 在「Source」下方,選擇「Cloud Storage file」

  4. 在「Cloud Storage file」(Cloud Storage 檔案) 下方輸入 Cloud Storage URI。

  5. 在「Encryption」下方,選擇「Customer-supplied key」,並在文字方塊中提供加密金鑰,以便為圖片加密。

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 屬性加到映像檔建立要求中,後面加上 rawKey 或是 rsaEncryptedKey。提出要求至 v1 API 來使用原始 (非 RSA 包裝) 金鑰,或是 Beta 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=="
  }
}

透過 CSEK 加密的資源建立永久磁碟

透過使用 CSEK 加密的快照建立磁碟

主控台

  1. 前往「Disks」(磁碟) 頁面。

    前往「Disks」(磁碟) 頁面

  2. 按一下 [Create Disk] (建立磁碟)

  3. 選取「Source type」(來源類型) 底下的 [Snapshot] (快照)

  4. 在「Encryption」下方,選取加密金鑰管理解決方案。

  5. 如果金鑰已使用公開 RSA 金鑰包裝,請選取「Wrapped key」

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 包裝) 金鑰,或是 Beta 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. 前往「Disks」(磁碟) 頁面。

    前往「Disks」(磁碟) 頁面

  2. 按一下 [Create Disk] (建立磁碟)

  3. 選取「Source type」(來源類型) 底下的 [Image] (映像檔)

  4. 在「Encryption」下方,選取加密金鑰管理解決方案。

  5. 如果金鑰已使用公開 RSA 金鑰包裝,請選取「Wrapped key」

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 包裝) 金鑰,或是 Beta 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 加密的磁碟連結至新的 VM

主控台

  1. 前往「Create an instance」(建立執行個體) 頁面。

    前往「Create an instance」(建立執行個體)

  2. 在「Boot disk」(開機磁碟) 部分,按一下「Change」(變更),然後執行下列操作:

    1. 在「Boot disk」頁面中,按一下「Existing disks」分頁標籤。
    2. 從「磁碟」清單中,選擇要連結至 VM 的現有加密磁碟。
    3. 在文字方塊中輸入加密金鑰,如果金鑰已使用公開 RSA 金鑰包裝,請選取「Wrapped key」(經過包裝的金鑰)。

    4. 按一下 [選取]。

  3. 繼續執行 VM 建立程序。

gcloud

如要建立 VM 並連結加密磁碟,請建立金鑰檔案,並使用 --csek-key-file 旗標在 VM 建立期間提供金鑰。如果您使用的是 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 建立 VM,並提供含有磁碟規格的 rawKeyrsaEncryptedKey。提出要求至 v1 API 來使用原始 (非 RSA 包裝) 金鑰,或是 Beta API 來使用 RSA 包裝金鑰。

範例磁碟規格的程式碼片段如下:

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

啟動或重新啟動磁碟已使用 CSEK 加密的 VM

如要進一步瞭解如何停止或啟動具有加密磁碟的 VM,請參閱「重新啟動具有加密磁碟的 VM」。

使用指令列建立混合資源

如果您要在單一要求中使用 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"
  }
]

如果您要使用金鑰檔案建立具有由客戶加密磁碟的 VM,並在同一個要求中同時建立具有標準加密磁碟的 VM,則可以按照以下方式執行這項操作:

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-owned and managed keys加密。

從永久磁碟中移除 CSEK

您可以將客戶加密磁碟的內容解密,並建立改用 Google-owned and managed keys 的新磁碟。

  1. 建立加密磁碟的映像檔,並為新映像檔指定自動加密。
  2. 使用新的映像檔來建立新的永久磁碟

在您建立新的永久磁碟後,Compute Engine 會使用Google-owned and managed keys 保護磁碟內容。您透過該磁碟建立的所有快照也必須使用Google-owned and managed keys