GCEインスタンスのシリアルポート無効化手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、Google Cloud CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、Compute Engineインスタンスのシリアルポート無効化について、リスクと対策を解説します。

ポリシーの説明
VMインスタンスのシリアルコンソールを無効化し、この経路からの不正アクセスを防止します。Google Cloudではシリアルポートアクセスはデフォルトで無効になっていますが、意図的または誤って有効化されるケースがあるため、確実に無効化を維持することが重要です。
修復方法
gcloudコマンドでの修復手順
Google Cloud CLIを使用した修復が最も迅速かつ確実です。
1. プロジェクト全体でシリアルポートを無効化(推奨)
# プロジェクトメタデータにシリアルポート無効化設定を追加
gcloud compute project-info add-metadata \
--metadata serial-port-enable=FALSE
2. 特定のインスタンスでシリアルポートを無効化
# 個別のインスタンスでシリアルポートを無効化
gcloud compute instances add-metadata INSTANCE_NAME \
--zone=ZONE \
--metadata serial-port-enable=FALSE
3. 既存のすべてのインスタンスを一括で無効化
# すべてのインスタンスを取得してシリアルポートを無効化
for instance in $(gcloud compute instances list --format="value(name,zone)" | awk '{print $1":"$2}'); do
INSTANCE_NAME=$(echo $instance | cut -d':' -f1)
ZONE=$(echo $instance | cut -d':' -f2)
echo "Disabling serial port for instance: $INSTANCE_NAME in zone: $ZONE"
gcloud compute instances add-metadata $INSTANCE_NAME \
--zone=$ZONE \
--metadata serial-port-enable=FALSE
done
4. 組織ポリシーで制限(エンタープライズ環境推奨)
# 組織レベルでシリアルポートアクセスを制限
gcloud resource-manager org-policies enable-enforce \
compute.disableSerialPortAccess \
--organization=ORGANIZATION_ID
# プロジェクトレベルで制限
gcloud resource-manager org-policies enable-enforce \
compute.disableSerialPortAccess \
--project=PROJECT_ID
コンソールでの修復手順
Google Cloud コンソールを使用して、VMインスタンスのシリアルポート接続を無効化します。
- Compute Engineコンソールへアクセス
- Google Cloud Consoleにログイン
- ナビゲーションメニューから「Compute Engine」→「VMインスタンス」を選択
- プロジェクト全体でシリアルポートを無効化(推奨)
- 左側のメニューから「メタデータ」を選択
- 「メタデータ」タブで「編集」をクリック
- 「項目を追加」をクリック
- 以下の設定を追加:
- キー:
serial-port-enable
- 値:
FALSE
または0
- キー:
- 「保存」をクリック
- 個別のインスタンスでシリアルポートを無効化
- VMインスタンスの一覧から対象のインスタンスを選択
- インスタンスの詳細ページで「編集」をクリック
- 「リモートアクセス」セクションまでスクロール
- 「シリアルポートへの接続を有効にする」のチェックを外す
- ページ下部の「保存」をクリック
- 組織ポリシーでの制限(エンタープライズ環境推奨)
- 「IAMと管理」→「組織のポリシー」を選択
- 「ポリシーのリスト」で「constraints/compute.disableSerialPortAccess」を検索
- ポリシーを選択し、「編集」をクリック
- 「カスタマイズ」を選択し、「適用」を「オン」に設定
- 「保存」をクリック
Terraformでの修復手順
VMインスタンスのシリアルポートを無効化するTerraformコードと、主要な修正ポイントを説明します。
# プロジェクト全体のメタデータでシリアルポートを無効化
resource "google_compute_project_metadata" "default" {
metadata = {
# シリアルポートを無効化
serial-port-enable = "FALSE"
# その他のセキュリティ関連設定
enable-oslogin = "TRUE" # OS Loginを有効化
block-project-ssh-keys = "TRUE" # プロジェクト全体のSSHキーをブロック(必要に応じて)
}
# 既存のメタデータとマージする場合
lifecycle {
ignore_changes = [metadata["ssh-keys"]] # SSHキーの変更は無視
}
}
# 個別のVMインスタンスでシリアルポートを無効化
resource "google_compute_instance" "secure_instance" {
name = "secure-vm-instance"
machine_type = "e2-medium"
zone = var.zone
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
size = 20
type = "pd-standard"
}
# ディスク暗号化の設定
disk_encryption_key {
kms_key_self_link = google_kms_crypto_key.vm_key.id
}
}
network_interface {
network = google_compute_network.vpc_network.id
subnetwork = google_compute_subnetwork.private_subnet.id
# 外部IPを割り当てない(セキュリティ強化)
# access_config {} # コメントアウトして外部IPを無効化
}
# メタデータでシリアルポートを明示的に無効化
metadata = {
serial-port-enable = "FALSE"
enable-oslogin = "TRUE"
# 起動スクリプトでも追加のセキュリティ設定
startup-script = <<-EOT
#!/bin/bash
# カーネルパラメータでシリアルコンソールを無効化(Debian/Ubuntu)
if [ -f /etc/default/grub ]; then
sed -i 's/console=ttyS0,115200//' /etc/default/grub
update-grub 2>/dev/null || grub2-mkconfig -o /boot/grub2/grub.cfg
fi
# シリアルポート関連のサービスを無効化
systemctl disable serial-getty@ttyS0.service 2>/dev/null || true
systemctl stop serial-getty@ttyS0.service 2>/dev/null || true
EOT
}
# Shielded VMの設定(追加のセキュリティ)
shielded_instance_config {
enable_secure_boot = true
enable_vtpm = true
enable_integrity_monitoring = true
}
# サービスアカウントの設定
service_account {
email = google_service_account.vm_sa.email
scopes = ["cloud-platform"] # 必要最小限のスコープに制限
}
# ラベルの設定
labels = {
environment = "production"
security-hardened = "true"
}
}
# 既存のインスタンスを更新する場合
resource "google_compute_instance" "existing_instance" {
# ... 既存の設定 ...
# メタデータを更新してシリアルポートを無効化
metadata = merge(
var.existing_metadata,
{
serial-port-enable = "FALSE"
}
)
}
# インスタンステンプレートでシリアルポートを無効化
resource "google_compute_instance_template" "secure_template" {
name_prefix = "secure-instance-template-"
machine_type = "e2-medium"
region = var.region
disk {
source_image = "debian-cloud/debian-11"
auto_delete = true
boot = true
}
network_interface {
network = google_compute_network.vpc_network.id
subnetwork = google_compute_subnetwork.private_subnet.id
}
# テンプレートレベルでシリアルポートを無効化
metadata = {
serial-port-enable = "FALSE"
enable-oslogin = "TRUE"
}
# Shielded VM設定
shielded_instance_config {
enable_secure_boot = true
enable_vtpm = true
enable_integrity_monitoring = true
}
lifecycle {
create_before_destroy = true
}
}
# 組織ポリシーでシリアルポートを制限
resource "google_organization_policy" "serial_port_restriction" {
org_id = var.organization_id
constraint = "constraints/compute.disableSerialPortAccess"
boolean_policy {
enforced = true
}
}
# プロジェクトレベルの組織ポリシー
resource "google_project_organization_policy" "serial_port_restriction" {
project = var.project_id
constraint = "constraints/compute.disableSerialPortAccess"
boolean_policy {
enforced = true
}
}
# シリアルポートログの無効化(追加のセキュリティ対策)
resource "google_organization_policy" "serial_port_logging_restriction" {
org_id = var.organization_id
constraint = "constraints/compute.disableSerialPortLogging"
boolean_policy {
enforced = true
}
}
# Cloud Asset Inventoryを使用したシリアルポート設定の監視
resource "google_monitoring_alert_policy" "serial_port_enabled" {
display_name = "Serial Port Enabled Alert"
combiner = "OR"
conditions {
display_name = "Serial port enabled on VM instance"
condition_monitoring_query_language {
query = <<-EOT
fetch gce_instance
| metric 'compute.googleapis.com/instance/serial_port_1_output'
| filter metadata.user_metadata.serial-port-enable == 'TRUE' || metadata.user_metadata.serial-port-enable == '1'
| group_by 5m, [value_serial_port_access_count: count()]
| every 5m
| condition val() > 0
EOT
duration = "60s"
trigger {
count = 1
}
}
}
notification_channels = [google_monitoring_notification_channel.security_team.id]
alert_strategy {
auto_close = "1800s"
}
documentation {
content = "シリアルポートが有効化されたVMインスタンスが検出されました。セキュリティリスクを軽減するため、直ちに無効化してください。"
}
}
# Cloud Loggingでシリアルポートアクセスを監視
resource "google_logging_metric" "serial_port_access" {
name = "serial-port-access-attempts"
filter = <<-EOT
resource.type="gce_instance"
protoPayload.methodName="v1.compute.instances.getSerialPortOutput"
EOT
metric_descriptor {
metric_kind = "DELTA"
value_type = "INT64"
unit = "1"
labels {
key = "instance_name"
value_type = "STRING"
description = "The name of the instance"
}
labels {
key = "user_email"
value_type = "STRING"
description = "The email of the user accessing serial port"
}
}
label_extractors = {
"instance_name" = "EXTRACT(resource.labels.instance_id)"
"user_email" = "EXTRACT(protoPayload.authenticationInfo.principalEmail)"
}
}
まとめ
この記事では、Compute Engineインスタンスのシリアルポート無効化について、リスクと対策を解説しました。
シリアルポートアクセスはデフォルトで無効になっていますが、意図的に有効化された場合のリスクは非常に高く、特にIPベースのアクセス制限が不可能であることは重大なセキュリティ脆弱性となります。組織ポリシーを使用して全体的に制限することが最も効果的な対策です。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。