GKE Secure Boot機能の有効化について

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

この記事では、GKEクラスタのノードでSecure Boot機能を有効化し、ブートプロセスの整合性を確保する方法について解説します。

ポリシーの説明

Secure Bootは、Shielded VMの一部として提供される重要なセキュリティ機能です。この機能は、ノードのブートプロセス中に実行されるソフトウェアの整合性を検証し、信頼できるソフトウェアのみが起動することを保証します。

Secure Bootの主な特徴:

  • UEFI署名検証: ブートローダー、カーネル、ドライバーがGoogleまたは信頼された機関によって署名されていることを確認
  • 改ざん防止: マルウェアやルートキットがブートプロセスに介入することを防止
  • ブートチェーンの保護: ファームウェアからOSまでの起動プロセス全体を保護

GKEでは、Shielded GKE Nodesの一部としてSecure Bootを有効化できます。

修復方法

コンソールでの修復手順

既存のGKEクラスタでSecure Bootを有効化するには、新しいノードプールを作成する必要があります:

  1. Google Cloud Consoleにアクセスし、対象のプロジェクトを選択します。
  2. Kubernetes Engine > クラスタに移動し、対象のクラスタを選択します。
  1. ノードプールタブをクリックします。
  2. ノードプールを追加をクリックします。
  3. ノードプールの基本設定を行った後、セキュリティセクションまでスクロールします。
  4. Shielded Optionsで以下を設定:
    • Secure Boot: 有効にする
    • Integrity Monitoring: 有効にする(推奨)
  5. その他の設定を完了し、作成をクリックします。
  6. 新しいノードプールが作成されたら、既存のワークロードを新しいノードプールに移行します。
  7. 古いノードプール(Secure Bootが無効)を削除します。

Terraformでの修復手順

Terraformを使用してSecure Bootを有効にしたGKEクラスタを構築します:

# GKEクラスタの設定
resource "google_container_cluster" "secure_cluster" {
  name     = var.cluster_name
  location = var.region

  # 最小構成で開始(ノードプールで管理)
  initial_node_count       = 1
  remove_default_node_pool = true

  # ネットワーク設定
  network    = var.network_name
  subnetwork = var.subnetwork_name

  # プライベートクラスタ設定(推奨)
  private_cluster_config {
    enable_private_nodes    = true
    enable_private_endpoint = false
    master_ipv4_cidr_block  = "172.16.0.0/28"
  }

  # ワークロードアイデンティティ
  workload_identity_config {
    workload_pool = "${var.project_id}.svc.id.goog"
  }

  # セキュリティ設定
  master_auth {
    client_certificate_config {
      issue_client_certificate = false
    }
  }

  # クラスタのセキュリティ設定
  binary_authorization {
    evaluation_mode = "PROJECT_SINGLETON_POLICY_ENFORCE"
  }
}

# Secure Bootを有効にしたノードプール
resource "google_container_node_pool" "secure_nodes" {
  name       = "${var.cluster_name}-secure-pool"
  location   = var.region
  cluster    = google_container_cluster.secure_cluster.name

  # オートスケーリング設定
  autoscaling {
    min_node_count = var.min_node_count
    max_node_count = var.max_node_count
  }

  # ノード管理設定
  management {
    auto_repair  = true
    auto_upgrade = true
  }

  node_config {
    preemptible  = false
    machine_type = var.machine_type

    # Shielded VM設定(Secure Boot有効)
    shielded_instance_config {
      enable_secure_boot          = true  # Secure Boot有効化
      enable_integrity_monitoring = true  # 整合性監視も有効化
    }

    # ワークロードアイデンティティ
    workload_metadata_config {
      mode = "GKE_METADATA"
    }

    # サービスアカウント
    service_account = google_service_account.gke_node_sa.email
    oauth_scopes = [
      "<https://www.googleapis.com/auth/cloud-platform>"
    ]

    # ディスク暗号化
    disk_type    = "pd-ssd"
    disk_size_gb = 100

    # メタデータ設定
    metadata = {
      disable-legacy-endpoints = "true"
    }

    # ラベル
    labels = {
      environment = var.environment
      secure_boot = "enabled"
    }
  }

  # ノードのアップグレード設定
  upgrade_settings {
    max_surge       = 1
    max_unavailable = 0
  }
}

# ノード用サービスアカウント
resource "google_service_account" "gke_node_sa" {
  account_id   = "${var.cluster_name}-node-sa"
  display_name = "GKE Node Service Account"
  project      = var.project_id
}

# 必要最小限のIAMロール
resource "google_project_iam_member" "node_sa_roles" {
  for_each = toset([
    "roles/logging.logWriter",
    "roles/monitoring.metricWriter",
    "roles/monitoring.viewer",
    "roles/artifactregistry.reader"
  ])

  project = var.project_id
  role    = each.key
  member  = "serviceAccount:${google_service_account.gke_node_sa.email}"
}

# 変数定義
variable "cluster_name" {
  description = "GKEクラスタ名"
  type        = string
}

variable "region" {
  description = "GCPリージョン"
  type        = string
  default     = "us-central1"
}

variable "project_id" {
  description = "GCPプロジェクトID"
  type        = string
}

variable "min_node_count" {
  description = "最小ノード数"
  type        = number
  default     = 3
}

variable "max_node_count" {
  description = "最大ノード数"
  type        = number
  default     = 10
}

variable "machine_type" {
  description = "ノードのマシンタイプ"
  type        = string
  default     = "n2-standard-4"
}

 

最後に

この記事では、GKEノードでSecure Bootを有効化し、ブートプロセスの整合性を確保する方法について解説しました。

Secure Bootは、ルートキットやブートキットなどの高度なマルウェアからノードを保護する重要な機能です。Integrity MonitoringやvTPMと組み合わせることで、包括的なセキュリティ保護が実現できます。

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

参考情報

この記事をシェアする

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

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

料金プランを詳しく見る