ある状況においては、アプリケーションで独自のオペレーティング システムの構築や、カスタム カーネルのコンパイルが必要になる場合があります。カスタム カーネルをコンパイルする場合や、VM のカスタム オペレーティング システムを構築する場合は、このドキュメントに記載されている要件を満たしていることを確認します。
カスタム オペレーティング システムの構築は、特にカスタム カーネルが必要なアプリケーションを持つユーザー向けの高度なタスクです。ユーザーの大半は、使用可能ないずれかの公開イメージからの VM の作成、自動化された仮想ディスク インポート ツールによる他の環境から Compute Engine へのディスクのインポート、または一般的にストックされている Linux ディストリビューションのシステムからのカスタム イメージの手動インポートといった方法を採用しています。
ハードウェアのサポート要件
カーネルで次のデバイスがサポートされている必要があります。
- PCI ブリッジ: Intel Corporation 82371AB/EB/MB PIIX4 ACPI(rev 03)
- ISA ブリッジ: Intel 82371AB/EB/MB PIIX4 ISA(rev 03)
イーサネット コントローラ:
SCSI ストレージ コントローラ:
- Virtio-SCSI ストレージ コントローラ
- ベンダー = 0x1AF4(Qumranet / Red Hat)
- デバイス ID = 0x1004、サブシステム ID 0x8
- SCSI Primary Commands 4、SCSI Block Commands 3 をサポート
- リクエスト キューを 1 つだけサポート
- 永続ディスクで 4 KiB の物理セクターと 512 バイトの論理セクターを報告
- ブロック デバイス(ディスク)のみをサポート
- ホットプラグ / イベント機能ビットをサポート
- シリアルポート:
- 4 つの 16550A ポート
- IRQ 4 で ttyS0
- IRQ 3 で ttyS1
- IRQ 6 で ttyS2
- IRQ 7 で ttyS3
必須の Linux カーネルのビルド オプション
次のオプションを使用してオペレーティング システムのカーネルをビルドする必要があります。
CONFIG_KVM_GUEST=y
- 準仮想化機能を有効にします。
CONFIG_KVM_CLOCK=y
- 準仮想化クロックを有効にします(カーネル バージョンに適用する場合)。
CONFIG_VIRTIO_PCI=y
- 準仮想化 PCI デバイスを有効にします。
CONFIG_SCSI_VIRTIO=y
- 準仮想化ディスクへのアクセスを有効にします。
CONFIG_VIRTIO_NET=y
- ネットワーキングへのアクセスを有効にします。
CONFIG_PCI_MSI=y
- ローカル SSD デバイスに必要な高パフォーマンスの割り込み配信を有効にします。
セキュリティのカーネルのビルド オプション
カーネルのビルド オプションで次の推奨セキュリティ設定を使用します。
CONFIG_STRICT_DEVMEM=y
- PCI 空間、BIOS コード、データ領域へのアクセスのみを許可するように
/dev/mem
を制限します。
- PCI 空間、BIOS コード、データ領域へのアクセスのみを許可するように
CONFIG_DEVKMEM=n
/dev/kmem
に対するサポートを無効にします。- カーネルメモリへのアクセスをブロックします。
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
- ユーザー空間の割り当てから保護する低仮想メモリを設定します。
CONFIG_DEBUG_RODATA=y
- ページテーブルでカーネルの読み取り専用データを書き込み禁止としてマークし、このような
const
データへの誤った(正しくない)書き込みをキャッチします。カーネルコードの一部が 2 MB の TLB の対象外となるため、このオプションはパフォーマンスにわずかに影響する可能性があります。
- ページテーブルでカーネルの読み取り専用データを書き込み禁止としてマークし、このような
CONFIG_DEBUG_SET_MODULE_RONX=y
- 読み込み可能なカーネル モジュールのテキストと読み取り専用データに対する意図しない変更をキャッチします。このオプションはモジュール データの実行も防ぎます。
CONFIG_CC_STACKPROTECTOR=y
-fstack-protector
GCC 機能を有効にします。この機能は、戻りアドレスの直前のスタック上で重要な関数の先頭にカナリア値を追加し、関数が実際に値を返す直前にその値を検証します。これにより、スタックベースのバッファ オーバーフロー(この戻りアドレスを上書きする必要がある)によってカナリアが上書きされると、それが検出されることにもなります。その場合、カーネル パニックを使用して攻撃が無効化されます。
CONFIG_COMPAT_VDSO=n
- ASLR を強化するために、VDSO が予測可能なアドレスに配置されないようにします。この機能を有効にした場合は、VDSO が予測可能な古いスタイルのアドレスにマッピングされて、エクスプロイト コードのジャンプ先として、予測可能なロケーションが提供されます。十分に新しいバージョンの
glibc
(2.3.3 以降)を実行している場合はここでN
を指定して、高度な VDSO マッピングを排除し、ランダム化された VDSO のみを使用します。
- ASLR を強化するために、VDSO が予測可能なアドレスに配置されないようにします。この機能を有効にした場合は、VDSO が予測可能な古いスタイルのアドレスにマッピングされて、エクスプロイト コードのジャンプ先として、予測可能なロケーションが提供されます。十分に新しいバージョンの
CONFIG_COMPAT_BRK=n
- ヒープのランダム化は無効にしないでください。
CONFIG_X86_PAE=y
- NX のサポートには PAE が必要であるため、32 ビットのカーネルの場合はこのオプションを設定します。これにより、オーバーコミット以外を目的としたより大きなスワップ空間のサポートも行えるようになります。
CONFIG_SYN_COOKIES=y
- SYN フラッド対策を提供します。
CONFIG_SECURITY_YAMA=y
- これにより、通常の Linux 任意アクセス制御の範囲を超えるシステム全体の追加セキュリティ設定で DAC のサポートを拡張する Yama が選択されます。現在、この設定は ptrace の範囲制限です。
CONFIG_SECURITY_YAMA_STACKED=y
- Yama が利用可能な場合に、選択されたプライマリ LSM を使用して Yama が強制的にスタックされます。
カーネルのセキュリティ設定
カーネル設定ファイルを使用してカーネルのセキュリティを強化することもできます。推奨される次のセキュリティ設定が含まれるように、/etc/sysctl.conf
ファイルを編集します。
# Enable syn flood protection
net.ipv4.tcp_syncookies = 1
# Ignore source-routed packets
net.ipv4.conf.all.accept_source_route = 0
# Ignore source-routed packets
net.ipv4.conf.default.accept_source_route = 0
# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
# Ignore ICMP redirects
net.ipv4.conf.default.accept_redirects = 0
# Ignore ICMP redirects from non-GW hosts
net.ipv4.conf.all.secure_redirects = 1
# Ignore ICMP redirects from non-GW hosts
net.ipv4.conf.default.secure_redirects = 1
# Don't allow traffic between networks or act as a router
net.ipv4.ip_forward = 0
# Don't allow traffic between networks or act as a router
net.ipv4.conf.all.send_redirects = 0
# Don't allow traffic between networks or act as a router
net.ipv4.conf.default.send_redirects = 0
# Reverse path filtering—IP spoofing protection
net.ipv4.conf.all.rp_filter = 1
# Reverse path filtering—IP spoofing protection
net.ipv4.conf.default.rp_filter = 1
# Ignore ICMP broadcasts to avoid participating in Smurf attacks
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Ignore bad ICMP errors
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Log spoofed, source-routed, and redirect packets
net.ipv4.conf.all.log_martians = 1
# Log spoofed, source-routed, and redirect packets
net.ipv4.conf.default.log_martians = 1
# Randomize addresses of mmap base, heap, stack and VDSO page
kernel.randomize_va_space = 2
# Provide protection from ToCToU races
fs.protected_hardlinks=1
# Provide protection from ToCToU races
fs.protected_symlinks=1
# Make locating kernel addresses more difficult
kernel.kptr_restrict=1
# Set ptrace protections
kernel.yama.ptrace_scope=1
# Set perf only available to root
kernel.perf_event_paranoid=2
次のステップ
- オペレーティング システムをブートディスクにインストールし、Compute Engine にカスタム イメージとしてイメージを手動でインポートする。
- オペレーティング システムをカスタム イメージとしてすでにインポートしている場合は、Compute Engine 環境内で最適に機能できるよう、イメージでカーネル以外の設定を構成する。