GKEクラスタでのエイリアスIPレンジ(VPCネイティブ)の有効化について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、gcloud CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、GKEクラスタでエイリアスIPレンジ(VPCネイティブ)が無効化されている場合のセキュリティリスクと、その修復方法について詳しく解説します。

ポリシーの説明
GKEクラスタでエイリアスIP(VPCネイティブ)が有効になっているかをチェックします。エイリアスIPを使用することで、PodとサービスにVPCのIPアドレスを直接割り当て、より安全で効率的なネットワーキングが可能になります。2019年以降、VPCネイティブクラスタがGKEのデフォルトとなっており、セキュリティと機能面で多くの利点があります。
修復手順
コンソールでの修復手順
Google Cloud コンソールを使用して、エイリアスIP(VPCネイティブ)を有効にした新しいクラスタを作成します。
重要: 既存のクラスタでエイリアスIPを有効化することはできません。新しいクラスタを作成し、ワークロードを移行する必要があります。
- Google Cloud Consoleにログイン
- Google Cloud Consoleにアクセス
- 対象のプロジェクトを選択
- Kubernetes Engineセクションに移動
- 左側のナビゲーションメニューから「Kubernetes Engine」→「クラスタ」を選択
- 「作成」ボタンをクリック
- クラスタの基本設定
- クラスタモードで「標準」を選択(Autopilotは自動的にVPCネイティブとなります)
- クラスタ名、ロケーションタイプ、ゾーン/リージョンを設定
- ネットワーキング設定
- 左側メニューから「ネットワーキング」を選択
- 「VPCネイティブ」が選択されていることを確認(デフォルトで有効)
- ネットワークとサブネットワークを選択
- IPアドレス範囲の設定
- 「Pod のセカンダリ範囲」セクションで以下を設定:
- 範囲の割り当て方法:「自動的に作成」または「既存のセカンダリ範囲を使用」
- 自動作成の場合:Pod IP アドレス範囲のサイズを指定(例:/14)
- 「サービスのセカンダリ範囲」セクションも同様に設定:
- サービス IP アドレス範囲のサイズを指定(例:/20)
- 「Pod のセカンダリ範囲」セクションで以下を設定:
- プライベートクラスタ設定(推奨)
- 「プライベートクラスタ」を有効化
- 「外部IPアドレスを使用してコントロールプレーンにアクセス」を有効化
- マスターIPv4 CIDRブロックを設定(例:172.16.0.0/28)
- クラスタの作成
- その他の必要な設定を行い、「作成」をクリック
Terraformでの修復手順
エイリアスIP(VPCネイティブ)を有効化したGKEクラスタを作成するTerraformコードです。
# VPCネットワークの作成
resource "google_compute_network" "vpc" {
name = "gke-vpc-network"
auto_create_subnetworks = false
project = var.project_id
}
# VPCネイティブクラスタ用のサブネット
resource "google_compute_subnetwork" "subnet" {
name = "gke-subnet"
ip_cidr_range = "10.0.0.0/20" # ノード用のプライマリ範囲
region = var.region
network = google_compute_network.vpc.id
project = var.project_id
# Pod用のセカンダリ範囲
secondary_ip_range {
range_name = "pod-range"
ip_cidr_range = "10.4.0.0/14" # /14 = 262,144 IP アドレス
}
# サービス用のセカンダリ範囲
secondary_ip_range {
range_name = "service-range"
ip_cidr_range = "10.8.0.0/20" # /20 = 4,096 IP アドレス
}
private_ip_google_access = true
}
# VPCネイティブGKEクラスタ
resource "google_container_cluster" "primary" {
name = "vpc-native-gke-cluster"
location = var.region
# VPCネイティブの設定(エイリアスIP有効化)
network = google_compute_network.vpc.name
subnetwork = google_compute_subnetwork.subnet.name
# IPアロケーションポリシー(VPCネイティブの核心設定)
ip_allocation_policy {
cluster_secondary_range_name = "pod-range" # Pod用のセカンダリ範囲
services_secondary_range_name = "service-range" # サービス用のセカンダリ範囲
}
# プライベートクラスタ設定(推奨)
private_cluster_config {
enable_private_nodes = true
enable_private_endpoint = false
master_ipv4_cidr_block = "172.16.0.0/28"
}
# マスター承認済みネットワーク
master_authorized_networks_config {
cidr_blocks {
cidr_block = "0.0.0.0/0" # 本番環境では制限すべき
display_name = "All networks"
}
}
# Workload Identity(推奨)
workload_identity_config {
workload_pool = "${var.project_id}.svc.id.goog"
}
# デフォルトノードプールを削除
remove_default_node_pool = true
initial_node_count = 1
}
# ノードプール
resource "google_container_node_pool" "primary_nodes" {
name = "primary-pool"
location = var.region
cluster = google_container_cluster.primary.name
node_count = var.node_count
node_config {
machine_type = var.machine_type
# Workload Identity
workload_metadata_config {
mode = "GKE_METADATA"
}
# セキュリティ強化設定
metadata = {
disable-legacy-endpoints = "true"
}
shielded_instance_config {
enable_secure_boot = true
enable_integrity_monitoring = true
}
# 最小権限のサービスアカウント
service_account = google_service_account.node_sa.email
oauth_scopes = [
"<https://www.googleapis.com/auth/cloud-platform>"
]
}
management {
auto_repair = true
auto_upgrade = true
}
}
# ノード用サービスアカウント
resource "google_service_account" "node_sa" {
account_id = "gke-node-sa"
display_name = "GKE Node Service Account"
}
# Cloud NAT(プライベートクラスタ用)
resource "google_compute_router" "router" {
name = "gke-router"
region = var.region
network = google_compute_network.vpc.id
}
resource "google_compute_router_nat" "nat" {
name = "gke-nat"
router = google_compute_router.router.name
region = var.region
nat_ip_allocate_option = "AUTO_ONLY"
source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}
# ファイアウォールルール例(Pod間通信)
resource "google_compute_firewall" "pod_to_pod" {
name = "allow-pod-to-pod"
network = google_compute_network.vpc.name
allow {
protocol = "tcp"
}
allow {
protocol = "udp"
}
allow {
protocol = "icmp"
}
source_ranges = [google_compute_subnetwork.subnet.secondary_ip_range[0].ip_cidr_range]
target_tags = ["gke-node"]
}
設定の確認方法
クラスタがVPCネイティブかどうかを確認するには:
# クラスタの詳細を表示してIPアロケーションポリシーを確認
gcloud container clusters describe [CLUSTER_NAME] \
--region=[REGION] \
--format="value(ipAllocationPolicy)"
# VPCネイティブの場合、以下のような出力が表示される:
# clusterSecondaryRangeName=pod-range;servicesSecondaryRangeName=service-range;useIpAliases=True
まとめ
GKEクラスタでエイリアスIPレンジ(VPCネイティブ)を有効化することは、セキュリティ強化の重要な要素です。IPスプーフィング防止、ネットワークセグメンテーションの改善、監査機能の向上など、多くのセキュリティメリットがあります。既存のルートベースクラスタを使用している場合は、計画的に新しいVPCネイティブクラスタへの移行を検討してください。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。