Confidential Google Kubernetes Engine Node で使用中のワークロード データを暗号化する


このページでは、Confidential Google Kubernetes Engine ノードを使用して、ノードとワークロードで使用中のデータの暗号化を適用する方法を説明します。

概要

ワークロードを暗号化するには、Confidential GKE Node を使用するか、Hyperdisk Balanced の情報保護モードを使用します。

Confidential GKE Node

Confidential GKE Node は、AMD Secure Encryption Virtualization(SEV)を使用して Compute Engine Confidential VMs 上に構築されており、この機能によって VM の使用中メモリの内容が暗号化されます。使用中の暗号化は、エンドツーエンドの暗号化に関する 3 つの状態のうちの一つです。

クラスタまたはノードプールで Confidential GKE Node を有効にすると、機密ノード上で実行されているワークロード内のデータは使用中に暗号化されます。コントロール プレーンを可視化するには、アクセスの透明性を使用します。

次のいずれかを行うときに、Confidential GKE Node を有効にできます。

  • 新しいクラスタの作成
  • 新しいノードプールを作成する
  • 既存のノードプールを更新する

既存のクラスタを更新して、クラスタレベルの Confidential GKE Node の設定を変更することはできません。

次の表は、クラスタレベルまたはノードプール レベルで Confidential GKE Node を有効にした場合に適用される GKE の動作を示しています。

Confidential GKE Node の設定 設定方法 動作
クラスタレベル 新しいクラスタを作成する 任意のノードプール内のクラスタ内のすべてのノードで Confidential GKE Node が使用されます。以下のことはできません
  • クラスタ内の新規または既存のノードプールに対して Confidential GKE Node を無効にする
  • クラスタで Confidential GKE Node を無効にする
  • 既存のクラスタで Confidential GKE Node を有効にする
ノードプール レベル
  • 新しいノードプールを作成する
  • 既存のノードプールを更新する
この機能がクラスタレベルで無効になっている場合にのみ、ノードプールに対して Confidential GKE Node を構成できます。

Hyperdisk Balanced の情報保護モード

Hyperdisk Balanced の情報保護モードをブートディスク ストレージに対して有効にすることもできます。これにより、追加のハードウェアベース エンクレーブでデータが暗号化されます。

Hyperdisk Balanced の情報保護モードは、次のいずれかを行うときに有効化できます。

  • 新しいクラスタを作成する
  • 新しいノードプールを作成する

既存のクラスタまたはノードプールを更新して Hyperdisk Balanced の情報保護モードの設定を変更することはできません。

次の表に、Hyperdisk Balanced の情報保護モードの設定をクラスタレベルまたはノードプール レベルで有効にしたときに適用される GKE の動作を示します。

Hyperdisk Balanced の情報保護モードの設定 構成方法 動作
クラスタレベル 新しいクラスタを作成する クラスタのデフォルト ノードプールのみが、Hyperdisk Balanced の情報保護モードの設定を使用します。以下のことはできません
  • クラスタ内の既存のノードプールに対して Hyperdisk Balanced の情報保護モードの設定を無効にする
  • 既存のクラスタに対して Hyperdisk Balanced の情報保護モードの設定を有効にする
ノードプール レベル 新しいノードプールを作成する 新しいノードプールについては、その作成時に Hyperdisk Balanced の情報保護モードの設定を構成できます。Hyperdisk Balanced の情報保護モードの設定を使用するように既存のノードプールを更新することはできません。

料金

Compute Engine Confidential VMs の料金以外に、Confidential GKE Node をデプロイするための追加料金はかかりません。ただし、Confidential GKE Node は、起動時に生成するログデータが標準ノードよりも若干多くなることがあります。ログの料金については、Google Cloud Observability の料金をご覧ください。

可用性

Confidential GKE Node は次の状況で使用できます。

始める前に

始める前に、次の作業が完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

クラスタで Confidential GKE Node を有効にする

gcloud CLI または Google Cloud コンソールを使用して、Confidential GKE Node が有効になっている新しいクラスタを作成できます。クラスタレベルで Confidential GKE Node を有効にすると、クラスタ内のすべてのノードが Confidential VMs になります。

gcloud

新しいクラスタを作成するときに、gcloud CLI で --enable-confidential-nodes オプションを指定します。

