顧客指定の暗号鍵でディスクを暗号化する


Compute Engine はすべての保存データをデフォルトで暗号化します。Compute Engine はこの暗号化を自動的に処理および管理するため、お客様側での作業は必要ありません。ただし、自身でこの暗号化の制御と管理を希望する場合は、独自の暗号鍵を提供できます。

お客様が独自の暗号鍵を提供した場合、Compute Engine はその鍵を使用して、データの暗号化と復号に使用される Google 生成の鍵を保護します。正しい鍵を提供できるお客様だけが、顧客指定の暗号鍵(CSEK)で保護されたリソースを使用できます。

Google は顧客指定の暗号鍵を保持していません。お客様が鍵を提供しない限り、保護されたデータにはアクセスできません。また、このことは、お客様が鍵を忘れたりなくしたりした場合、Google には失われた鍵または鍵で暗号化されているデータを復旧する手段がないことも意味します。

永続ディスクを削除すると、Google は暗号鍵を破棄し、データを回復不能にします。このプロセスは元に戻せません。

詳細については、Compute Engine での CSEK の仕組みをご覧ください。

始める前に

制限事項

CSEK の場合、次の制限が適用されます。

一般的な制限事項

顧客指定の暗号鍵を使用できるかどうかは、リソースのロケーションではなく、請求先アカウントのロケーションに応じて決まります。

次の国にある請求先アカウントでは、顧客指定の暗号鍵を使用できません。

  • ブラジル
  • インド

技術的な制限事項

  • 顧客指定の暗号鍵で暗号化できるのは、新しい永続ディスクだけです。既存の永続ディスクを独自の鍵で暗号化することはできません。

  • ローカル SSD は VM の有効期間を越えて存続しないので、ローカル SSD に独自の鍵を使うことはできません。ローカル SSD はエフェメラル暗号鍵ですでに保護されていますが、Google はこの鍵を保持しません。

  • Compute Engine はインスタンス テンプレートで暗号鍵を保存しないため、マネージド インスタンス グループ内のディスクを暗号化するには顧客指定の暗号鍵を KMS に保存する必要があります。

  • CSEK で保護されたディスクがアタッチされているインスタンスは一時停止できません。

仕様

このセクションでは、CSEK の暗号化仕様と形式について説明します。

暗号化

Compute Engine は顧客指定の暗号鍵を使用して、Google の暗号鍵を AES-256 暗号化で保護します。

必要な鍵の形式

顧客指定の暗号鍵の生成と管理はお客様自身が行う必要があります。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 が管理する証明書で提供される公開鍵を使って、鍵をラップします。鍵をラップする際は、PKCS #1 v1.5 パディングではなく、必ず OAEP パディングを使用してください。
  2. 標準の Base64 エンコードを使って、RSA でラップされた鍵をエンコードします。

Compute Engine によって管理される公開鍵証明書は、次の場所からダウンロードします。

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

鍵を生成して RSA でラップするにはさまざまな方法があるので、慣れた方法を使ってください。鍵を RSA でラップする 2 つの例を次に示します。

例 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. RSA でラップした鍵を Base64 でエンコードします。

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

例 2

次に示す Python スクリプトの例は、256 ビット(32 バイト)のランダムな文字列を生成し、cryptography ライブラリを使って、RSA でラップされ Base64 でエンコードされた鍵を作成します。

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 でラップされた鍵を代わりに使用するには、rawKey ではなく sha256 プロパティを使用します。

コマンドライン ツールを使用して CSEK でリソースを暗号化する

設定

暗号鍵は Google Cloud CLI で使用できます。

gcloud をダウンロードしてインストールします。

鍵ファイル

gcloud compute コマンドライン ツールを使って鍵を設定するときは、エンコードされた鍵が JSON リストとして含まれる鍵ファイルを使って、エンコードされた鍵を指定します。1 つの鍵ファイルに複数の鍵を格納し、多くの鍵を一元的に管理できます。または、鍵ごとにファイルを作成して鍵を個別に処理することもできます。鍵ファイルは gcloud CLI でのみ使用できます。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"
  }
]

鍵ファイルの管理に関するベスト プラクティス

鍵ファイルを使う場合は、必要なユーザーだけがファイルにアクセスできるように制限する必要があります。鍵ファイルに対する適切な権限を設定し、次のようなツールを使ってファイルを暗号化することを検討してください。

CSEK で新しい永続ディスクを暗号化する

VM またはディスクの作成時に鍵を指定することにより、新しい永続ディスクを暗号化できます。

Console

  1. [ディスク] ページに移動します。

    [ディスク] に移動

  2. [ディスクを作成] をクリックし、新しいディスクのプロパティを入力します。

  3. [暗号化] で、[お客様が指定する鍵] を選択します。

  4. テキスト ボックスにディスクの暗号鍵を入力し、鍵を公開 RSA 鍵でラップしてある場合は [ラップされている鍵] を選択します。

gcloud

gcloud compute ツールで VM を作成する際に --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 プロパティを使用し、未加工(RSA でラップされていない)鍵の場合は v1 API へのリクエストを、RSA でラップされた鍵の場合はベータ版 API へのリクエストを行ってディスクを暗号化します。リクエストで次のいずれかのプロパティを指定します。

  • rawKey: 鍵が Base64 でエンコードされている場合
  • rsaEncryptedKey - 鍵が RSA でラップされ、さらに Base64 でエンコードされている場合

