コントロール プレーン仮想マシン(VM)インスタンスの外部 IP アドレスを無効にすることで、Google Kubernetes Engine(GKE)コントロール プレーンのセキュリティを強化できます。このドキュメントでは、セキュリティ エンジニア向けに、Kubernetes API サーバーからの下り(外向き)トラフィックを制御する方法と、アドミッション Webhook の潜在的な中断を回避する方法について説明します。
次のことに精通している必要があります。
制限レベル
クラスタを作成または更新するときに、次のいずれかの制限レベルを指定できます。
- トラフィックなし(
NONE): 各 コントロール プレーン VM インスタンスの外部 IP アドレスを無効にし、すべての API サーバーの下り(外向き)トラフィックを ブラックホールにルーティングします。 この制限レベルには次の影響があります。- GKE は、クラスタの外部で実行される アドミッション Webhook サーバー への API サーバーからの直接の下り(外向き)トラフィックをブロックします。Webhook サーバーへの接続に URL または IP アドレスを使用するアドミッション Webhook は影響を受けます。
- GKE は、API サーバー からインターネットや Google Cloud サービスなど、外部サービスへの直接の下り(外向き)トラフィックをブロックします。GKE 認証とメタデータ サーバーなどのシステム コンポーネントのトラフィックは影響を受けません。
- その他のタイプの下り(外向き)トラフィック(重要なシステム トラフィックやノードからのトラフィックなど)は影響を受けません。
- GKE は、ValidatingAdmissionPolicy を使用して、
clientConfig.urlフィールドを使用する ValidatingWebhookConfigurations または MutatingWebhookConfigurations の作成または更新を拒否します。
- すべてのトラフィック(
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 サーバーがある場合は、 Service 参照 を使用してそれらのサーバーに接続していることを確認します。API サーバーからの下り(外向き)トラフィックを無効にすると、Webhook サーバーへの接続に URL を使用する 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 へのトラフィックをブロックします。Webhook 構成で clientConfig.service
フィールドを使用して、API サーバーが使用する代替ルートを設定する必要があります。
詳細については、
外部 Webhook の構成をご覧ください。