gcloud container clusters create CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --enable-confidential-nodes

次のように置き換えます。

  • CLUSTER_NAME: 新しいクラスタの名前。
  • MACHINE_TYPE: クラスタのデフォルト ノードプールのマシンタイプ。N2D マシンタイプまたは C2D マシンタイプである必要があります。

コンソール

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. [ 作成] をクリックします。

  3. [Standard] セクションで [構成] をクリックします。

  4. ナビゲーション パネルの [クラスタ] の下の [セキュリティ] をクリックします。

  5. [Confidential GKE Node を有効にする] チェックボックスをオンにします。

  6. 必要に応じてクラスタを構成します。

  7. [作成] をクリックします。

クラスタの作成の詳細については、リージョン クラスタの作成をご覧ください。

Confidential GKE Node を使用してクラスタを作成すると、このクラスタ内で作成されたノードプールは機密ノードしか使用できません。Confidential GKE Node が有効になっているクラスタには、通常のノードプールを作成できません。また、クラスタレベルで Confidential GKE Node が有効になっている場合、個々のノードプールで Confidential GKE Node を無効にすることはできません。

Hyperdisk Balanced の情報保護モードの設定を指定して作成されたノードプールについては、そのノードプール内のノードのみが、指定した設定に従うよう制約されます。クラスタ内に作成される新しいノードプールについては、作成時に情報保護モードを設定する必要があります。

ノードプールで Confidential GKE Node を有効にする

クラスタレベルで Confidential GKE Node が無効になっている場合、特定のノードプールで Confidential GKE Node を有効にすることができます。

Hyperdisk Balanced の情報保護モードの設定は、ノードプールの作成をリクエストするときに指定する必要があります。

新しいノードプールを作成する

Confidential GKE Node が有効になっている新しいノードプールを作成するには、次のコマンドを実行します。

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --enable-confidential-nodes

次のように置き換えます。

  • NODE_POOL_NAME: 新しいノードプールの名前。
  • CLUSTER_NAME: クラスタの名前。
  • MACHINE_TYPE: ノードプールのマシンタイプ。N2D マシンタイプまたは C2D マシンタイプである必要があります。

既存のノードプールを更新する

N2D マシンタイプまたは C2D マシンタイプを使用する既存のノードプールで Confidential GKE Node を有効にできます。次のコマンドを実行します。

gcloud container node-pools update NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --enable-confidential-nodes

次のように置き換えます。

  • NODE_POOL_NAME: ノードプールの名前。
  • CLUSTER_NAME: クラスタの名前。

Confidential GKE Node が有効になっていることを確認する

クラスタ上

クラスタが Confidential GKE Node を使用しているかどうかは、gcloud CLI または Google Cloud コンソールを使用して確認できます。

gcloud

クラスタの説明を表示します。

gcloud container clusters describe CLUSTER_NAME

Confidential GKE Node が有効になっている場合、コマンドの出力に次の行が含まれます。

confidentialNodes:
  enabled: true

コンソール

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. 検査するクラスタの名前をクリックします。

  3. [セキュリティ] の [Confidential GKE Node] フィールドで、Confidential GKE Node が「有効」になっていることを確認します。

ノードプール上

ノードプールが Confidential GKE Node を使用しているかどうかを確認するには、次のコマンドを実行します。

gcloud container node-pools describe NODE_POOL_NAME \
    --cluster=CLUSTER_NAME

Confidential GKE Node が有効化されている場合、出力は次のようになります。

confidentialNodes:
  enabled: true

Hyperdisk Balanced の情報保護モードの設定が有効化されている場合、出力は次のようになります。

enableConfidentialStorage: true

ノード上

特定のノードの機密性を検証するには、次のいずれかを行います。

  1. AMD SEV が有効になっていることを検証する
  2. Cloud Monitoring を使用して Confidential VMs を検証する

Confidential GKE Node でアプリケーションを実行する

Confidential Computing に対する Google のアプローチは、既存のアプリケーションを簡単にリフト&シフトできるようにすることです。現在実行しているすべての GKE ワークロードは、コードに一切変更を加えることなく、Confidential GKE Node 上で実行できます。

