【テクニカル・上級編】 Bottlerocket OSの読み取り専用ファイルシステムとカーネルパラメータの固定 – インフラ・ネットワーク & クラウドセキュリティ防御ガイド

従来のLinux要塞化という「終わりのない呪縛」

これまでのインフラエンジニアのキャリアを振り返ってみてほしい。UbuntuやRHEL、あるいはAmazon Linuxの初期セットアップの後、何をしてきたか。iptablesやnftablesの細かいルール調整、sysctl.confの泥臭いチューニング、auditdの監査ルール定義、そして定期的に降ってくる脆弱性(CVE)パッチの適用とリブートの嵐。

「不要なサービスを止める」と言いつつ、systemdの依存関係の複雑さに頭を抱え、SSHのパッチ当てで深夜にコンソールにかじりつく。そして、コンテナランタイムを乗せた瞬間に、ホストOSの広大なアタックサーフェス(攻撃表面)がそのままコンテナ脱出の踏み台になるリスクに怯える。

私たちは長年、「穴の空いたバケツをパッチで塞ぐ作業」をセキュリティ対策と勘違いさせられてきた。

だが、クラウドネイティブの潮流は、そのパラダイムを根本から粉砕した。コンテナを実行するためだけに削ぎ落とされたOS、それがAWSが開発したオープンソースのコンテナ専用OS 「Bottlerocket」 である。本稿では、Bottlerocketが持つ圧倒的な要塞化のメカニズム、すなわち「最初から改ざん不可能なルートファイルシステム」と「イミュータブルなカーネルパラメータの固定」が、いかにしてモダンなインフラのセキュリティ境界を再定義するかを、攻撃者の視点を交えながら徹底的に解説する。

—

なぜ汎用OSのハーデニングは攻撃者に突破されるのか

サイバー犯罪グループやAPT(高度持続的狙い)組織が標的型攻撃を行う際、初期侵入後の「持続化(Persistence)」と「権限昇格(Privilege Escalation)」のフェーズで最も好むのは、「書き込み可能なファイルシステム」と「動的に変更可能なカーネルパラメータ」である。

一般的なLinuxディストリビューションでは、攻撃者が何らかの脆弱性(例えば、最近で言えばNetfilterの脆弱性やローカル特権昇格をもたらすCVE)をついてRCE(リモートコード実行)に成功した場合、次のような手順を踏む。

1. /tmp や /dev/shm などの実行可能な領域にマルウェアバイナリを配置する。
2. /etc/passwd や /etc/sudoers を改ざんしてバックドアアカウントを維持する。
3. sysctl を操作するか、ロードable Kernel Module(LKM)を挿入して、セキュリティ機構(SELinuxやAppArmor)を無効化する。

要するに、OSが「変更可能(Mutable)」であるという前提そのものが、攻撃者にとって最高の踏み台なのだ。

この構造的欠陥に対して、単に「不要なデーモンを止める」「SSHを禁止する」という表層的なハーデニング(要塞化)を行っても無意味だ。攻撃者はシェルすら必要とせず、メモリ上のデータ構造を直接書き換えるか、コンテナのランタイムの脆弱性からホストのカーネル空間へダイレクトにジャンプする。

ここで、Bottlerocketのアーキテクチャが持つ真価が発揮される。

—

Bottlerocketの要塞化メカニズム:2つの防衛壁

Bottlerocketは、従来のLinuxとは根本的に設計思想が異なる。シェルが存在せず、パッケージマネージャー(aptやyum)もなく、デバッグツールすらない。この「極限まで削ぎ落とされたミニマリズム」こそが最強の防衛策となる。

1. 読み取り専用(Read-Only)ルートファイルシステムとdm-verity

Bottlerocketのルートファイルシステムは、完全に読み取り専用(read-only)としてマウントされている。これは単に権限設定で書き込みを弾いているレベルではない。ストレージ層において、Linuxのデバイスマッパー機能である dm-verity(Device Mapper Verity) が採用されている。

dm-verityは、ブロックデバイスのブロックごとに暗号学的ハッシュ(Merkle樹構造)を計算し、カーネル空間で検証を行う仕組みだ。もし攻撃者が何らかのゼロデイexploitを用いてストレージ上のバイナリや設定ファイルを1バイトでも書き換えようとした瞬間、ブロックのハッシュ不一致が検知され、カーネルパニックを引き起こしてシステムは即座に停止する。

つまり、「改ざんは検知されるのではなく、物理的・暗号学的に不可能である」という状態が強制される。バックドアの仕込みも、永続的なマルウェアの常駐も、この層で完全に封じ込められるのだ。

2. イミュータブルなカーネルパラメータの固定

カーネルの挙動を制御する sysctl のパラメータも、Bottlerocketでは実行時にアドホックに変更することができない。すべては設定ファイル(TOML形式)を通じて宣言的に定義され、OSの起動時(APIサーバーの管理下)にアトミックに適用される。

