etcd とコントロール プレーンのブートディスクを暗号化する


このページでは、Cloud Key Management Service(Cloud KMS)で管理する鍵を使用して、Google Kubernetes Engine(GKE)コントロール プレーンに保存されているデータを暗号化する方法について説明します。etcdGKE クラスタのアーキテクチャCloud KMS などのコンセプトに精通していることを前提としています。

このページでは、GKE におけるオプションのコントロール プレーン機能について説明します。これらの機能を使用すると、コントロール プレーンのセキュリティ ポスチャーを確認する、ユーザーが管理する鍵を使用してコントロール プレーンでの暗号化と認証情報の署名を構成するといったタスクを行えます。詳細については、control plane authority についてをご覧ください。

デフォルトでは、Google Cloud はマネージド コントロール プレーンにさまざまなセキュリティ対策を適用します。このページでは、コントロール プレーンの可視性と制御性をさらに高めるオプション機能について説明します。

コントロール プレーンのブートディスクと etcd の暗号化について

デフォルトでは、GKE は Google Cloud が管理する暗号鍵を使用して、コントロール プレーンノードのブートディスク、etcd にデータを保存するディスク、etcd の Google Cloud 内部運用バックアップを暗号化します。このデフォルトの暗号化の詳細については、デフォルトの保存データの暗号化をご覧ください。必要に応じて、Cloud KMS を使用して管理する独自の暗号鍵を使用して、これらのリソースを暗号化できます。詳細については、コントロール プレーンのブートディスクと etcd の暗号化をご覧ください。

GKE がコントロール プレーン リソースの暗号化に使用する鍵を Cloud KMS で作成します。これらのリソースを作成する際は、次の点に留意してください。

  • 各鍵の目的に関係なく、クラスタ内のすべての鍵に対して 1 つのキーリングを使用できます。独自の認証局の設定など、別の目的で使用した既存のキーリングがある場合は、このガイドでそのキーリングを使用できます。
  • レイテンシを短縮するには、クラスタと同じ Google Cloud ロケーションに鍵を作成する必要があります。
  • ほとんどのユースケースでは、ソフトウェアの Cloud KMS 鍵の保護レベルを使用できます。Cloud HSM ではハードウェア鍵を使用することもできます。
  • これらの鍵は対称暗号化に使用されるため、--purpose フラグを encryption 値で指定する必要があります。
  • 鍵が破棄されるまでのデフォルトの期間は変更しないでください。

他の GKE control plane authority 機能での使用

GKE control plane authority には、セルフマネージド鍵に関連する次の機能が用意されています。これらの機能は、クラスタの作成時に同時に有効にする必要があります。

これらの機能を有効にできるのは、新しい GKE クラスタを作成する場合のみです。これらの機能を使用するように既存のクラスタを更新することはできません。同じクラスタでこれらの機能の両方を使用するには、両方のガイドに記載されている鍵と CA の構成手順をすべて実施し、クラスタを作成するセクション説明に沿って両方の機能セットを有効にするクラスタ作成コマンドを実行します。

始める前に

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

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。
  • 鍵プロジェクトにクラスタの Cloud KMS キーリングがあることを確認します。クラスタのロケーションにある既存のキーリングを使用できます。新しいキーリングを作成するには、キーリングを作成するをご覧ください。
  • Enable the Cloud Key Management Service API.

    Enable the API

プロジェクトを特定する

次のように、別々の Google Cloud プロジェクトを使用することをおすすめします。

  • 鍵プロジェクト: すべての鍵が含まれます。
  • クラスタ プロジェクト: GKE クラスタが含まれます。

必要に応じて、鍵と GKE クラスタに同じプロジェクトを使用できますが、鍵と暗号オペレーションを管理するチームとクラスタを管理するチームを分離するために、別々のプロジェクトを使用することをおすすめします。

必要なロールと権限

独自の暗号鍵を実行するために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

要件

クラスタで GKE バージョン 1.31.1-gke.1846000 以降を実行する必要があります。

制限事項

  • ブートディスクと etcd 暗号鍵は、クラスタの作成時にのみ構成できます。
  • リージョン Standard モードクラスタと Autopilot クラスタの場合、クラスタを作成するリージョンには、そのリージョン内の少なくとも 3 つのゾーンに Hyperdisk Balanced の情報保護モードの容量が必要です。

    ゾーン Standard モードクラスタの場合、クラスタゾーンに Hyperdisk Balanced 容量が必要です。容量に関するサポートが必要な場合は、Cloud カスタマーケアにお問い合わせください。

    Hyperdisk Balanced の情報保護モードは、特定のリージョンでのみ使用できます。詳細については、情報保護モードで Hyperdisk Balanced ボリュームがサポートされているリージョンをご覧ください。

  • GKE は Cloud KMS の鍵のみをサポートしています。別の Kubernetes KMS プロバイダや別の暗号化プロバイダは使用できません。

  • Cloud External Key Manager(Cloud EKM)鍵はサポートされていません。

  • etcd の Google Cloud 内部運用バックアップにはアクセスできません。このバックアップは障害復旧専用です。

  • マルチリージョン キーリングはサポートされていません。リージョン キーリングを使用する必要があります。

