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

根據預設,Google Compute Engine 會對靜態資料進行加密。Compute Engine 會為您處理及管理這項預設加密作業,您不必進行任何其他操作。不過,假如您想自行控管加密作業,則可以自行提供加密金鑰。

如果您提供自己的加密金鑰,Compute Engine 會使用您的金鑰來保護 Google 所產生用於加密和解密資料的金鑰。對於由客戶提供的加密金鑰所保護的資源,只有能提供正確金鑰的使用者才能使用。

Google 不會將您的金鑰儲存在伺服器中,除非您提供金鑰,否則 Google 無法存取受保護的資料。這也代表假如您忘記或遺失金鑰,Google 無法還原金鑰或還原使用已遺失金鑰所加密的任何資料。

刪除永久磁碟時,Google 會捨棄加密金鑰,讓資料無法恢復。這項程序無法復原。

事前準備

規格

加密

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

限制

使用這項服務的一些限制如下:

一般限制

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

  • 巴西
  • 印度

技術限制

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

  • 您無法在本機 SSD 使用自己的金鑰,因為本機 SSD 的保存時間不會超過虛擬機器的生命期。本機 SSD 已受到臨時加密金鑰的保護;Google 不會保留該金鑰。

  • Compute Engine 不會利用執行個體範本儲存加密金鑰,因此您無法使用自己的金鑰來為代管執行個體群組中的磁碟加密。

金鑰格式規定

個人金鑰的產生與管理由您負責。您必須提供以 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 Platform 服務知道。使用 RSA 憑證來包裝金鑰,您可確保只有 Google Cloud Platform 服務可以為您的金鑰解除包裝,並且使用它來保護您的資料。

詳情請參閱 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 cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
import requests

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

def get_google_public_cert_key():
    r = requests.get(GOOGLE_PUBLIC_CERT_URL)
    r.raise_for_status()

    # Load the certificate.
    certificate = x509.load_pem_x509_certificate(
        r.text.encode('utf-8'), default_backend())

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

    return public_key

def wrap_rsa_key(public_key, private_key_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.
    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):
    # 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)

    print('Base-64 encoded private key: {}'.format(
        base64.b64encode(customer_key_bytes).decode('utf-8')))
    print('Wrapped RSA key: {}'.format(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 包裝金鑰

使用 gcloud 指令列工具時,您可以透過同樣方法提供標準金鑰和 RSA 包裝金鑰。

API 中,如果您想要改用 RSA 包裝金鑰,請使用 sha256 屬性,而非 rawKey

使用指令列工具為資源加密

設定

您可以透過 gcloud 指令列工具使用加密金鑰。

下載並安裝 gcloud

金鑰檔案

當您使用 gcloud compute 指令列工具設定金鑰時,即使用包含編碼金鑰 (以 JSON 清單格式) 的金鑰檔案提供編碼金鑰。金鑰檔案可包含多個金鑰,允許您在一個位置管理多個金鑰。您也可以建立單一金鑰檔案來分別處理每個金鑰。金鑰檔案只能透過 gcloud 工具使用。使用 API 時,您必須直接在要求中提供金鑰。

金鑰檔案的每個項目都提供以下內容:

  • 金鑰所保護資源的完整 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"
  }
]

管理金鑰檔案的最佳做法

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

使用自己的金鑰為新的永久磁碟加密

藉由在執行個體或磁碟建立期間提供金鑰,您可以為新的永久磁碟加密。

主控台

  1. 前往磁碟頁面。

    前往磁碟頁面

  2. 按一下 [New disk] (新增磁碟),並輸入新磁碟的屬性。
  3. 在「Encryption」(加密) 底下,選取下拉式選單中的 [Customer Supplied] (由客戶提供)
  4. 在文字方塊中提供磁碟的加密金鑰,如果金鑰已使用公開 RSA 金鑰包裝,請選取 [Wrapped key] (經過包裝的金鑰)

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

API

在 API 中,使用 diskEncryptionKey 屬性加密磁碟並且提出要求至 v1 API 來使用原始 (非 RSA 包裝) 金鑰,或是 Beta API 來使用 RSA 包裝金鑰。在要求中提供下列屬性的其中之一:

  • rawKey:如果您的金鑰只採用了 Base64 編碼方式
  • rsaEncryptedKey:如果您的金鑰是 RSA 包裝並採 Base64 編碼

