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. ディスクイメージ永続ディスク スナップショットインスタンスについて理解します。

  2. Compute Engine と Cloud KMS を同じ Google Cloud プロジェクトで実行するか、別のプロジェクトで実行するかを決定します。以下のドキュメントのサンプルでは次の表記方法を使用します。

    • [PROJECT_ID] は、Compute Engine を実行するプロジェクトのプロジェクト ID です
    • [PROJECT_NUMBER] は、Compute Engine を実行するプロジェクトのプロジェクト番号です
    • [KMS_PROJECT_ID] は、Cloud KMS を実行するプロジェクトのプロジェクト ID です(Compute Engine を実行するプロジェクトと同じプロジェクトである可能性もあります)。

    Google Cloud プロジェクト ID とプロジェクト番号については、プロジェクトの識別をご覧ください。

  3. Compute Engine を実行する Google Cloud プロジェクトで、Compute Engine の API アクセス権を設定します。

  4. Cloud KMS を実行する Google Cloud プロジェクトで、以下の操作を行います。

    1. Cloud KMS API を有効化します。
    2. 鍵リングと鍵の作成の説明に従って、鍵リングと鍵を作成します。
  5. Compute Engine サービス エージェントCloud KMS CryptoKey Encrypter/Decrypter 役割を割り当てます。このアカウントの形式は次のとおりです。

        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 を実行している Google Cloud プロジェクトの ID に置き換えます。[PROJECT_NUMBER] は、Compute Engine リソースを実行している Google Cloud プロジェクトのプロジェクト番号(プロジェクト ID ではない)に置き換えます。

仕様

暗号化

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

制限事項

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

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

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

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

Console

  1. Google Cloud Console で、[ディスク] ページに移動します。

    [ディスク] ページに移動

  2. [ディスクを作成] をクリックし、新しいディスクのプロパティを入力します。
  3. [暗号化] で、[顧客管理の暗号鍵] を選択します。
  4. プルダウン メニューを使用して、このディスクの暗号化に使用する Cloud KMS 鍵を選択します。
  5. [作成] をクリックしてディスクを作成します。

コマンドライン

    gcloud compute disks \
    create encrypted-disk \
    --kms-key projects/[KMS_PROJECT_ID]/locations/[REGION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]
    

API

kmsKeyName プロパティで diskEncryptionKey プロパティを使用して、ディスクを暗号化します。たとえば、インスタンスを作成するときに Cloud KMS 鍵を使用して新しいディスクを暗号化するには、次のようにします。

    POST
    https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances

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

同様に、API を使用して新しいスタンドアロン永続ディスクを作成し、Cloud KMS 鍵で暗号化することもできます。

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/
    [ZONE]/disks?sourceImage=https%3A%2F%2Fwww.googleapis.com%2Fcompute%2F
    projects%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 で暗号化されたディスクからスナップショットを作成する場合は、ディスクの暗号化に使用したのと同じ暗号鍵でスナップショットを保護する必要があります。

Console

  1. Google Cloud Console で、[スナップショット] ページに移動します。

    [スナップショット] ページに移動

  2. [スナップショットを作成] をクリックします。
  3. [ソースディスク] で、スナップショットのソースディスクを選択します。スナップショットは、ソースディスクで使用されているのと同じ鍵で自動的に暗号化されます。

コマンドライン

    gcloud compute \
    disks snapshot encrypted-disk \
    --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"
    }
    

CMEK によって保護されるスナップショットは、ディスク自体がすでに CMEK で保護されていない限り作成できません。さらに、暗号化されたディスクまたは暗号化されたスナップショットを変換して Compute Engine のデフォルトの暗号化を使用するには、完全に新しいディスク イメージと新しい永続ディスクを作成する必要があります。

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

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

Console

  1. Google Cloud Console で、[イメージ] ページに移動します。

    [イメージ] ページに移動

  2. [イメージを作成] をクリックします。
  3. [ソースディスク] で、イメージを作成するディスクを選択します。
  4. [暗号化] で、[顧客管理の暗号鍵] を選択します。
  5. プルダウン メニューを使用して、このイメージの暗号化に使用する Cloud KMS 鍵を選択します。
  6. イメージ作成プロセスを続けます。

コマンドライン

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

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

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

暗号化されたスナップショットを使用して新しいスタンドアロンの永続ディスクを作成するには:

Console

  1. Google Cloud Console で、[ディスク] ページに移動します。

    [ディスク] ページに移動

  2. [ディスクを作成] をクリックし、新しいディスクのプロパティを入力します。
  3. [ソースの種類] で、必要なスナップショットまたはイメージを選択します。
  4. 永続ディスクの作成プロセスを続けます。

コマンドライン

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

暗号化されたディスクを新しいインスタンスに接続する

Console

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

    [VM インスタンス] ページに移動

  2. [インスタンスを作成] をクリックします。
  3. [ブートディスク] の [変更] をクリックします。
  4. [既存のディスク] をクリックします。
  5. インスタンスに接続する既存のディスクを選択します。
  6. インスタンス作成処理を続けます。

コマンドライン

    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 のデフォルトの暗号化を使用する新しいディスクを作成できます。

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

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

暗号鍵の無効化または有効化の影響

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

  • 鍵で保護されているディスクが接続されている VM は起動できません
  • 鍵で保護されているディスクは、仮想マシンに接続することも、スナップショットを作成することもできません
  • 鍵で保護されたスナップショットはディスクの作成に使用できません
  • 鍵で保護されたイメージは、ディスクの作成に使用できません

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

制限事項

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