Linuxサーバーに乗り込んだ後の防御はSSH設定・権限管理・ファイアウォールと手厚くしていても、ブートプロセス自体が無防備なままでは大きな穴が残ります。GRUBにパスワードが設定されていないサーバーは、物理アクセスか仮想コンソール経由で再起動さえできれば、数分でrootシェルを奪える状態です。
この記事では、GRUBブートローダーのセキュリティ設定について、攻撃者がどう悪用するかという視点から具体的な防御手順まで解説します。クラウド・VPS環境との違いや、bootパーティションの権限管理まで現場で使えるレベルで網羅します。

GRUBとは?なぜセキュリティ設定が必要か
GRUB(Grand Unified Bootloader)は、Linuxを起動するときに最初に動くブートローダーです。カーネルを読み込み、initramfsを展開してOSを立ち上げる役割を担います。
通常の運用ではGRUBの存在を意識する機会は少ないですが、攻撃者の視点で見ると「OSが動き出す前の段階で手を入れられる」という点が重要です。
・OSのセキュリティ機構が働く前の段階: SELinux・PAM・auditdはすべてOS起動後に機能します。GRUBの段階では、これらが一切効いていません
・カーネルパラメータを直接変更できる: GRUBのコマンドラインからカーネルオプションを書き換えれば、rootパスワードなしに管理者権限を取得できます
・デフォルトでは誰でも操作できる: 標準状態のGRUBメニューはキーボード入力で自由に編集できる状態になっています
オンプレミスサーバーはもちろん、VPSやクラウドのコンソール接続でも同様の操作が可能なケースがあります。「クラウドだから安全」と思い込むのは危険です。
攻撃者はGRUBをどう悪用するか(敵を知る)
1. 単一ユーザーモードからのroot奪取
最も古典的な手口です。GRUB起動中にカーネルの起動オプションを編集し、rd.break または init=/bin/sh を追加することで、パスワードなしのrootシェルを得られます。
# GRUBメニューでカーネル行に追記する攻撃例(防御理解のための参考) linux /vmlinuz-... root=UUID=... ro rd.break # ↑これだけでrootシェルが起動してしまう(RHEL/CentOS系) # Debian/Ubuntu系では以下 linux /vmlinuz-... root=UUID=... rw init=/bin/sh
この操作だけで /sysroot に chroot してパスワードを変更できてしまいます。SELinuxが有効でも、ラベル付け処理が終わっていない段階では制限が不完全です。
2. GRUBコマンドラインからのカーネルパラメータ改ざん
GRUBメニューで e キーを押せばカーネルのブートパラメータを直接編集できます。以下のようなパラメータを追加されると致命的です。
・enforcing=0: SELinuxを強制モードから切り離し、セキュリティポリシーを無効化
・selinux=0: SELinuxを完全無効化
・init=/bin/bash: 通常のinitプロセスをbashに置き換えてrootシェルに
・systemd.unit=rescue.target: rescue modeで起動してrootシェル取得
3. bootパーティションへの不正アクセス
/boot 以下のカーネルイメージやinitramfsが世界読み取り可能な場合、攻撃者はこれらをコピーして解析し、既知の脆弱性のあるバージョンを特定することができます。さらに書き込み権限があれば、カーネルやinitramfsそのものを差し替えることも可能です。
GRUBセキュリティの具体的な設定手順
1. GRUBブートパスワードの設定
まず、GRUBのパスワードハッシュを生成します。平文パスワードをそのまま設定ファイルに書くのは避け、必ずハッシュ化したものを使います。
# GRUBパスワードのハッシュを生成 grub2-mkpasswd-pbkdf2 # 実行例 Enter password: (パスワードを入力) Reconfirm password: (確認入力) PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.xxxxxxxx...
生成されたハッシュを使ってカスタム設定ファイルを作成します。RHEL/Rocky Linux系とDebian/Ubuntu系でファイルパスが異なります。
# RHEL/Rocky Linux/AlmaLinux系 # /etc/grub.d/01_users を新規作成(実行権限も付ける) cat > /etc/grub.d/01_users << 'EOF' #!/bin/sh set -e cat << GRUBEOF set superusers="grubadmin" password_pbkdf2 grubadmin grub.pbkdf2.sha512.10000.xxxxxxxx(実際のハッシュに置き換える) GRUBEOF EOF chmod +x /etc/grub.d/01_users
# Debian/Ubuntu系 # /etc/grub.d/40_custom の末尾に追記 sudo nano /etc/grub.d/40_custom # 以下を末尾に追加 set superusers="grubadmin" password_pbkdf2 grubadmin grub.pbkdf2.sha512.10000.xxxxxxxx(実際のハッシュに置き換える)
設定後、GRUBの設定ファイルを再生成します。
# RHEL/Rocky Linux系(BIOSブートの場合) grub2-mkconfig -o /boot/grub2/grub.cfg # UEFIシステムの場合(RHEL系) grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg # Debian/Ubuntu系 update-grub
設定後は、GRUBメニューで e キーや c キーを押したときにユーザー名とパスワードの入力が求められるようになります。
2. 通常起動はパスワードなし・編集のみ制限する
GRUBのsuperusers設定後はデフォルトですべてのメニューエントリの起動にもパスワードが必要になります。自動再起動が必要なサーバーではこれが問題になるため、通常起動は認証なしで許可し、編集操作だけを保護する設定が実用的です。
# grub2-mkconfig 再生成後、grub.cfg を確認する # menuentry 行に --unrestricted が付いているか確認 grep -n "menuentry\|unrestricted" /boot/grub2/grub.cfg # --unrestricted がない場合、/etc/grub.d/10_linux を編集して # CLASS="${CLASS} --unrestricted" の行を探して調整するか、 # /etc/grub.d/ にカスタムスクリプトを追加してメニューを上書きする # 確認例:以下のようになれば通常起動にパスワード不要 # menuentry 'Rocky Linux' --class rocky --unrestricted {
【重要】 grub.cfg はシステムのアップデートや grub2-mkconfig / update-grub を実行するたびに上書きされます。カスタマイズは必ず /etc/grub.d/ 配下のスクリプトで行い、grub.cfg を直接編集しないでください。
3. bootパーティションの権限を制限する
カーネルイメージとinitramfsはroot以外が読めないよう権限を絞ることが望ましいです。
# /boot 配下の現在の権限を確認 ls -la /boot/ stat /boot/initramfs-$(uname -r).img 2>/dev/null || stat /boot/initrd.img-$(uname -r) # initramfsのパーミッションを600に変更(RHEL系) chmod 600 /boot/initramfs-*.img # Debian/Ubuntu系 chmod 600 /boot/initrd.img* # grub.cfgも600に設定(rootのみ読み取り可) chmod 600 /boot/grub2/grub.cfg # RHEL系 chmod 600 /boot/grub/grub.cfg # Debian/Ubuntu系 # 設定確認 ls -la /boot/initramfs-*.img /boot/grub2/grub.cfg 2>/dev/null ls -la /boot/initrd.img* /boot/grub/grub.cfg 2>/dev/null
Linuxのファイルパーミッション設定の基礎については、Linuxファイルパーミッション入門(chmod・chown・umask)も合わせて確認してください。
4. GRUBタイムアウトの短縮
GRUBメニューの表示時間を短くすることで、攻撃者がメニューを操作する時間的余裕を減らせます。
# /etc/default/grub を編集 # デフォルトは5秒 → 1秒程度に短縮 GRUB_TIMEOUT=1 # GRUB_TIMEOUT_STYLE=countdown のままにすること # hidden にするとメニューが表示されなくなり、緊急時に操作できなくなる # 設定を反映 grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL系 update-grub # Debian/Ubuntu系
クラウド・VPS環境での考え方
GRUBのパスワード設定はオンプレミスでの効果が最も高いですが、環境によって対応優先度が変わります。
| 環境 | 推奨対策 | 優先度 |
|---|---|---|
| オンプレ(物理サーバー) | GRUBパスワード設定 + bootパーティション権限制限 + BIOS/UEFIパスワード | 高 |
| VPS(noVNC等コンソールあり) | GRUBパスワード設定 + bootパーミッション制限(管理パネルのコンソールアクセス制限も確認) | 中~高 |
| クラウド(AWS・Azure・GCP) | bootパーミッション制限 + IAMによるコンソールアクセス制限(クラウド側で制御) | 中 |
| コンテナ(Docker等) | GRUBはコンテナ内に存在しない。ホストOSのGRUBセキュリティに委ねる | — |
クラウド環境では、GRUBを直接操作できるコンソールへのアクセスはIAM権限で管理されています。IAMの最小権限設定が実質的な第一防衛ラインになります。
セキュアブートとUEFIレベルの保護については、セキュアブートとTPMで守るファームウェアセキュリティの仕組みと企業での活用ガイドも参照してください。GRUBレベルの防御と組み合わせることでブート時の多層防御が実現できます。
Linuxのユーザーアカウント管理を組み合わせることで、OS起動後の侵害も防ぎやすくなります。Linuxのユーザーアカウントセキュリティ強化ガイドも活用してください。
Linuxの幅広いセキュリティ設定・コマンド解説については、姉妹サイトLinuxMaster.JPでも実践的な記事を公開しています。
よくある誤解と注意点
「クラウドサーバーだからGRUBは関係ない」は過信につながる
AWS EC2であっても、インスタンスコンソールにアクセスできるIAMアカウントが侵害された場合、GRUBレベルの操作が可能になるケースがあります。クラウド側のアクセス制御と組み合わせつつ、bootパーティションの権限設定はインスタンス内でも実施しておくことを推奨します。
grub.cfgを直接編集するのは避ける
grub.cfg はシステムのアップデートや update-grub ・ grub2-mkconfig 実行のたびに上書きされます。手動で直接編集した設定は消えます。カスタマイズは必ず /etc/grub.d/ 配下のスクリプトで行います。
GRUBパスワードを忘れたときの復旧手順を事前に文書化する
GRUBパスワードを忘れると、通常の方法ではrootパスワードリセットもできなくなります。設定前にパスワードをパスワードマネージャー等の安全な場所に保管し、LiveUSBやレスキューモードを使った緊急復旧手順を文書化しておいてください。
–unrestricted なしで設定すると自動再起動が止まる
GRUBのsuperusers設定後に --unrestricted を付けずに再生成すると、通常のOS起動時にもパスワード入力が求められます。無人で再起動が必要なサーバーでは、この設定ミスで復旧不能になるリスクがあります。設定変更後は必ず再起動テストを実施してください。
権限昇格のリスク全般については、権限昇格(Privilege Escalation)とは?仕組み・攻撃手口・防御策をわかりやすく解説も参考にしてください。

本記事のまとめ
GRUBブートローダーのセキュリティは、OSが動き出す前の「最初の防衛ライン」です。設定手順をまとめると以下のとおりです。
| 対策 | 設定箇所 | 主な効果 |
|---|---|---|
| GRUBパスワード設定 | grub2-mkpasswd-pbkdf2 → /etc/grub.d/01_users | カーネルパラメータ改ざんによるroot奪取を防止 |
| –unrestricted 設定 | /etc/grub.d/ のカスタマイズ | 通常起動は認証なし・編集のみ認証必須 |
| bootパーミッション設定 | chmod 600 /boot/initramfs-* など | カーネルイメージの解析・差し替えを制限 |
| GRUBタイムアウト短縮 | /etc/default/grub の GRUB_TIMEOUT | メニュー操作の時間的余裕を減らす |
これらの設定はすべて無償で実施でき、特別なハードウェアも不要です。物理アクセスが想定されるオンプレミス環境では最優先で対応しましょう。設定変更後は必ず再起動テストを行い、正常起動と保護機能の両方を確認してください。
PR
Linuxサーバーの堅牢化を体系的に学べる一冊。GRUBやブートプロセスの保護から、権限管理・ログ監視・ファイアウォール設定まで幅広くカバーしています。