舉例來說,如何使用 RSA 包裝金鑰在執行個體建立期間加密新磁碟:

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

{
"machineType": "zones/us-central1-a/machineTypes/n1-standard-1",
"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
 }
],
...
}

同樣地,您也可以使用 API 建立新的獨立式永久磁碟,並使用您自己的金鑰對其進行加密:

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

透過加密磁碟建立快照

如果您要透過加密磁碟建立快照,則快照也必須加密。您必須指定金鑰才能加密快照。除非您建立全新的磁碟映像檔和新的永久磁碟,否則無法將加密磁碟或加密快照轉換為使用 Compute Engine 預設加密功能。

加密磁碟的快照一律是完整快照,儲存成本比增量快照高。

如要透過加密磁碟建立永久磁碟快照,您的快照建立要求必須提供用於為永久磁碟加密的加密金鑰。

請在建立快照之前參閱永久磁碟快照的最佳做法

主控台

  1. 前往快照頁面。

    前往快照頁面

  2. 按一下 [New snapshot] (新增快照)
  3. 在「Source disk」(來源磁碟) 底下,選擇要建立快照的加密磁碟。
  4. 在文字方塊中提供磁碟的加密金鑰,如果金鑰已使用公開 RSA 金鑰包裝,請選取 [Wrapped key] (經過包裝的金鑰)
  5. 在「Encryption」(加密) 部分底下,提供其他加密金鑰來為新快照加密。

API

在 API 中,提供 sourceDiskEncryptionKey 屬性來存取來源永久磁碟。您也可以視需要使用 snapshotEncryptionKey 屬性來為新快照加密。

提出要求至 v1 API 來使用原始 (非 RSA 包裝) 金鑰,或是 Beta API 來使用 RSA 包裝金鑰。

POST https://www.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 允許您提供為快照加密的金鑰,而當您在使用快照建立新的永久磁碟時,必須提供相符的金鑰。該金鑰必須遵守與上述相同的金鑰格式。您也可以選擇將這個屬性維持為未定義,且快照無需金鑰即可用於建立新的永久磁碟。

透過加密磁碟或加密自訂映像檔建立新的映像檔

透過已加密的永久磁碟或複製已加密的映像檔,您可以建立自訂映像檔。您無法使用主控台來複製映像檔。請使用 gcloud 指令列工具或 API 來複製映像檔。

主控台

  1. 在 Google Cloud Platform 主控台,前往「建立映像檔」頁面。
    前往建立映像檔頁面
  2. 按一下 [New image] (新建映像檔)。
  3. 在「Source disk」(來源磁碟) 底下,選擇要為其建立映像檔的加密磁碟。
  4. 在文字方塊中提供磁碟的加密金鑰,如果金鑰已使用公開 RSA 金鑰包裝,請選取 [Wrapped key] (經過包裝的金鑰)
  5. 透過在「Encryption」(加密) 部分底下提供加密金鑰,您也可以視需要為新的映像檔加密。

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

API

您的 API 建立要求必須包含來源物件的加密金鑰屬性。例如,根據來源物件類型,納入下列屬性的其中之一:

  • 永久磁碟:sourceDiskEncryptionKey
  • 映像檔:sourceImageEncryptionKey

另外根據金鑰類型,rawKeyrsaEncryptedKey 屬性。提出要求至 v1 API 來使用原始 (非 RSA 包裝) 金鑰,或是 Beta API 來使用 RSA 包裝金鑰。以下範例會將使用 RSA 包裝金鑰的加密永久磁碟轉換為使用相同加密金鑰的映像檔。

POST https://www.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 屬性允許您提供為映像檔加密的金鑰,而當您在使用映像檔建立新的永久磁碟時,必須提供相符的金鑰。該金鑰必須遵守與上述相同的金鑰格式。您也可以選擇將這個屬性維持為未定義,且映像檔無需金鑰即可用於建立新的永久磁碟。

加密匯入的映像檔

手動將自訂映像檔匯入至 Compute Engine 時,您可以為新的映像檔加密。在匯入映像檔之前,您必須先建立並壓縮磁碟映像檔檔案,然後將該壓縮檔案上傳至 Google Cloud Storage

請匯入您要加密的自訂 Compute Engine 映像檔。指定壓縮檔案的 URI 並且另外指定您加密金鑰檔案的路徑。

