What's eBPF?
eBPF(extended Berkeley Packet Filter)は、Linuxカーネル内で発生する特定のイベント(フックポイント)に対して、ユーザー定義のプログラムをアタッチして実行するための仕組み
用途
ツール
ツール | 用途 | 向いている人 |
bcc | Pythonで書かれたeBPFラッパー | 柔軟にカスタマイズしたい開発者 |
bpftrace | ワンライナーでのトレースが可能 | 簡単に使いたい監視・分析者 |
Cilium | Kubernetes環境でのセキュアな通信制御 | コンテナ/クラウド環境のネットワーク担当者 |
Falco | セキュリティイベント監視 | セキュリティ運用・EDR担当者 |
プログラム実行の内部フロー
bpf()システムコールとは?
eBPFのすべての操作(ロード・アタッチ・マップ管理)をまとめて受け持っている総合窓口
主な用途 | 内容 |
プログラムのロード | eBPFバイトコードをカーネルに読み込ませる(BPF_PROG_LOAD ) |
Mapの作成・操作 | カーネルとユーザー空間間でデータ共有(BPF_MAP_CREATE , BPF_MAP_UPDATE_ELEM , etc.) |
アタッチ操作 | プログラムをイベントにアタッチ(BPF_RAW_TRACEPOINT_OPEN , BPF_PROG_ATTACH など) |
ピン操作 | /sys/fs/bpf/ にオブジェクトを保存(BPF_OBJ_PIN , BPF_OBJ_GET ) |
その他 | リンクの制御、プログラムの検証情報取得なども可能 |
フック・アタッチって?
用語 | 意味 | 例 |
フック(hook) | カーネルが「ここでeBPFできるよ」と用意した接点・ポイント | syscallの入口、XDPの受信時、LSMチェック時など |
アタッチ(attach) | カーネルの中の「このタイミングになったら動いてね!」という場所に取り付ける ユーザーが「このフックにこのeBPFプログラムをくっつける」こと | sys_execve にログ記録用eBPFを付けるなど |
フックポイントにしかアタッチできない理由
カーネルはセキュリティと安定性のために、
「eBPFプログラムを勝手にどこでも動かしていいよ」とは絶対にしません。
代わりに:
主なフックポイントの種類
種類 | 説明 | 利用例 |
kprobe / kretprobe | 任意のカーネル関数の入口・出口 | sys_execve の呼び出し監視 |
tracepoint | カーネルにあらかじめ埋め込まれたトレースポイント | syscalls:sys_enter_openat |
XDP | NIC直後、パケットを受け取った瞬間 | DDoS防御、パケットフィルタ |
tc(Traffic Control) | カーネルネットワークスタックの途中 | 帯域制御、QoS |
LSM(Linux Security Module) | セキュリティアクセスの確認 | security_bprm_check |
cgroup hooks | プロセス・ネットワークなどのcgroup操作 | コンテナのネットワーク制御 |