MENU

Linuxのカーネルモジュールセキュリティ管理|不正モジュール検出とロード制限の実践ガイド

サーバーへの侵入に成功した攻撃者が最終的に狙うのが、カーネルモジュールとして悪意あるコードを仕込む「カーネルレベルルートキット」の設置です。カーネルと同じ権限で動作するため、通常のマルウェア検知やプロセス監視では発見できないまま長期間潜伏されてしまいます。

この記事では、Linuxカーネルモジュールのセキュリティリスクと、modprobe設定・ブラックリスト・署名検証を組み合わせた実践的な多層防御を解説します。RHEL系(AlmaLinux・Rocky Linux)とDebian系(Ubuntu)両方の設定例を掲載しているので、現在使っている環境に合わせてすぐ適用できます。

Linuxのカーネルモジュールセキュリティ管理|不正モジュール検出とロード制限の実践ガイド - 解説

目次

カーネルモジュールとは?なぜセキュリティリスクになるのか

カーネルモジュールは、動作中のLinuxカーネルに機能を動的に追加するプログラムです。NICドライバーやファイルシステムサポート(ext4、xfsなど)はその代表例で、再起動なしにカーネルへ読み込める仕組みとして広く使われています。

問題はその動作権限にあります。カーネルモジュールはOSカーネルと同じ「カーネル空間(ring 0)」で実行されます。これは、システムコールの横取り・メモリの直接読み書き・すべてのプロセスへのアクセスが可能であることを意味します。

ユーザーランドで動作するマルウェアはpsやls、netstatといったコマンドで検出できます。しかし攻撃者がカーネルモジュールとして悪意あるコードを組み込むと、これらのコマンド自体の出力を書き換えることができます。管理者が見えている「現実」が改ざんされるため、通常の手段では発見できません。

攻撃者がカーネルモジュールを悪用する手口

カーネルモジュールを悪用した「カーネルレベルルートキット」が実現できることを、防御の観点から整理します。

・プロセス隠蔽: /procファイルシステムを改ざんし、psコマンドから攻撃者のバックドアプロセスを見えなくする
・ファイル隠蔽: ファイルシステムコールをフックして、マルウェアのファイルをlsの結果から消す
・ネットワーク接続の隠蔽: ssやnetstatの出力からC2(コマンド&コントロール)への接続を隠す
・ログ改ざん: ログ書き込みのシステムコールを横取りして、侵入痕跡を記録させない
・バックドアの常設: 特定のネットワークパケットを受け取ると遠隔でroot権限のシェルを開く機能を仕込む

セキュリティ研究者によって防御目的で仕組みが公開されているカーネルルートキット(Diamorphine、Reptileなど)は、既製ツールとして入手できる状態です。高度な技術がなくても利用可能なため、侵入後の「後処理」として使われるケースが実際に確認されています。

まずユーザーランドのルートキット検知を基礎として押さえておきたい方は、Linuxのrootkit検知と対策(chkrootkit・rkhunter)の記事も参照してください。

具体的な防御手順

1. 現在のロード済みモジュールを確認してベースラインを記録する

防御の第一歩は「正常な状態を記録する」ことです。攻撃者が不正なモジュールを仕込んだときに比較できる基準を先に作っておきます。

# ロード済みモジュールの一覧を確認する lsmod # 正常時のベースラインをファイルに保存する(日付付きで記録) lsmod > /root/lsmod-baseline-$(date +%Y%m%d).txt # 特定モジュールの詳細情報を確認する(署名者・ライセンス等が分かる) modinfo <モジュール名> # カーネルのモジュール読み込み履歴をjournaldで確認する journalctl -k | grep -i modprobe

modinfoの出力にはsignerフィールドが含まれます。正規のディストリビューションカーネルモジュールには署名が付いており、サードパーティ製や不正に挿入されたモジュールには署名がない場合があります。

2. blacklistで不要なモジュールの自動ロードを禁止する

/etc/modprobe.d/配下に.confファイルを作成し、サーバーで使わないモジュールをブラックリストに登録します。自動ロードを防ぐことで攻撃面を減らせます。

# 設定ファイルを新規作成する(ファイル名は任意だが .conf が必要) vi /etc/modprobe.d/security-hardening.conf # --- ファイル内容 --- # 一般的なWebサーバーやDBサーバーでは不要なモジュール # USBストレージ(USBデバイスを使わないサーバー向け) blacklist usb-storage # レガシーファイルシステム(不要なら無効化) blacklist cramfs blacklist freevxfs blacklist jffs2 blacklist hfs blacklist hfsplus blacklist udf # マルウェアC2で悪用されやすいマイナーなネットワークプロトコル blacklist dccp blacklist sctp blacklist rds blacklist tipc # --- ここまで ---

重要: blacklistディレクティブは「自動ロード」を防ぐだけです。modprobeコマンドによる手動ロードや、他のモジュールからの依存関係経由のロードは防げません。より確実な禁止には次のステップが必要です。

3. install /bin/false でロードを完全ブロックする

install モジュール名 /bin/falseの設定をすると、そのモジュールがロードされようとした際に代わりに/bin/false(何も実行せず失敗するコマンド)が呼ばれ、ロードが完全にブロックされます。blacklistと組み合わせるのが推奨です。

# /etc/modprobe.d/security-hardening.conf に追記する # blacklist と install の両方を設定するのがベストプラクティス # USBストレージの完全禁止 blacklist usb-storage install usb-storage /bin/false # DCCPプロトコルの完全禁止 blacklist dccp install dccp /bin/false # SCTPプロトコルの完全禁止 blacklist sctp install sctp /bin/false # 設定を反映するためにinitramfsを更新する(再起動後も有効になる) # RHEL系(AlmaLinux・Rocky Linux・RHEL) dracut --force # Debian/Ubuntu系 update-initramfs -u