鍵を作成する

このセクションでは、コントロール プレーンのブートディスクと etcd ディスクの暗号鍵と、etcd の Google Cloud 内部運用バックアップ用の別の暗号鍵を作成します。1 つのキーリングを使用して、これらの鍵とクラスタの他の鍵をすべて保持できます。

  1. コントロール プレーンのブートディスクと etcd ディスクの暗号鍵を作成します。

    gcloud kms keys create KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

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

    • KCP_DISK_KEY_NAME: コントロール プレーンのブートディスクと etcd ディスクの暗号鍵の名前。
    • KEYRING_NAME: クラスタの暗号鍵を保持するキーリングの名前。
    • LOCATION: キーリングの Google Cloud のロケーション。これは、クラスタのロケーションと同じにする必要があります。リージョンの一覧については、Cloud KMS のロケーションの表で「リージョン」でフィルタしてください。
    • PROTECTION_LEVEL: 鍵の保護レベル(softwarehsm など)。
    • KEY_PROJECT_ID: 鍵プロジェクトのプロジェクト ID。
  2. etcd 内部バックアップ暗号鍵を作成します。

    gcloud kms keys create ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

    ETCD_BACKUP_KEY_NAME は、etcd 内部バックアップ暗号鍵の名前に置き換えます。

GKE サービス エージェントに IAM ロールを付与する

このセクションでは、作成した鍵に対する IAM ロールを、クラスタ プロジェクトの GKE サービス エージェントに付与します。GKE サービス エージェントでは、これらのロールが鍵を使用して対応するコントロール プレーン リソースを暗号化する必要があります。

  1. クラスタ プロジェクト番号を確認します。

    gcloud projects describe CLUSTER_PROJECT_ID \
        --format='value(projectNumber)'
    

    CLUSTER_PROJECT_ID は、GKE クラスタ プロジェクトのプロジェクト ID に置き換えます。

    出力は次のようになります。

    1234567890
    
  2. ブートディスクと etcd ディスクの暗号鍵に対する Cloud KMS CryptoKey 暗号化 / 復号roles/cloudkms.cryptoKeyEncrypterDecrypter)ロールを、クラスタ プロジェクトの GKE サービス エージェントに付与します。

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project=KEY_PROJECT_ID
    

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

    • KCP_DISK_KEY_NAME: ディスク暗号鍵の名前。
    • LOCATION: 鍵の Google Cloud のロケーション。
    • KEYRING_NAME: 暗号鍵を含むキーリングの名前。
    • CLUSTER_PROJECT_NUMBER: 前の手順で確認したクラスタ プロジェクトの数値のプロジェクト番号。
    • KEY_PROJECT_ID: 鍵プロジェクトのプロジェクト ID。
  3. ブートディスクと etcd ディスクの暗号鍵に対する委任による Cloud KMS 暗号鍵の暗号化 / 復号roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation)のロールを、クラスタ プロジェクトの GKE サービス エージェントに付与します。

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation \
        --project=KEY_PROJECT_ID
    
  4. etcd 内部バックアップ暗号鍵に対する Cloud KMS CryptoKey 暗号化roles/cloudkms.cryptoKeyEncrypter)ロールを、クラスタ プロジェクトの GKE サービス エージェントに付与します。

    gcloud kms keys add-iam-policy-binding ETCD_BACKUP_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypter \
        --project=KEY_PROJECT_ID
    

    ETCD_BACKUP_KEY_NAME は、etcd 運用バックアップ暗号鍵の名前に置き換えます。

    roles/cloudkms.cryptoKeyEncrypter ロールを付与すると、GKE がユーザーに代わってデータベースの復元を実行できなくなり、データベースの問題が発生した場合の機能の復元にかかる時間が大幅に長くなります。GKE に復元を実行させるには、代わりに roles/cloudkms.cryptoKeyEncrypterDecrypter ロールを付与します。

クラスタで暗号鍵を使用する

このセクションでは、暗号鍵のパスを特定する方法について説明します。

  1. ディスク暗号鍵のパスを特定します。

    gcloud kms keys describe KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

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

    • KCP_DISK_KEY_NAME: コントロール プレーンのブートディスクと etcd ディスクの暗号鍵の名前。
    • KEYRING_NAME: 鍵を含むキーリングの名前。
    • LOCATION: 鍵の Google Cloud のロケーション。
    • KEY_PROJECT_ID: 鍵プロジェクトのプロジェクト ID。

    出力は次のようになります。

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/disk-encryption-key
    
  2. etcd 内部バックアップ暗号鍵のパスを特定します。

    gcloud kms keys describe ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

    ETCD_BACKUP_KEY_NAME は、etcd 運用バックアップ暗号鍵の名前に置き換えます。

    出力は次のようになります。

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/etcd-backup-encryption-key
    

