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

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、gcloud CLI、Terraformなど)まで、分かりやすく解説します。

この記事では、GKEクラスタでエイリアスIPレンジ(VPCネイティブ)が無効化されている場合のセキュリティリスクと、その修復方法について詳しく解説します。

ポリシーの説明

GKEクラスタでエイリアスIP(VPCネイティブ)が有効になっているかをチェックします。エイリアスIPを使用することで、PodとサービスにVPCのIPアドレスを直接割り当て、より安全で効率的なネットワーキングが可能になります。2019年以降、VPCネイティブクラスタがGKEのデフォルトとなっており、セキュリティと機能面で多くの利点があります。

修復手順

コンソールでの修復手順

Google Cloud コンソールを使用して、エイリアスIP(VPCネイティブ)を有効にした新しいクラスタを作成します。

重要: 既存のクラスタでエイリアスIPを有効化することはできません。新しいクラスタを作成し、ワークロードを移行する必要があります。

  1. Google Cloud Consoleにログイン
  2. Kubernetes Engineセクションに移動
    • 左側のナビゲーションメニューから「Kubernetes Engine」→「クラスタ」を選択
    • 「作成」ボタンをクリック
  3. クラスタの基本設定
    • クラスタモードで「標準」を選択(Autopilotは自動的にVPCネイティブとなります)
    • クラスタ名、ロケーションタイプ、ゾーン/リージョンを設定
  4. ネットワーキング設定
    • 左側メニューから「ネットワーキング」を選択
    • 「VPCネイティブ」が選択されていることを確認(デフォルトで有効)
    • ネットワークとサブネットワークを選択
  5. IPアドレス範囲の設定
    • 「Pod のセカンダリ範囲」セクションで以下を設定:
      • 範囲の割り当て方法:「自動的に作成」または「既存のセカンダリ範囲を使用」
      • 自動作成の場合:Pod IP アドレス範囲のサイズを指定(例:/14)
    • 「サービスのセカンダリ範囲」セクションも同様に設定:
      • サービス IP アドレス範囲のサイズを指定(例:/20)
  6. プライベートクラスタ設定(推奨)
    • 「プライベートクラスタ」を有効化
    • 「外部IPアドレスを使用してコントロールプレーンにアクセス」を有効化
    • マスターIPv4 CIDRブロックを設定(例:172.16.0.0/28)
  7. クラスタの作成
    • その他の必要な設定を行い、「作成」をクリック

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機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。

参考情報

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る