コントロール プレーン仮想マシン(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-central1、us-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 アドレスに直接リクエストを送信してみてください。
- クラスタの
API_SERVERログを有効にします。 gke-restrict-webhook-urlValidatingAdmissionPolicy を削除します。kubectl delete validatingadmissionpolicy gke-restrict-webhook-urlValidatingAdmissionPolicy を削除すると、
clientConfig.urlフィールドを使用して Webhook 構成を作成または更新できます。クラスタは ValidatingAdmissionPolicy を自動的に再作成するため、このバイパスは一時的なものです。ValidatingWebhookConfiguration または MutatingWebhookConfiguration の
clientConfig.urlフィールドで、リクエストの送信先となる IP アドレスまたは URL を指定します。http://example.comや203.0.113.100などの値の例を使用できます。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 の構成をご覧ください。