たとえば、VM 作成時に 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
 }
],
...
}

同様に、API を使ってスタンドアロンの永続ディスクを新しく作成し、独自の鍵でそれを暗号化することもできます。

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. [暗号化] セクションで追加の暗号鍵を指定して、新しいスナップショットを暗号化します。

API

API では、sourceDiskEncryptionKey プロパティを指定して、ソース永続ディスクにアクセスします。snapshotEncryptionKey プロパティを使用して、新しいスナップショットを暗号化する必要があります。

未加工(RSA でラップされていない)鍵の場合は v1 API へのリクエストを、RSA でラップされた鍵の場合はベータ版 API へのリクエストを行います。

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 か API を使用します。

コンソール

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

API

API 作成リクエストでは、ソース オブジェクトの暗号鍵プロパティを指定する必要があります。たとえば、ソース オブジェクトのタイプに応じて、次のいずれかのプロパティを指定します。

  • 永続ディスク: sourceDiskEncryptionKey
  • イメージ: sourceImageEncryptionKey

また、鍵タイプに応じて、rawKey プロパティまたは rsaEncryptedKey プロパティを指定します。未加工(RSA でラップされていない)鍵の場合は v1 API へのリクエストを、RSA でラップされた鍵の場合はベータ版 API へのリクエストを行います。次の例では、暗号化されて 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 を指定し、さらに暗号鍵ファイルへのパスを指定します。

Console

  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]: ローカル ワークステーション上にある暗号鍵ファイルのパス。

API

未加工ファイルから作成された新しいイメージを暗号化するには、新しい imageEncryptionKey プロパティとそれに続く rawKey または rsaEncryptedKey を、イメージ作成リクエストに追加します。未加工(RSA でラップされていない)鍵の場合は v1 API へのリクエストを、RSA でラップされた鍵の場合はベータ版 API へのリクエストを行います。

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 で暗号化されたスナップショットからディスクを作成する

Console

  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

API

暗号化されたスナップショットを使用するには、リクエストで sourceSnapshotEncryptionKey に続けて rawKey または rsaEncryptedKey を指定します。未加工(RSA でラップされていない)鍵の場合は v1 API へのリクエストを、RSA でラップされた鍵の場合はベータ版 API へのリクエストを行います。たとえば、暗号化されたスナップショットを使用して新しいスタンドアロンの永続ディスクを作成するには、次のように指定します。

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 で暗号化されたイメージからディスクを作成する

Console

  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

API

暗号化されたイメージを使用するには、sourceImageEncryptionKey に続けて rawKey または rsaEncryptedKey を指定します。未加工(RSA でラップされていない)鍵の場合は v1 API へのリクエストを、RSA でラップされた鍵の場合はベータ版 API へのリクエストを行います。

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 にアタッチする

Console

  1. [インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. [ブートディスク] セクションで [変更] をクリックし、次の操作を行います。

    1. [ブートディスク] ページで、[既存のディスク] タブをクリックします。
    2. [ディスク] リストから、VM にアタッチする既存の暗号化ディスクを選択します。
    3. テキスト ボックスに暗号鍵を入力します。鍵を公開 RSA 鍵でラップしてある場合は [ラップされている鍵] を選択します。

    4. [選択] をクリックします。

  3. VM 作成プロセスを続行します。

gcloud

VM を作成して暗号化されたディスクをアタッチするには、鍵ファイルを作成し、VM の作成時に --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 を使用して VM を作成し、ディスクの指定で rawKey または rsaEncryptedKey を設定します。未加工(RSA でラップされていない)鍵の場合は v1 API へのリクエストを、RSA でラップされた鍵の場合はベータ版 API へのリクエストを行います。

ディスク指定の例を次に示します。

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

CSEK で暗号化されたディスクのある VM を起動または再起動する

暗号化されたディスクのある VM の停止または起動の詳細については、暗号化されたディスクのある VM の再起動をご覧ください。

コマンドラインを使用した混合リソースの作成

Google Cloud CLI を使用して、顧客指定の暗号鍵で暗号化されたリソースと標準の暗号鍵で暗号化されたリソースの組み合わせ(混合リソース)を 1 回のリクエストで作成する場合は、--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

example-disk-2 ディスクは鍵ファイルで明示的に定義されていないため、通常、--csek-key-file フラグを指定しても、このディスクを作成することはできません。--no-require-csek-key-create を追加することにより、鍵ファイルを使用して暗号化されるディスクと、Google 暗号化を使用して暗号化される別のディスクが、両方とも作成されます。

永続ディスクから CSEK を削除する

顧客指定の暗号化ディスクの内容を復号し、代わりに Compute Engine のデフォルトの暗号化を使用する新しいディスクを作成できます。

  1. 暗号化されたディスクのイメージを作成し、新しいイメージに対して自動暗号化を指定します。
  2. 新しいイメージを使用して、新しい永続ディスクを作成します。

このようにして作成された新しい永続ディスクは、Compute Engine のデフォルトの暗号化を使用してディスクの内容を保護します。そのディスクから作成されるスナップショットはいずれも、デフォルトの暗号化を使用する必要があります。