任意で、Confidential GKE Node を使用しているクラスタでのみワークロードを実行すべきことを宣言したい場合は、cloud.google.com/gke-confidential-nodes ノードセレクタを使用できます。このセレクタを使用する Pod の仕様の例を以下に示します。

apiVersion: v1
kind: Pod
spec:
  containers:
  - name: my-confidential-app
    image: us-docker.pkg.dev/myproject/myrepo/my-confidential-app
  nodeSelector:
    cloud.google.com/gke-confidential-nodes: "true"

組織のポリシーの制約を設定する

組織のポリシーの制約を定義して、組織全体に作成された VM リソースすべてが Confidential VMs インスタンスであることを保証できます。GKE の場合、[Confidential Computing 以外を制限する] 制約をカスタマイズして、すべての新しいクラスタを Confidential GKE Node を有効にして作成するように要求できます。組織のポリシーの制約を適用するときは、拒否リストに container.googleapis.com API サービスの名前を追加します。次に例を示します。

gcloud resource-manager org-policies deny \
    constraints/compute.restrictNonConfidentialComputing compute.googleapis.com container.googleapis.com \
    --project=PROJECT_ID

PROJECT_ID は、実際のプロジェクト ID に置き換えます。

Hyperdisk Balanced の情報保護モード対応の PersistentVolume を作成する

スループットまたは IOPS の許容値については、Hyperdisk ボリュームのパフォーマンス レベルを計画するをご覧ください。

次の例では、Hyperdisk のタイプごとに Hyperdisk Balanced の情報保護モードの StorageClass を作成する方法を示します。

Hyperdisk Balanced

  1. 次のマニフェストを confidential-hdb-example-class.yaml という名前のファイルに保存します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: balanced-storage
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
      type: hyperdisk-balanced
      provisioned-throughput-on-create: "250Mi"
      provisioned-iops-on-create: "7000"
      enable-confidential-storage: true
      disk-encryption-kms-key: "projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/HSM_KEY_NAME"
    

    次のように置き換えます。

    • KMS_PROJECT_ID: Cloud KMS 鍵を所有するプロジェクト
    • REGION: ディスクが配置されるリージョン
    • KEY_RING: 鍵を含むキーリングの名前
    • HSM_KEY_NAME: ディスクの暗号化に使用される HSM 鍵の名前
  2. StorageClass を作成します。

    kubectl create -f hdb-example-class.yaml
    
  3. Hyperdisk Balanced ボリュームの情報保護モードを使用する GKE 用の Hyperdisk Persistent Volume Claim を作成します。

クラスタで使用可能な StorageClass の名前を確認するには、次のコマンドを実行します。

kubectl get sc

制限事項

Confidential GKE Node には、次の制限事項があります。

ライブ マイグレーションの制限

一部の Compute Engine Confidential VM マシンタイプはライブ マイグレーションをサポートしています。これにより、ホスト メンテナンス イベントによるワークロードの中断を最小限に抑えることができます。ライブ マイグレーションが行われる GKE バージョンは次のとおりです。

  • 1.27.10-gke.1218000 以降
  • 1.28.6-gke.1393000 以降
  • 1.29.1-gke.1621000 以降

ライブ マイグレーションの追加時にノードプールがサポート対象のバージョンをすでに実行している場合は、同じバージョンまたは別のサポート対象バージョンにノードプールを手動でアップグレードします。ノードをアップグレードすると、ノードの再作成がトリガーされ、新しいノードでライブ マイグレーションが有効になります。

ライブ マイグレーションに対応している Compute Engine マシンタイプの詳細については、サポートされている構成をご覧ください。

ライブ マイグレーションをサポートしていないノードでホスト メンテナンス イベントが発生すると、ノードは NotReady 状態になります。ノードが再び準備状態になるまで、Pod の実行は中断されます。メンテナンスに 5 分以上かかる場合、GKE は他のノードで Pod の再作成を試みることがあります。

Confidential GKE Node を無効にする

Confidential GKE Node を無効にできるのは、Confidential GKE Node を有効にしたノードプールのみです。Confidential GKE Node を使用してクラスタを作成した場合、この機能を無効にすることはできません。次のコマンドを実行して、ノードプールで Confidential GKE Node を無効にします。

gcloud container node-pools update NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --no-enable-confidential-nodes

次のステップ