4. カーネルモジュール署名検証を有効化する

Linuxカーネルにはモジュールの電子署名を検証する機能があり、署名のないモジュールのロードを拒否する「強制モード」を有効化できます。カーネル起動パラメータにmodule.sig_enforce=1を追加することで設定できます。

# まず現在ロードされているモジュールの署名状態を確認する # 署名があるモジュールは signer フィールドが出力される for mod in $(lsmod | awk 'NR>1 {print $1}'); do signer=$(modinfo "$mod" 2>/dev/null | grep "^signer:") if [ -z "$signer" ]; then echo "署名なし: $mod" fi done # 署名なしモジュールがゼロであることを確認してから以下を実施する # RHEL系: /etc/default/grub を編集 # GRUB_CMDLINE_LINUX に module.sig_enforce=1 を追記する # 変更前: GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet" # 変更後: GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet module.sig_enforce=1" vi /etc/default/grub # GRUBの設定ファイルを更新する(BIOS/Legacy環境) grub2-mkconfig -o /boot/grub2/grub.cfg # UEFI環境(パスはディストリビューションにより異なる) grub2-mkconfig -o /boot/efi/EFI/almalinux/grub.cfg # Debian/Ubuntu系 # GRUB_CMDLINE_LINUX_DEFAULT に module.sig_enforce=1 を追記後 vi /etc/default/grub update-grub

注意: 署名検証の強制モードを有効化する前に、サーバーにロードしているすべてのモジュールが署名済みであることを必ず確認してください。NVIDIA・AMD GPU ドライバー、一部のVPNクライアント用モジュール(OpenVPN TAP、WireGuardの旧版など)は署名がない場合があり、有効化するとサーバーが起動不能になるリスクがあります。本番環境への適用前に、必ずテスト環境で検証してください。

セキュアブート(Secure Boot)とTPMと組み合わせることで、OSの起動フェーズからモジュール署名の信頼チェーンを確立できます。署名検証はセキュアブートと連携してこそ、より堅牢な防御になります。

Linuxのカーネルが各モジュールに対してどのような権限を与えるかの仕組みについては、Linuxのcapabilities(ケーパビリティ)入門の記事もあわせて参照してください。

Linuxのコマンド操作についてさらに詳しく学びたい方は、姉妹サイトLinuxMaster.JPも参考にしてみてください。

中小企業でも今日からできること

署名検証の強制モードはサードパーティドライバーとの互換性確認が必要なため、即日適用が難しいケースもあります。まず確実に実施できるところから始めましょう。

・ベースライン記録: 今すぐlsmod > /root/lsmod-baseline.txtを実行し、正常時のモジュール一覧を保存する
・blacklist設定: USBストレージ・レガシーファイルシステム・DCCPなど使わないモジュールをブラックリストに登録し、install /bin/falseで完全禁止にする
・定期的な差分確認: 週1回程度、lsmodの出力をベースラインとdiffして新規追加モジュールを確認する
・journaldのログ確認: journalctl -k | grep modprobeで不審なモジュールのロード試行がないか確認する
・rkhunter・chkrootkitの定期スキャン: ユーザーランドのルートキット検知と組み合わせることで検出精度が上がる

ベースライン記録→blacklist設定→定期確認という3ステップは、どのサーバーでもすぐに実施できます。ここから始めることがカーネルモジュールセキュリティの第一歩です。

よくある誤解と注意点

「blacklistに登録すれば完全に安全」ではない
blacklistは自動ロードを止めるだけです。rootを取得した攻撃者はinsmodコマンドで直接ロードできます。完全な禁止にはinstall /bin/falseの組み合わせが必要です。

「モジュール署名検証=100%安全」ではない
root権限を持つ攻撃者はGRUBの設定ファイルを書き換えて署名検証を無効化できます。署名検証はセキュアブートと組み合わせ、起動時の設定変更を防ぐことで初めて有効な防御になります。また「100%安全」という対策は存在しません。多層防御の一つとして位置づけてください。

「カーネルモジュール攻撃は高度な攻撃者しかやらない」ではない
既製のルートキットツールキットが広く公開されており、技術力が低い攻撃者でも侵入後に利用できます。特にランサムウェアグループが持続的なアクセスを維持する手段として使う事例が増えています。

Linuxのカーネルモジュールセキュリティ管理|不正モジュール検出とロード制限の実践ガイド - まとめ

本記事のまとめ

対策 主な効果 難易度
lsmodベースラインの記録・定期比較 不審なモジュールの追加を検出する 低(今すぐできる)
blacklist設定 不要モジュールの自動ロードを防ぐ 低
install /bin/false モジュールロードを完全ブロックする 低
module.sig_enforce=1 署名なしモジュールのロードを拒否する 中(事前確認が必要)
セキュアブートとの連携 起動時からの信頼チェーンを確立する 中~高

カーネルモジュールのセキュリティ管理は、サーバーの最も深いレイヤーの防御です。複雑に考える必要はなく、「今のモジュール一覧を記録する」「使わないものをブロックする」という小さな一歩から始めてください。攻撃者が潜伏できる時間を縮めることが、被害を最小化する最善策です。

PR

Linuxサーバーセキュリティ徹底入門(中島能和)

SELinuxやファイアウォール、ログ監視からカーネルレベルの堅牢化まで、Linuxサーバーのセキュリティ設定を体系的に学べる実践的な一冊。本記事で扱ったモジュール管理の前提知識となるLinuxセキュリティの全体像を把握するのに最適です。

関連記事をもっと読む

同じテーマの記事をまとめています。あわせて読みたい記事はこちらからご覧いただけます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次