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を有効化するには、新しいノードプールを作成する必要があります:
- Google Cloud Consoleにアクセスし、対象のプロジェクトを選択します。
- Kubernetes Engine > クラスタに移動し、対象のクラスタを選択します。


- ノードプールタブをクリックします。
- ノードプールを追加をクリックします。
- ノードプールの基本設定を行った後、セキュリティセクションまでスクロールします。
- Shielded Optionsで以下を設定:
- Secure Boot: 有効にする
- Integrity Monitoring: 有効にする(推奨)
- その他の設定を完了し、作成をクリックします。
- 新しいノードプールが作成されたら、既存のワークロードを新しいノードプールに移行します。
- 古いノードプール(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機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。