Cloud KMS 鍵を使用してリソースを保護する

Compute Engine のデフォルトではお客様の保存コンテンツが暗号化されます。Compute Engine はこの暗号化を自動的に処理および管理するため、お客様側での作業は必要ありません。ただし、この暗号化を自分で制御して管理する場合は、鍵暗号鍵を使用できます。鍵暗号鍵はデータを直接暗号化するのではなく、データを暗号化するデータ暗号鍵の暗号化に使用されます。

Compute Engine の鍵暗号鍵には 2 つのオプションがあります。

  • Cloud Key Management Service を使用して鍵暗号鍵を作成し、管理します。詳細については、鍵管理をご覧ください。このトピックでは、顧客管理の暗号鍵(CMEK)と呼ばれるこのオプションの詳細について説明します。

  • 独自の鍵暗号鍵を作成して管理します。顧客指定の暗号鍵(CSEK)とも呼ばれるこのオプションの詳細については、顧客指定の暗号鍵でディスクを暗号化するをご覧ください。

Cloud KMS が保護する Compute Engine リソースを作成した後、Compute Engine は使用された KMS 鍵を認識しているため、鍵を指定する必要はありません。これは、Compute Engine が顧客指定の暗号鍵で保護されたリソースにアクセスする方法とは異なります。そのようなアクセスの場合、顧客指定の暗号鍵を指定する必要があります。

詳細については、Google Cloud での暗号化オプションをご覧ください。

始める前に

  1. ディスクイメージ永続ディスクのスナップショット仮想マシン(VM)インスタンスについて理解します。

  2. Compute Engine と Cloud KMS を同じ Google Cloud プロジェクトで実行するか、別のプロジェクトで実行するかを決定します。

    Google 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 Agent に割り当てます。このアカウントの形式は次のとおりです。

    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 ではない)。

制限事項

  • リージョン リソース(ディスク)は、同じロケーションまたは global ロケーションの鍵によって暗号化できます。たとえば、ゾーン us-west1-a 内のディスクは、us-west1 または global の鍵によって暗号化できます。グローバル リソース(イメージ、スナップショット)は、任意のロケーションの鍵で暗号化できます。

  • ディスク、スナップショット、イメージによる鍵の暗号化は永続的です。リソースから暗号化を削除することや、使用する鍵を変更することはできません。暗号化や変更鍵を削除するには、新しい暗号化オプションを指定して、リソースのコピーを作成する必要があります。

仕様

このセクションでは、Cloud KMS 鍵の使用における暗号化仕様と制限事項について説明します。

暗号化

Compute Engine でデータを保護するために使用される Cloud KMS 鍵は、AES-256 鍵です。これらの鍵は鍵暗号鍵であり、データを暗号化するデータ暗号鍵を暗号化します。

制限事項

  • 独自の鍵で暗号化できるのは、新しい永続ディスク、イメージ、スナップショットのみです。独自の鍵で既存のリソースを暗号化することはできません。

  • ローカル SSD が存続するのは VM の存続期間内に限られます。したがって、ローカル SSD で顧客指定の暗号鍵を使うことはできません。ローカル SSD はエフェメラル暗号鍵で保護されますが、Google はこの鍵を保持しません。

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

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

Console

  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

kmsKeyName プロパティで diskEncryptionKey プロパティを使用して、ディスクを暗号化します。たとえば、VM の作成時に 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: VM を作成するゾーン
  • 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 で暗号化されたディスクから作成されたスナップショットを保護するには、ディスクの暗号化に使用した同じ暗号鍵を使用する必要があります。

CMEK で暗号化されたディスクのスナップショットは増分です。

Console

  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 のデフォルトの暗号化を使用することもできません。そのためには、まったく新しいディスク イメージと新しい永続ディスクを作成する必要があります

インポートしたイメージを CMEK で暗号化する

Compute Engine へのカスタム イメージのインポート時に新しいイメージを暗号化できます。イメージをインポートする前に、ディスク イメージ ファイルを作成して圧縮し、圧縮したファイルを Cloud Storage にアップロードする必要があります。

Console

  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 は、イメージの暗号化に使用する鍵の名前に置き換えます。

CMEK で暗号化されたリソースから永続ディスクを作成する

CMEK で暗号化されたスナップショットからディスクを作成する

暗号化されたスナップショットを使用して新しいスタンドアロンの永続ディスクを作成する手順は次のとおりです。

Console

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

CMEK で暗号化されたブートディスクを新しい VM にアタッチする

Console

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

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

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

    1. [既存のディスク] をクリックします。
    2. [ディスク] リストで、VM にアタッチする既存のディスクを選択します。
    3. [選択] をクリックします。
  3. VM 作成プロセスを続行します。

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. 新しいスナップショットを使用して、前の手順でローテーションした鍵で新しい永続ディスクを作成します。

新しい永続ディスクを作成すると、新しい鍵バージョンが暗号化に使用されます。そのディスクから作成されるスナップショットでも、同じ鍵バージョンが使用されます。

鍵をローテーションする場合、以前の鍵バージョンで暗号化されたデータは自動的に再暗号化されません。詳細については、データの再暗号化をご覧ください。鍵をローテーションしても、既存の鍵バージョンが自動的に無効化または破棄されることはありません。

CMEK の無効化または削除の影響

暗号鍵を無効化または削除すると、その鍵で保護されているリソースに次のような影響があります。

  • ディスクがアタッチされている VM は起動できません。鍵取り消し時の VM シャットダウンを有効にしている場合、鍵で保護されているディスクがアタッチされた VM はシャットダウンされます。
  • ディスクは VM にアタッチできません。また、VM のスナップショットも作成できません。
  • スナップショットはディスクの作成には使用できません。
  • イメージを使用してディスクを作成することはできません。

鍵を無効にしている場合は、鍵を有効にすることで上記の影響を元に戻すことができます。キーを削除した場合、上記の影響を元に戻すことはできません。

Cloud KMS 鍵取り消し時の VM シャットダウンを構成する

VM にアタッチされている永続ディスクを保護する Cloud KMS 鍵を取り消すと、VM を自動的にシャットダウンするように構成できます。鍵を取り消すには、鍵を無効化または削除します。この設定を有効にすると、VM は鍵の取り消しから 3 時間以内にシャットダウンされます。

鍵を再度有効にすると、鍵で保護されたディスクがアタッチされた VM を再起動できます。鍵を有効にした後、VM は自動的に再起動されません。

gcloud ツールまたは Compute Engine API を使用して VM を作成する際に、鍵取り消し時にシャットダウンされるように VM を構成できます。

gcloud

gcloud beta compute instances create コマンドを使用して VM を作成し、フィールド --post-key-revocation-action-type=shutdown を設定します。

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

API

instances.insert メソッドを使用して VM を作成し、フィールド "postKeyRevocationActionType": "SHUTDOWN" を設定します。次の例では、公開イメージから VM を作成します。

 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 を使用して、鍵取り消し時にシャットダウンされる VM を作成するインスタンス テンプレートを構成することもできます。

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 では、必要なすべての構成フィールドを明示的に定義する必要があります。このテンプレートから作成された VM を鍵取り消し時にシャットダウンする場合は、"postKeyRevocationActionType": "SHUTDOWN" を指定します。たとえば、鍵取り消し時にシャットダウンされる VM を作成するために最小限必要なフィールドを持つインスタンス テンプレートは、次のようになります。

  {
  "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 の取り消し時にシャットダウンされるように構成された VM を作成してから、Cloud KMS 鍵で暗号化された永続ディスクを作成してアタッチします。