クラスタ メタデータの保護


概要

Google Kubernetes Engine(GKE)ではインスタンス メタデータを使用してノード仮想マシン(VM)を構成しますが、このメタデータの一部は潜在的に機密性が高く、クラスタで実行中のワークロードから保護する必要があります。

始める前に

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

次のいずれかの方法で gcloud のデフォルトの設定を指定します。

  • gcloud init。デフォルトの設定全般を確認する場合に使用します。
  • gcloud config。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。

gcloud init の使用

エラー One of [--zone, --region] must be supplied: Please specify location を受信した場合は、このセクションの内容を実施します。

  1. gcloud init を実行して、次の操作を行います。

    gcloud init

    リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

    gcloud init --console-only
  2. 手順に従って gcloud を承認し、Google Cloud アカウントを使用します。
  3. 新しい構成を作成するか、既存の構成を選択します。
  4. Google Cloud プロジェクトを選択します。
  5. ゾーンクラスタの場合はデフォルトの Compute Engine ゾーン、リージョン クラスタまたは Autopilot クラスタの場合はデフォルトの Compute Engine リージョンを選択します。

gcloud config の使用

  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project PROJECT_ID
  • ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone COMPUTE_ZONE
  • Autopilot クラスタまたはリージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
    gcloud config set compute/region COMPUTE_REGION
  • gcloud を最新バージョンに更新します。
    gcloud components update

ノードのサービス アカウントの構成

各ノードのサービス アカウント認証情報は引き続きワークロードに公開されます。デフォルトでは、ノードは Compute Engine のデフォルトのサービス アカウントを使用します。Compute Engine のデフォルト サービス アカウントの代わりに、使用するノードの最小限のサービス アカウントを構成する必要があります。次に、このサービス アカウントをノードに接続して、攻撃者が Compute Engine API を使用して基盤となる VM インスタンスに直接アクセスすることで GKE のメタデータ保護を回避することができないようにします。

詳しくは、最小権限のノードサービス アカウントを使用するをご覧ください。

最小限の権限のみを持つノードサービス アカウントを作成するには、次の操作を行います。

  1. 新しい Identity and Access Management(IAM)サービス アカウントを作成し、メールアドレスを環境変数に保存します。

    gcloud iam service-accounts create NODE_SA_NAME \
        --display-name="DISPLAY_NAME"
    export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \
        --filter='displayName:DISPLAY_NAME')
    

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

    • NODE_SA_NAME: 新しいノードサービス アカウントの名前。
    • DISPLAY_NAME: 新しいサービス アカウントの表示名。

    ノードのサービス アカウントのメールアドレスの形式は NODE_SA_NAME@PROJECT_ID.iam.gserviceaccount.com です。

  2. GKE ノードを実行するための最小限のロールと権限を持つサービス アカウントを構成します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/monitoring.metricWriter
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/monitoring.viewer
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/logging.logWriter
    

    PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。

    さらに、クラスタが Artifact Registry から非公開イメージを pull する場合は、roles/artifactregistry.reader ロールを追加します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/artifactregistry.reader
    

メタデータ隠蔽

GKE のメタデータ隠蔽は、一部の潜在的なシステムの機密メタデータを、クラスタ上で実行中のユーザーのワークロードから保護できます。

Kubernetes v1.9.3 以降では、メタデータ隠蔽を有効にして、ユーザーの Pod がクラスタのノードの特定の VM メタデータ(Kubelet 認証情報や VM インスタンス情報など)にアクセスすることを防止できます。具体的には、メタデータ隠蔽は、kube-env(Kubelet 認証情報を含む)と VM のインスタンス ID トークンへのアクセスを保護します。

メタデータ隠蔽は、ユーザーポッド(HostNetwork 上で実行されていないポッド)からクラスタ メタデータ サーバーへのトラフィックをファイアウォール制御し、安全なクエリのみを許可します。ファイアウォールは、ユーザーポッドが、特権エスカレーション攻撃に kubelet 認証情報を使用するのを防ぎます。また、インスタンス エスカレーション攻撃に VM ID を使用するのも防ぎます。

メタデータ隠蔽を有効にできるのは、新しいクラスタを作成するときと、既存のクラスタに新しいノードプールを追加するときのみです。

制限事項

  • メタデータ隠蔽は、kube-env とノードのインスタンス ID トークンへのアクセスだけを保護します。
  • メタデータ隠蔽は、ノードのサービス アカウントへのアクセスを制限しません。
  • メタデータ隠蔽は、他の関連するインスタンス メタデータへのアクセスを制限しません。
  • メタデータ隠蔽は、その他の以前のメタデータ API へのアクセスを制限しません。

メタデータ隠蔽を使用した新しいクラスタまたはノードプールの作成

サービス アカウントの作成後、gcloud コマンドライン ツールを使用して新しいクラスタを作成し、メタデータ隠蔽を有効にできます。

メタデータ隠蔽が有効になっているクラスタを作成するには、次のコマンドを実行します。

gcloud beta container clusters create CLUSTER_NAME \
  --workload-metadata-from-node=SECURE \
  --service-account=$NODE_SA_EMAIL

CLUSTER_NAME は、使用するクラスタの名前に置き換えます。

--workload-metadata-from-node フラグの値は次のとおりです。

  • SECURE: メタデータ隠蔽を有効にします。
  • EXPOSED または UNSPECIFIED: メタデータ隠蔽を無効にします。

ID トークン メタデータがクラスタのワークロードから隠蔽されていることを確認する

メタデータを隠蔽するときは、ノードのインスタンス ID トークンを介して署名をリクエストできないようにする必要があります。リクエストが隠蔽されているメタデータをユーザーに明示的に通知することを確認するには、ポッド内から次の curl コマンドを実行します。

curl -H "Metadata-Flavor: Google" \
'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://www.example.com'

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

This metadata endpoint is concealed.

以前のメタデータ API の無効化と移行

Compute Engine メタデータ サーバー エンドポイント v0.1v1beta1 は、2020 年 9 月 30 日にサポート終了となり、停止されました。

停止スケジュールについては、v0.1v1beta1 メタデータ サーバー エンドポイントのサポート終了をご覧ください。

次のステップ