だぶるこんぱいる

What's eBPF?

eBPF(extended Berkeley Packet Filter)は、Linuxカーネル内で発生する特定のイベント(フックポイント)に対して、ユーザー定義のプログラムをアタッチして実行するための仕組み

用途

  • もともとネットワークパケットのフィルタリング用に開発されたBPFを拡張したシステム
  • 現在では、セキュリティ、トレーシング、監視、ネットワーク処理など、幅広い用途に活用される
  • Linux向けEDRにおいて、eBPFは極めて重要な技術であり、行動観測の中核を担っているが、センサー技術の一つに過ぎない
  • ツール

    ツール用途向いている人
    bccPythonで書かれたeBPFラッパー柔軟にカスタマイズしたい開発者
    bpftraceワンライナーでのトレースが可能簡単に使いたい監視・分析者
    CiliumKubernetes環境でのセキュアな通信制御コンテナ/クラウド環境のネットワーク担当者
    Falcoセキュリティイベント監視セキュリティ運用・EDR担当者

    プログラム実行の内部フロー

  • ユーザー空間でCやPythonのプログラムを書く
  • LLVMなどで「eBPFバイトコード」にコンパイル
  • システムコール(bpf())を使ってカーネル空間に「ロード」
  • カーネル空間のイベントに「アタッチ」して待機状態に
  • カーネル内で対象のイベントが発生すると eBPF が実行される!
  • 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プログラムを勝手にどこでも動かしていいよ」とは絶対にしません。

    代わりに:

  • 特定の 「ここなら安全にeBPFが実行できる」 というフックポイントだけが用意されていて、
  • ユーザーは その中から選んでアタッチ します。
  • 主なフックポイントの種類

    種類説明利用例
    kprobe / kretprobe任意のカーネル関数の入口・出口sys_execve の呼び出し監視
    tracepointカーネルにあらかじめ埋め込まれたトレースポイントsyscalls:sys_enter_openat
    XDPNIC直後、パケットを受け取った瞬間DDoS防御、パケットフィルタ
    tc(Traffic Control)カーネルネットワークスタックの途中帯域制御、QoS
    LSM(Linux Security Module)セキュリティアクセスの確認security_bprm_check
    cgroup hooksプロセス・ネットワークなどのcgroup操作コンテナのネットワーク制御

    素晴らしい参考文献:

  • https://github.com/zoidyzoidzoid/awesome-ebpf
  • https://github.com/bpftrace/bpftrace/