主控台

  1. 前往映像檔頁面。

    前往映像檔頁面

  2. 按一下 [New image] (新建映像檔)。
  3. 在「Source type」(來源類型) 底下,選取 [Cloud Storage object] (Cloud Storage 物件)。
  4. 在「Encryption」(加密) 底下,選取 [Customer supplied] (由客戶提供),並在文字方塊中提供加密金鑰來為映像檔加密。
  5. 在「Cloud Storage object path」(Cloud Storage 物件路徑) 部分,輸入 Cloud Storage URI。

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] 是本機工作站上加密金鑰檔案的路徑。

API

如要加密從 RAW 檔案建立的新映像檔,請將新 imageEncryptionKey 屬性加到映像檔建立要求中,後面加上 rawKey 或是 rsaEncryptedKey。提出要求至 v1 API 來使用原始 (非 RSA 包裝) 金鑰,或是 Beta API 來使用 RSA 包裝金鑰。

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

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

透過加密快照建立磁碟

主控台

  1. 前往磁碟頁面。

    前往磁碟頁面

  2. 按一下 [New disk] (新增磁碟)。
  3. 選取「Source type」(來源類型) 底下的 [Snapshot] (快照)
  4. 在文字方塊中提供快照的加密金鑰,如果金鑰已使用公開 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

API

如要使用加密快照,請在要求中提供 sourceSnapshotEncryptionKey,後面加上 rawKeyrsaEncryptedKey。提出要求至 v1 API 來使用原始 (非 RSA 包裝) 金鑰,或是 Beta API 來使用 RSA 包裝金鑰。舉例來說,使用加密快照至獨立式永久磁碟:

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

透過加密映像檔建立磁碟

主控台

  1. 前往磁碟頁面。

    前往磁碟頁面

  2. 按一下 [New disk] (新增磁碟)。
  3. 選取「Source type」(來源類型) 底下的 [Image] (映像檔)
  4. 在文字方塊中提供映像檔的加密金鑰,如果金鑰已使用公開 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

API

如要使用加密映像檔,請提供 sourceImageEncryptionKey,後面加上 rawKeyrsaEncryptedKey。提出要求至 v1 API 來使用原始 (非 RSA 包裝) 金鑰,或是 Beta API 來使用 RSA 包裝金鑰。

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

將加密磁碟附加到新執行個體

主控台

  1. 前往 VM 執行個體頁面。

    前往 VM 執行個體頁面

  2. 按一下 [New instance] (新建執行個體)。
  3. 按一下「Boot」(啟動) 底下的 [Change] (變更)。
  4. 選取 [Existing disk] (現有磁碟)。
  5. 選擇要附加到執行個體的現有磁碟。
  6. 在文字方塊中提供加密金鑰,如果金鑰已使用公開 RSA 金鑰包裝,請選取 [Wrapped key] (經過包裝的金鑰)。
  7. 繼續執行個體建立程序。

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

API

使用 Compute Engine API 建立執行個體,並提供含有磁碟規格的 rawKeyrsaEncryptedKey。提出要求至 v1 API 來使用原始 (非 RSA 包裝) 金鑰,或是 Beta API 來使用 RSA 包裝金鑰。

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

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

啟動或重新啟動具有加密磁碟的執行個體

想進一步瞭解如何停止或啟動具有加密磁碟的執行個體,請參閱重新啟動具有加密磁碟的執行個體

使用指令列建立混合資源

如果您要在單一要求中使用 gcloud 指令列工具建立由客戶加密和標準加密的混合資源,可以在要求中使用具有金鑰檔案的 --csek-key-file 標記和 --no-require-csek-key-create 標記。藉由提供這兩個標記,gcloud 工具會建立由客戶加密的資源 (明確在金鑰檔案中定義),也會建立任何您指定的標準資源。

舉例來說,假設金鑰檔案包含以下內容:

[
  {
  "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 金鑰加密。

從永久磁碟中刪除客戶提供的加密金鑰

您可以將客戶加密磁碟的內容解密,並建立改用 Compute Engine 預設加密的新磁碟。

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

在您建立新的永久磁碟後,該磁碟會使用 Compute Engine 預設加密保護磁碟內容。您透過該磁碟建立的所有快照也必須使用預設加密。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件