クラスタの作成

このセクションでは、構成する GKE control plane authority 機能に応じて、さまざまなオプションを指定してクラスタを作成します。これらの機能は、クラスタの作成時にのみクラスタで構成できます。

  • ディスク暗号化を構成し、独自の CA とサービス アカウント署名鍵を実行するクラスタを作成する手順は次のとおりです。

    1. 独自の認証局と鍵を実行するに記載されている、鍵と CA の構成手順をすべて実施します。
    2. 新しいクラスタで CA とキーを設定するの手順に沿って、各サービス アカウント キーと CA のパスを確認します。
    3. クラスタを作成します。

      gcloud container clusters create-auto CLUSTER_NAME \
          --location=LOCATION \
          --project=CLUSTER_PROJECT_ID \
          --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
          --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY \
          --service-account-signing-keys=PATH_TO_SIGNING_KEY_VERSION \
          --service-account-verification-keys=PATH_TO_VERIFICATION_KEY_VERSION \
          --cluster-ca=PATH_TO_CLUSTER_CA \
          --etcd-peer-ca=PATH_TO_ETCD_PEER_CA \
          --etcd-api-ca=PATH_TO_ETCD_API_CA \
          --aggregation-ca=PATH_TO_AGGREGATION_CA
      

      以下を置き換えます。

      • CLUSTER_NAME: 新しいクラスタの名前。
      • LOCATION: 新しいクラスタのロケーション。
      • CLUSTER_PROJECT_ID: クラスタ プロジェクトのプロジェクト ID。
      • PATH_TO_DISK_KEY: このページの前の手順で作成したディスク暗号鍵のパス。
      • PATH_TO_ETCD_BACKUP_KEY: このページの前の手順で作成した etcd 内部バックアップ暗号鍵のパス。
      • PATH_TO_SIGNING_KEY_VERSION: Cloud KMS の Kubernetes ServiceAccount 署名鍵のバージョンのパスと名前。
      • PATH_TO_VERIFICATION_KEY_VERSION: Cloud KMS の Kubernetes ServiceAccount 検証鍵のバージョンのパスと名前。
      • PATH_TO_CLUSTER_CA: クラスタ CA プールのパス。
      • PATH_TO_ETCD_PEER_CA: etcd ピア CA プールのパス。
      • PATH_TO_ETCD_API_CA: etcd API CA プールのパス。
      • PATH_TO_AGGREGATION_CA: 集約 CA プールのパス。
  • このガイドで作成した鍵を使用してディスク暗号化のみを構成するクラスタを作成するには、次のコマンドを実行します。

    gcloud container clusters create-auto CLUSTER_NAME \
        --location=LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
        --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY
    

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

    • CLUSTER_NAME: 新しいクラスタの名前。
    • LOCATION: 新しいクラスタのロケーション。
    • CLUSTER_PROJECT_ID: クラスタ プロジェクトのプロジェクト ID。
    • PATH_TO_DISK_KEY: 前の手順で作成したディスク暗号鍵のパス。
    • PATH_TO_ETCD_BACKUP_KEY: 前の手順で作成した etcd 内部バックアップ暗号鍵のパス。

新しい Standard モードクラスタを作成するときに、これらのフラグをすべて指定することもできます。

暗号鍵のステータスを確認する

このセクションでは、クラスタの作成時に使用された暗号鍵を確認する方法について説明します。この確認は、Cloud Logging または Google Cloud CLI を使用して実行できます。

Logging を使用して鍵を確認する

Logging を使用して鍵を確認する手順は次のとおりです。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. 次のクエリを指定して、クラスタ作成ログを取得します。

    resource.type="gke_cluster" resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.location="CLUSTER_LOCATION"
    protoPayload.serviceName="container.googleapis.com"
    protoPayload.methodName="google.container.v1.ClusterManager.CreateCluster"
    protoPayload.request.cluster.userManagedKeysConfig:*
    
  3. [クエリを実行] をクリックします。

出力で、クラスタ作成パラメータに Cloud KMS で設定した鍵に対応する鍵パスが含まれていることを確認します。

gcloud CLI を使用して鍵を確認する

gcloud CLI を使用して暗号鍵を確認する手順は次のとおりです。

  1. ディスク暗号鍵の場合は、次のコマンドを実行します。

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.controlPlaneDiskEncryptionKey)"
    
  2. etcd 内部バックアップ暗号鍵の場合は、次のコマンドを実行します。

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.gkeopsEtcdBackupEncryptionKey)"
    

次のステップ