カスタムLinuxカーネル:不要な機能を削ぎ落とし速度とセキュリティを向上させる

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

なぜ自分でカーネルをコンパイルするのか?

Ubuntu、RHEL、Debianなどの標準的なディストリビューションには、「万能型(one-size-fits-all)」のカーネルが付属しています. これらの汎用ビルドは、古いThinkPadから128コアのThreadripperサーバーまで、ほぼあらゆる環境で起動するように設計されています。この膨大な互換性を実現するために、メンテナは通常は不要な数千ものドライバーや機能を詰め込んでいます。その結果、バイナリは肥大化し、攻撃対象領域(アタックサーフェス)が広がり、不必要なメモリオーバーヘッドが発生します。

私がカスタムカーネルに興味を持ったきっかけは、ラックサーバーの群れがフロッピーディスクやWi-Fiカードのドライバーを読み込んでいるのに気づいたことでした。空調管理されたデータセンターにあるこれらのマシンが、ディスクケットやワイヤレス信号を扱うことは一生ありません。こうしたレガシーコンポーネントを削ぎ落とすことで、よりスリムで高速、かつ大幅に安全な環境を構築できます。

トレードオフ:汎用 vs カスタム

標準カーネルと手動ビルドの選択は、利便性とコントロールのバランスです。本番環境において、それぞれがどのように機能するか見てみましょう。

汎用カーネル(ディストリビューション標準)

  • バイナリ配布: すぐに動作するコンパイル済みの .deb または .rpm ファイルを入手できます。
  • 膨大な互換性: 1990年代のSCSIコントローラーから最新のNVMeドライブまで、あらゆるモジュールが含まれています。
  • 自動アップデート: セキュリティパッチは aptdnf を通じて、手動操作なしで適用されます。
  • パフォーマンス: 一般的に平均的です。コードは特定のCPU命令セットを活用するよりも、幅広い互換性を優先して最適化されています。

カスタムカーネル(オーダーメイドのアプローチ)

  • ソースコード優先: kernel.org から直接生のコードを取得します。
  • ハードウェア固有: 使用している NIC、ストレージコントローラー、チップセットのドライバーのみを含めます。
  • 命令セットの最適化: Zen 3やIce Lakeなどのアーキテクチャに合わせてコンパイルできます。これにより、コンパイラは特殊な命令(AVX-512など)をより効率的に使用できるようになります。
  • 要塞化(ハーデニング): 特権のないeBPFや、エクスプロイトの標的になりやすい特定のレガシーシステムコールなどの高リスク機能を恒久的に無効化できます。

手動コンパイルの現実

コンパイルはあらゆるシナリオにおける魔法の杖ではありません。継続的なメンテナンスへのコミットメントが必要です。

メリット

  • フットプリントの削減: 最小限のカーネルは、CPUキャッシュをより効果的に活用します。4GB RAMのクラウドインスタンスでは、カスタムカーネルによって基本メモリ使用量が120MBから約45MBに減少するのを確認しました。これにより、高コンカレンシーなWebアプリに不可欠なリソースを解放できます。
  • 引き算によるセキュリティ: FireWireや古いUSBドライバーのコードが存在しなければ、それらが悪用されることもありません。ローカル権限昇格の脆弱性というカテゴリー全体を事実上排除できます。
  • 最先端の機能: 最新のスケジューリングの改善やファイルシステムのパッチを、安定版ディストリビューションのリポジトリに届く数ヶ月前に導入できます。

デメリット

  • 時間の投資: ハードウェアによりますが、コンパイルには最新のワークステーションで10分、安価なVPSでは1時間以上かかる場合があります。
  • 手動パッチ適用: あなた自身がアップストリームとなります。新しいCVEが発表されたら、手動でダウンロード、構成、再コンパイルを行う必要があります。
  • 脆弱性(壊れやすさ): NVMeドライバーを入れ忘れるなどのミス一つで「カーネルパニック」が発生し、システムが起動しなくなります。

ビルドの前提条件

最初の数回は必ずステージングサーバーやローカルのVMでビルドを行ってください。稼働中の本番ノードで実験してはいけません。この例では、Ubuntu 22.04 LTSを使用します。

まず、必要なツールチェーンをインストールします:

sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev dwarves zstd -y

少なくとも25GBの空きディスク容量を確保してください。コンパイルプロセスでは、膨大な量の中間オブジェクトファイルが生成されます。

ステップバイステップの実装

1. ソースコードの取得

kernel.org にアクセスして、最新の安定版を確認してください。本番環境では、長期サポート(LTS)ブランチを選択することをお勧めします。

Share: