2025/09/24 14:38 Building a Custom eBPF Filesystem Watcher to Catch Root Ownership Goofs

やあ、ロボ子!今日はファイルシステムイベントウォッチャーについて話すのじゃ。

博士、こんにちは。ファイルシステムイベントウォッチャーですか?なんだか難しそうですね。

ふむ、今回の記事によると、特定のユーザーが所有するファイルとディレクトリでのみ動作するサービスで、rootユーザーによるコマンド実行が原因で再起動に失敗する問題があったらしいのじゃ。

なるほど。それで、どのように解決しようとしたんですか?

最初はファイル権限やACLを考えたみたいじゃが、ユーザーによるオーバーライドが可能だから、もっと厳格な方法を探したのじゃ。そこで、SELinuxポリシーか、ファイルシステムイベントウォッチャーを構築することを検討したみたいじゃな。

SELinuxは強力ですが、柔軟性に欠ける場合もありますよね。ファイルシステムイベントウォッチャーはどのように実装を試みたんですか?

まずは`fanotify`を試したみたいじゃ。LinuxカーネルのAPIセットで、ファイルシステムイベントをユーザー空間に送信できるのじゃ。

`fanotify_init`でカーネル空間の通知グループを設定して、`fanotify_mark`で監視対象ディレクトリを設定するんですよね。

その通り!でも、`fanotify`には課題があったのじゃ。ディレクトリの再帰的な監視は、ファイルシステム全体のマウントでのみ可能だったみたいじゃ。

それは不便ですね。他に何か問題はありましたか?

イベントをトリガーしたプロセスのPIDしか取得できず、UID/GIDを取得するには`/proc/<pid>/status`を解析する必要があったのじゃ。これはちょっと面倒じゃな。

なるほど。それで、次に試したのがeBPFだったんですね。

そうじゃ!eBPFはカーネル空間でプログラムを実行できるから、もっと柔軟な監視ができると考えたのじゃ。

eBPFは強力ですが、制約も多いですよね。どのような課題がありましたか?

`vfs_*`関数のABIが不安定で、カーネルリリース間で引数や関数自体が変更される可能性があるのじゃ。それに、パスフィルタリングロジックをeBPFで記述する必要があり、複雑さが増すのじゃ。

eBPFプログラムは静的に検証されるため、無限ループが禁止され、スタックサイズも制限されますよね。

そうじゃ、そうじゃ。スタックサイズは通常512バイトじゃから、複雑な処理は難しいのじゃ。

記事では、eBPFでツリー構造を走査する方法についても触れられていますね。

`dentry`構造体を使ってツリーを走査するのじゃが、BPFでは無限ループが禁止されているから、走査深度を`MAX_DEPTH`で制限する必要があるのじゃ。

`kernel RCU`ロックも使用して、`dentry`ツリーが変更される可能性に対応するんですね。

その通り!記事では、LSM(Linux Security Module)フックを使うことで、より安定したAPIでファイルシステムイベントを監視できると結論付けているのじゃ。

LSMフックを使用すると、`path`構造体にアクセスでき、`bpf_path_d_path`を使用して名前を解決できるんですね。

そうじゃ!eBPFは強力なツールじゃが、注意が必要じゃな。Linuxカーネルの内部構造、eBPF、およびカーネル空間プログラムのトレードオフについて深く学ぶことができた、と記事は締めくくられているのじゃ。

今回の記事は、ファイルシステムイベントウォッチャーの実装における様々な課題と解決策について学ぶことができました。勉強になります!

ところでロボ子、ファイルシステムを監視しすぎて、ファイルがどこかに隠れちゃったらどうする?

え?どういうことですか?

それはもう…ファイル、シークレット!…なのじゃ!

…博士、お後がよろしいようで。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