これにより、以下のような典型的なカーネルレベルの攻撃ベクトルを根絶する。

  • カーネルメモリダンプの防止: デバッグインターフェースを通じた機微情報の漏洩阻止
  • パケット転送(IP Forwarding)の厳格な制御: 不要なルーティングの排除
  • シンボリックリンク/ハードリンクの作成制限: TOCTOU(Time-of-Check to Time-of-Use)競合状態を利用した特権昇格の無効化

—

実践:Bottlerocketの宣言的セキュリティ設定と監査

ここからは、実務の現場でBottlerocketをデプロイし、セキュリティを最大化するための具体的な設定アプローチを見ていく。Bottlerocketの設定は、AWSならCloudFormationやTerraformを通じて、User Data(TOML形式)として流し込むのが基本だ。

以下の設定例は、カーネルパラメータのハードニングと、SSHの完全無効化(あるいは管理用コンテナの限定的な有効化)を宣言的に定義したサンプルである。

[settings.kernel-parameters]
# カーネルのシンボルアドレスを非公開にし、KASLR(Kernel Address Space Layout Randomization)を補助
"kernel.kptr_restrict" = "2"

# カーネルログ(dmesg)への特権ユーザー以外からのアクセスを禁止し、情報漏洩を防ぐ
"kernel.dmesg_restrict" = "1"

# リンク作成に関するセキュリティ強化(CVE-2010-8304等の対策:特定の条件を満たさないとハードリンク/シンボルリンクを作成できないようにする)
"fs.protected_hardlinks" = "1"
"fs.protected_symlinks" = "1"

# 潜在的なスタック溢れやメモリ破壊を伴うマジックSysRqキー機能を完全に無効化
"kernel.sysrq" = "0"

[settings.motd]
message = "Authorized access only. This is an immutable Bottlerocket instance."

# デフォルトでSSHは無効。トラブルシューティングには「Control Container」を使用する設計が鉄則
[settings.host-containers.admin]
enabled = false

チーフホワイトハッカーの現場視点:管理用コンテナ(Control Container)の罠

「シェルがないとトラブルシューティングができない」と不安がるエンジニアが必ず現れる。Bottlerocketには、ホストをデバッグするための特権コンテナである 「Control Container」 を有効化する機能がある。

しかし、セキュリティアーキテクトとしての警告として、プロダクション環境(本番環境)においてControl Containerを有効化することは、要塞化の努力を自ら台無しにする行為であると断言する。

もし管理用コンテナを有効にする必要がある場合でも、以下の鉄則を守らなければならない。

1. 短命化(Ephemelal): 永続的に常駐させず、AWS Systems Manager (SSM) Session Manager経由で必要な瞬間だけオンデマンドで起動する。
2. 監査ログの強制: すべての操作セッションをCloudWatch LogsやS3にストリーミングし、改ざん不能な監査証跡を残す。

—

セキュリティ監査とコンプライアンスの観点から

CISベンチマーク(Center for Internet Security)やPCI-DSSなどの厳格なコンプライアンスフレームワークを監査する際、従来のLinuxサーバーでは「設定ファイルが意図通りに変更されているか」「未承認のパッケージがインストールされていないか」をチェックするために、複雑なエージェント(TripwireやOSSECなど)を常駐させる必要があった。

しかし、Bottlerocketにおいて、この監査コストは劇的にゼロへと近づく。

  • パッケージの存在確認: 元々パッケージマネージャーが存在せず、バイナリの追加が不可能であるため、ソフトウェアインベントリの監査が極めてシンプルになる。
  • 設定の整合性: すべての状態が宣言的なTOML設定に依存しているため、IaC(Infrastructure as Code)のコードレビュー=セキュリティ監査として成立する。

攻撃者が侵入したとしても、「書き込めない、追加できない、再起動で消える(エフェメラル)」というイミュータブルの三拍子が揃った環境では、Dwell Time(滞在時間)を極限まで引き下げられ、攻撃のサプライチェーンを完全に断ち切ることができる。

—

結びにかえて:パッチ当ての呪縛からの解放

セキュリティとは、「穴を塞ぎ続けること」ではない。「攻撃者が侵入したとしても、何もさせない、あるいは即座に無力化する構造(Architecture)を作る事」である。

Bottlerocketの読み取り専用ファイルシステムとカーネルパラメータの固定化は、私たちインフラエンジニアを、無限のパッチ適用と夜間対応という不毛な「パッチ当ての呪縛」から解放してくれる最高峰の防衛レイヤーだ。

もしあなたが、いまだにコンテナホストの上で汎用Linuxを動かし、iptablesのルール数に頭を悩ませているなら、それは時代遅れの防衛戦を戦っていると言わざるを得ない。今すぐインフラの根底からイミュータブルな思想を取り入れ、攻撃者に「攻略の余地を与えない」鉄壁の基盤を構築してほしい。

コメント

タイトルとURLをコピーしました