API サーバーからの下り(外向き)トラフィックを制限する

コントロール プレーン仮想マシン(VM)インスタンスの外部 IP アドレスを無効にすることで、Google Kubernetes Engine(GKE)コントロール プレーンのセキュリティを強化できます。このドキュメントでは、セキュリティ エンジニアが Kubernetes API サーバーからの下り(外向き)トラフィックを制御し、アドミッション Webhook の潜在的な中断を回避する方法について説明します。

次のことに精通している必要があります。

制限のレベル

クラスタを作成または更新するときに、次のいずれかの制限レベルを指定できます。

  • トラフィックなし(NONE: 各コントロール プレーン VM インスタンスの外部 IP アドレスを無効にし、すべての API サーバーの下り(外向き)トラフィックをブラックホールに転送します。このレベルの制限には次の影響があります。
    • GKE は、クラスタ外で実行されている Admission Webhook サーバーへの API サーバーからの直接の下り(外向き)トラフィックをブロックします。Webhook サーバーへの接続に URL または IP アドレスを使用するアドミッション Webhook はすべて影響を受けます。
    • GKE は、API サーバーからインターネットやGoogle Cloud サービスなどの外部サービスへの直接の下り(外向き)トラフィックをブロックします。GKE 認証と、メタデータ サーバーなどのシステム コンポーネントへのトラフィックは影響を受けません。
    • 重要なシステム トラフィックやノードからのトラフィックなど、他のタイプの下り(外向き)トラフィックは影響を受けません。
    • GKE は ValidatingAdmissionPolicy を使用して、clientConfig.url フィールドを使用する ValidatingWebhookConfiguration または MutatingWebhookConfiguration の作成または更新を拒否します。
  • すべてのトラフィック(VIA_CONTROL_PLANE: 各コントロール プレーン インスタンスの外部 IP アドレスを保持し、API サーバーが下り(外向き)トラフィックに IP アドレスを使用できるようにします。このオプションは GKE のデフォルトです。

制限事項

制限レベルを NONE に設定して下り(外向き)トラフィックを無効にすると、クラスタはプライベートで使用されるパブリック IP(PUPI)アドレスを使用できません。

始める前に

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

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API を有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
  • バージョン 1.35.1-gke.1396000 以降を実行する GKE Autopilot クラスタまたは GKE Standard クラスタがあることを確認します。Autopilot クラスタを作成することもできます。
  • 外部 Webhook サーバーがある場合は、サービス参照を使用してこれらのサーバーに接続していることを確認します。API サーバーからの下り(外向き)トラフィックを無効にすると、URL を使用して Webhook サーバーに接続する Webhook はすべて失敗します。GKE マネージド Webhook は影響を受けません。

API サーバーからの下り(外向き)トラフィックをカスタマイズする

クラスタの作成時または更新時に、API サーバーからの下り(外向き)トラフィックの制限レベルをカスタマイズできます。既存のクラスタを更新するには、--control-plane-egress フラグを使用します。

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --control-plane-egress=CONTROL_PLANE_EGRESS_MODE

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

  • CLUSTER_NAME: クラスタの名前。
  • CONTROL_PLANE_LOCATION: クラスタ コントロール プレーンのリージョンまたはゾーン(例: us-central1us-central1-a)。
  • CONTROL_PLANE_EGRESS_MODE: API サーバーからの下り(外向き)トラフィックの制限レベル。次の値のいずれかを使用できます。
    • NONE: コントロール プレーン VM インスタンスの外部 IP アドレスを無効にし、API サーバーからの重要でない下り(外向き)トラフィックをすべてブロックします。GKE は、clientConfig.url フィールドを使用する新しい Webhook 構成の作成を防止します。
    • VIA_CONTROL_PLANE: コントロール プレーン VM インスタンスの外部 IP アドレスを保持し、API サーバーからの下り(外向き)トラフィックを許可します。これはデフォルト値です。

下り(外向き)トラフィックの制限を確認する

GKE が API サーバーからの下り(外向き)トラフィックをブロックしているかどうかを確認するには、次のいずれかの方法を使用します。

  • クラスタの構成を確認します。

    gcloud container clusters describe CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --format='value(controlPlaneEgress)'
    

    出力は次のいずれかになります。

    • NONE: 下り(外向き)トラフィックが制限されています。
    • VIA_CONTROL_PLANE: 下り(外向き)トラフィックは制限されません。
  • 変更が新しい Webhook に与える影響を確認するには、clientConfig.url フィールドを使用する Webhook 構成を作成してみてください。

    cat <<EOF | kubectl apply -f -
    apiVersion: admissionregistration.k8s.io/v1
    kind: MutatingWebhookConfiguration
    metadata:
      name: test-webhook-config
    webhooks:
    - name: my-webhook.example.com
      clientConfig:
        url: "https://my-webhook.example.com:9443/my-webhook-path"
    

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

    ValidatingAdmissionPolicy 'gke-restrict-webhook-url' denied request: Egress
    traffic from the API server through the control plane is disabled. As a
    result, direct API server calls to external webhook servers are blocked.
    To connect to external webhooks, update any webhook configurations that use
    clientConfig.url to use clientConfig.service instead.
    

    この出力は、GKE ValidatingAdmissionPolicy が clientConfig.url フィールドを含む Webhook 構成の作成または更新を禁止していることを示しています。ValidatingAdmissionPolicy を削除すると、構成の作成や更新はできますが、アドミッション リクエストが Webhook サーバーに到達しません。

  • クラスタ内の既存の Webhook に対する変更の影響を確認するには、クラスタ外の IP アドレスに直接リクエストを送信してみてください。

    1. クラスタの API_SERVER ログを有効にします。
    2. gke-restrict-webhook-url ValidatingAdmissionPolicy を削除します。

      kubectl delete validatingadmissionpolicy gke-restrict-webhook-url
      

      ValidatingAdmissionPolicy を削除すると、clientConfig.url フィールドを使用して Webhook 構成を作成または更新できます。クラスタは ValidatingAdmissionPolicy を自動的に再作成するため、このバイパスは一時的なものです。

    3. ValidatingWebhookConfiguration または MutatingWebhookConfiguration の clientConfig.url フィールドで、リクエストの送信先となる IP アドレスまたは URL を指定します。http://example.com203.0.113.100 などの値の例を使用できます。

    4. API サーバーのログで、次のようなエラー メッセージがないか確認します。

      Error from server (InternalError): error when creating "STDIN":
        Internal error occurred: failed calling webhook
        WEBHOOK_NAME": failed to call
        webhook: Post "WEBHOOK_URL":
        proxyconnect tcp: dial tcp: lookup master-internet-access-unavailable.localhost
        on 169.254.169.254:53: no such host
      

      この出力は、ValidatingAdmissionPolicy が削除されても、アドミッション リクエストがサーバーの IP アドレスまたは URL を使用して Webhook サーバーに到達できないことを示しています。

コントロール プレーン VM インスタンスの外部 IP アドレスを無効にすると、GKE は、URL を使用して外部 Webhook サーバーに接続する Webhook へのトラフィックをブロックします。API サーバーが使用する代替ルートを設定するには、Webhook 構成の clientConfig.service フィールドを使用する必要があります。詳細については、外部 Webhook の構成をご覧ください。

次のステップ