入門 eBPF

―Linuxカーネルの可視化と機能拡張

[cover photo]
TOPICS
Linux
発行年月日
PRINT LENGTH
228
ISBN
978-4-8144-0056-0
原書
Learning eBPF
FORMAT
Print PDF EPUB
Ebook
3,300円
Ebookを購入する
Print
3,300円

eBPFは、ネットワーク、セキュリティ、オブザーバビリティなど、さまざまなインフラ関連の分野のプラットフォームとして利用が広がりつつある、近年最も注目されている技術の1つです。本書ではカーネルの機能を拡張する方法として注目度の高いeBPFについて、どんな技術であるか、何ができるかを概観することができます。基本的なeBPFプログラムの書き方を紹介するとともに、仕組みも理解できるようになっています。

目次

訳者まえがき 
まえがき

1章 eBPFとは何か? なぜ、重要なのか? 
    1.1 eBPFのルーツ:Berkeley Packet Filter
    1.2 BPFからeBPFへ 
    1.3 本番環境に向けてのeBPFの進化 
    1.4 名前付けは難しい 
    1.5 Linuxカーネル 
    1.6 カーネルへの新機能の追加
    1.7 カーネルモジュール
    1.8 eBPFプログラムの動的ロード 
    1.9 高性能なeBPFプログラム 
    1.10 クラウドネイティブな環境におけるeBPF
    1.11 まとめ

2章 eBPFの「Hello World」 
    2.1 BCCの「Hello World」
    2.2 「Hello World」の実行 
    2.3 BPF Map
        2.3.1 ハッシュテーブルMap
        2.3.2 PerfリングバッファMap
        2.3.3 関数呼び出し 
        2.3.4 Tail Call
    2.4 まとめ 
    2.5 演習 

3章 eBPFプログラムの仕組み
    3.1 eBPF仮想マシン 
        3.1.1 eBPFレジスタ 
        3.1.2 eBPF命令 
    3.2 ネットワークインタフェース用のeBPF「Hello World」
    3.3 eBPFオブジェクトファイルのコンパイル 
    3.4 eBPFオブジェクトファイルを確認する 
    3.5 カーネルへのプログラムのロード 
    3.6 ロードしたプログラムの確認 
        3.6.1 BPFプログラムのタグ 
        3.6.2 翻訳後のeBPFバイトコード 
        3.6.3 JITコンパイルされた機械語 
    3.7 イベントへのアタッチ 
    3.8 グローバル変数 
    3.9 プログラムのデタッチ 
    3.10 プログラムのアンロード 
    3.11 BPF to BPF Call
    3.12 まとめ
    3.13 演習 

4章 bpf()システムコール 
    4.1 BTFのデータのロード
    4.2 Mapの作成 
    4.3 プログラムのロード
    4.4 Mapをユーザ空間から操作する 
    4.5 BPFプログラムとMapへの参照
        4.5.1 ピン留め(ピンニング)
        4.5.2 BPF Link
    4.6 eBPFに関係する他のシステムコール 
        4.6.1 Perfリングバッファの初期化 
        4.6.2 kprobeイベントへのアタッチ 
        4.6.3 Perfイベントの設定と読み出し 
    4.7 BPFリングバッファ 
    4.8 Mapからの情報の読み出し 
        4.8.1 Mapの検索 
        4.8.2 Mapの要素の読み出し 
    4.9 まとめ 
    4.10 演習 

5章 CO-RE、BTF、libbpf 
    5.1 移植性に対するBCCのアプローチ 
    5.2 CO-REの概要 
    5.3 BTF(BPF Type Format)
        5.3.1 BTFのユースケース 
        5.3.2 bpftoolを使用してBTF情報をリストアップ 
        5.3.3 BTFにおける型情報 
        5.3.4 BTF情報を含むMap
        5.3.5 関数と関数プロトタイプのBTF情報 
        5.3.6 MapとプログラムのBTFデータを調査する 
    5.4 カーネルヘッダファイルの生成 
    5.5 CO-RE eBPFプログラム 
        5.5.1 ヘッダファイル
        5.5.2 Mapの定義 
        5.5.3 eBPFプログラムのセクション
        5.5.4 CO-REを用いたメモリアクセス
        5.5.5 ライセンス定義 
    5.6 CO-REのためのeBPFプログラムのコンパイル 
        5.6.1 デバッグ情報 
        5.6.2 最適化 
        5.6.3 ターゲットアーキテクチャ 
        5.6.4 Makefile
        5.6.5 オブジェクトファイル内のBTF情報 
    5.7 BPFの再配置 
    5.8 CO-REユーザ空間コード 
    5.9 ユーザ空間のlibbpfライブラリ
        5.9.1 BPFスケルトン 
        5.9.2 libbpfサンプルコード 
    5.10 まとめ
    5.11 演習 

6章 eBPF検証器 
    6.1 検証プロセス 
    6.2 検証器のログ 
    6.3 コントロールフローの可視化 
    6.4 ヘルパ関数の検証 
    6.5 ヘルパ関数の引数 
    6.6 ライセンスの確認 
    6.7 メモリアクセスの確認 
    6.8 ポインタの参照をたどる前の確認 
    6.9 コンテクストへのアクセス
    6.10 実行完了の保証 
    6.11 ループ 
    6.12 戻り値の確認 
    6.13 不正な命令コード 
    6.14 到達不可能な命令 
    6.15 まとめ
    6.16 演習 

7章 eBPFのプログラムとアタッチメントタイプ 
    7.1 プログラムのコンテクスト引数 
    7.2 ヘルパ関数とその戻り値 
    7.3 Kfuncs
    7.4 トレーシング 
        7.4.1 kprobeとkretprobe
        7.4.2 fentry/fexit
        7.4.3 Tracepoint
        7.4.4 BTFが有効なTracepoint
        7.4.5 ユーザ空間へのアタッチ 
        7.4.6 LSM
    7.5 ネットワーク
        7.5.1 ソケット
        7.5.2 トラフィックコントロール(TC)
        7.5.3 XDP
        7.5.4 フローディセクタ 
        7.5.5 軽量トンネリング 
        7.5.6 cgroup
        7.5.7 赤外線コントローラ 
    7.6 BPFアタッチメントタイプ 
    7.7 まとめ 
    7.8 演習 

8章 ネットワーク用eBPF 
    8.1 パケットのドロップ
        8.1.1 XDPプログラムの戻り値
        8.1.2 XDPでのパケットのパース 
    8.2 ロードバランサーとパケットの転送 
    8.3 XDPオフローディング 
    8.4 トラフィックコントロール
    8.5 パケットの暗号化と復号 
        8.5.1 ユーザ空間のSSLライブラリ
    8.6 eBPFとKubernetesネットワーク 
        8.6.1 iptablesの回避 
        8.6.2 ネットワークプログラム同士の連携 
        8.6.3 ネットワークポリシーの強制 
        8.6.4 コネクションの暗号化
    8.7 まとめ 
    8.8 演習と参考資料 

9章 セキュリティ用eBPF
    9.1 セキュリティの可観測性に必要なポリシーとコンテクスト
    9.2 セキュリティイベント用のシステムコールの使用 
        9.2.1 seccomp
        9.2.2 seccompプロファイルの自動生成 
        9.2.3 システムコール追跡ベースのセキュリティツール 
    9.3 BPF LSM
    9.4 Cilium Tetragon
        9.4.1 カーネルの関数へのアタッチ 
        9.4.2 予防的セキュリティ 
    9.5 ネットワークセキュリティ
    9.6 まとめ 

10章 プログラミングeBPF 
    10.1 bpftrace
    10.2 カーネル向けeBPFのための言語の選択肢
    10.3 BCC Python/Lua/C++
    10.4 C言語とlibbpf
    10.5 Go言語 
        10.5.1 gobpf
        10.5.2 ebpf-go
        10.5.3 libbpfgo
    10.6 Rust
        10.6.1 libbpf-rs
        10.6.2 Redbpf
        10.6.3 Aya
        10.6.4 Rust-bcc
    10.7 BPFプログラムのテストとデバッグ 
    10.8 複数のeBPFプログラム 
    10.9 まとめ
    10.10 演習 

11章 eBPFの将来の進化 
    11.1 eBPF財団 
    11.2 Windows用のeBPF
    11.3 Linux eBPFの進化 
    11.4 eBPFはプラットフォームであり、機能ではない 
    11.5 結論 

索引