eBPF関連用語メモ (2018年秋のBPFまつり版)

79c2f7db29ee6df3e1ceb85c6a0126d3?s=47 Kazuo Moriwaka
November 05, 2018

eBPF関連用語メモ (2018年秋のBPFまつり版)

OSSセキュリティ技術の会 第四回勉強会 2018年秋のBPFまつり
https://secureoss-sig.connpass.com/event/103763/ でeBPFの紹介に使った資料です。

79c2f7db29ee6df3e1ceb85c6a0126d3?s=128

Kazuo Moriwaka

November 05, 2018
Tweet

Transcript

  1. 1 eBPF 関連用語メモ 森若和雄 2018-11-05 2018 年秋の BPF まつり版

  2. 2 このスライドの位置づけと注意 • 対象 : 「 eBPF という技術があるらしい。なんだろ う」と思っている人 •

    目的 : – eBPF はおおざっぱにどういうものか、関連するソフト ウェアにはどのようなものがあるかを整理する • 注意 – eBPF 関連ソフトウェアの一部は絶賛開発中。流行らな くて消えていっても泣かない。
  3. 3 agenda • BPF: Berkeley Packet Filter • eBPF: extended

    BPF • eBPF 関連のソフトウェア – bpftool – BCC, bcc-tools – XDP+eBPF, bpfilter • links
  4. 4 BPF: Berkeley Packet Filter • UNIX カーネルでネットワークのパ ケットフィルタを実装するに導入さ れた仕組み

    (1992 年 ) • ユーザランドのプログラムが必要に 応じてパケットを選別するためのプ ログラムを構成し、カーネルに渡す • カーネルはパケットをフィルタした 結果を返したり送ったりする BPF バイナリ アプリケー ション BPF バイナリ システムコールや デバイス経由で渡す 検証 実行 kernel 内 フック BPF JIT kernel
  5. 5 BPF の”プログラム”とは 任意のプログラムを渡せるようにすると悪さ (DoS 攻撃な ど ) ができるのでまずい。これを避けるために…… :

    • 実際のハードウェアから独立した小さな仕様の命令セット アーキテクチャ (ISA) を定義 • アプリケーションはこの ISA で作ったバイナリを渡す • カーネルは実行前にプログラムに問題がないか検証をお こなってから実行する
  6. 6 BPF 利用例 • tcpdump – “src ip 192.168.10.2” みたいなオプションをBPF

    に変換してカーネルに渡 す • dhcp client – IP などを構成前のインタフェースで適切なパケットだけ受信するためにフィル タリングするために利用 • libpcap – libpcap はBPF の処理系を独自に持っていてカーネルを利用できない場合 ( キャプチャ済みのファイルをフィルタしたい場合など ) にフィルタできるように している
  7. 7 BPF が あるとき ないとき アプリケー ション BPF で フィルタ

    パケット 受信 kernel 要りそうな パケットだけ処理 AF_PACKET アプリケー ション パケット 受信 kernel 全パケットを処理 AF_PACKET • アプリケーショ ンでは一部のパ ケットだけ扱い たい • BPF でフィルタ することで起床 回数が大きく変 わる • CPU 負荷に大き く影響する
  8. 8 eBPF: extended BPF • BPFの仮想マシン仕様を拡張 して高速化 • eBPF mapと呼ばれるメモリを

    扱える • kernel 内のヘルパー関数を呼 び出せるcall 命令(mapのデー タ構造処理など) • アプリケーションからmapを読 み書きできるので情報が渡せる • eBPFを仕込めるフックが増え た BPF バイナリ アプリケー ション BPF バイナリ システムコールや デバイス経由で渡す 検証 実行 kernel 内 フック BPF JIT ebpf-map kernel kernel 内 フック kernel 内 フック kernel 内 フック BPF 用関数
  9. 9 eBPF 大まかな仕様 • 64bit レジスタ r1 〜 r10 •

    stack 512 bytes • map 領域 ( 複数のデータ領域 ) 、 context(attach 先により異なる ) 、 stack へアクセス • call で kernel 内にあらかじめ用意さ れた関数呼び出し • 無条件 jump, if つきjump # bpftool prog dump x id 26 0: (bf) r6 = r1 1: (69) r7 = *(u16 *)(r6 +192) 2: (b4) (u32) r8 = (u32) 0 3: (55) if r7 != 0x8 goto pc+14 4: (bf) r1 = r6 5: (b4) (u32) r2 = (u32) 12 6: (bf) r3 = r10 7: (07) r3 += -4 8: (b4) (u32) r4 = (u32) 4 9: (85) call bpf_skb_load_bytes#6374400 10: (18) r1 = map[id:25] 12: (bf) r2 = r10 13: (07) r2 += -8 14: (62) *(u32 *)(r2 +0) = 32 15: (85) call trie_lookup_elem#83840 16: (15) if r0 == 0x0 goto pc+1 17: (44) (u32) r8 |= (u32) 2 18: (55) if r7 != 0xdd86 goto pc+14 19: (bf) r1 = r6 20: (b4) (u32) r2 = (u32) 8 21: (bf) r3 = r10 22: (07) r3 += -16 23: (b4) (u32) r4 = (u32) 16 24: (85) call bpf_skb_load_bytes#6374400 25: (18) r1 = map[id:26] 27: (bf) r2 = r10 28: (07) r2 += -20 29: (62) *(u32 *)(r2 +0) = 128
  10. 10 eBPF JIT コンパイラ • eBPF 命令を CPU の命令に 1

    to 1 で変換 – x86-64 、 ARM-64 、 s390 、 PowerPC 64 、 SPARC 64 、 MIPS 、 ARM32 – 未対応の場合または JIT が disable されている場合は インタプリタで実行
  11. 11 eBPF 、拡張されたらどう変わった ? • ざっくり 1.5 〜 4.0 倍くらいに高速化

    • ユースケースがフィルタ以外にも拡大 – パケットの加工 – seccomp でシステムコールをフィルタ – パフォーマンスモニタリング (kprobe, uprobe, tracepoint, perf_events, USDT) – XDP とくみあわせてプロトコル処理の前に drop/forward “Packet Filter” 以外もいろいろ やるぜ
  12. 12 eBPF 関連のソフトウェア • bpftool - 基本的な管理を行う • BCC -

    C 言語で eBPF のプログラムを書ける • bcc-tools - BCC を利用した主にパフォーマンスモニタリン グ関連のプログラム • bpfilter - eBPF を利用したネットワークフィルタリングの仕組 み • bpftables - bpfilter を利用したファイアウォール
  13. 13 bpftool • bpf の基本的な管理をするツール • カーネルに登録された bpf プログラムや map

    の表示 や管理をおこなう – bpftool prog list → bpf で登録されたプログラム一覧 – bpftool prog dump xlated id 35 → 35 番のプログラム表 示 – bpftool map dump id 35 → 35 番の map 表示
  14. 14 BCC: BPF Compiler Collection • パフォーマンスモニタリングにeBPF を使おう • eBPF

    でいろいろな仕組みをカーネルに差し込めるの便利 – でもアドホックにプログラムを書きたいので、機械語列を C 言語 マクロでゴリゴリ書くのは面倒…… • C 言語で書いてコンパイラで eBPF バイナリを吐けば楽 – LLVM でコンパイルしよう ( ターゲットアーキテクチャとして ebpf を を持つ ) • 言語バインディングもつくった (Python, lua) • サンプルスクリプトも大量に作った
  15. 15 BCC が ないとき (man 2 bcc より ) あるとき

    (bitesize より ) C 言語だ やったね ! マクロで バイナリ……
  16. 16 bcc-tools を使ってみる • 必要なパッケージ (bcc, bcc-tools, python3-bcc) – ※

    ディストリビューションによっては” bcc” という別のコンパイ ラと名前が競合するので bpfcc になっている • チュートリアル – https://github.com/iovisor/bcc/blob/master/docs/tutorial.md • example を見ながら bcc-tools のスクリプトを実行して みる /usr/share/bcc/tools/*
  17. 17 bcc-tools に同梱のスクリプト例 • trace – トレースポイントで条件を満たすとトレースメッセージを出力 する汎用スクリプト • opensnoop,

    biosnoop, syncsnoop, killsnoop – システムのどこかで open 等 を行うとメッセージを出力するスクリプト • pythonflow, javaflow, perlflow, rubyflow, phpflow – 各言語での call flow を出力するスクリプト • その他にもいろいろあります
  18. 18 実行例 $ sudo /usr/share/bcc/tools/opensnoop PID COMM FD ERR PATH

    8925 gnome-shell 23 0 /proc/self/stat 9206 gsd-housekeepin 11 0 /etc/fstab 9206 gsd-housekeepin 11 0 /proc/self/mountinfo $ sudo /usr/share/bcc/tools/execsnoop PCOMM PID PPID RET ARGS gio-launch-desk 9347 1 0 /usr/bin/gio-launch-desktop gnome-terminal gnome-terminal 9347 1 0 /usr/bin/gnome-terminal zsh 9355 6016 0 /bin/zsh grepconf.sh 9356 9355 0 /usr/libexec/grepconf.sh -c $ sudo /usr/share/bcc/tools/xfsslower Tracing XFS operations slower than 10 ms TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME 17:00:13 b'mozStorage # 12915 S 0 0 34.30 b'favicons.sqlite-wal 17:00:13 b'mozStorage # 12915 S 0 0 46.56 b'favicons.sqlite-wal システム全体の どこかで exec したらログ出力 システム全体の どこかで open したらログ出力 xfs で 10ms 以上 かかった操作を ログ出力
  19. 19 XDP + eBPF • 受信したパケット を eBPF でフィル タ

    & フォワード • eBPF バイナリの 実行を SmartNIC にオフロードする ことで広帯域に対 応 &CPU 負荷減少 https://www.iovisor.org/technology/xdp より
  20. 20 bpfilter • eBPF を利用してファイアウォールを実現するとき用 のプログラム • iptables のルールを読んで ebpf

    のプログラムを生成 →eBPF プログラム手書きしなくてもよくなる
  21. 21 注意点 • eBPF を単に BPF と呼んでいる文書も多数ある • kernel-devel 等を入れてヘッダファイルを提供する

    – 実行中のカーネルとバージョンをあわせる • probe を差し込むカーネル関数が将来も存在するとは限 らない • bcc-tool の Python 3 対応がまだイマイチなので、試して 何かあればバグレポートしよう
  22. 22 まとめ • eBPF は独自の仮想マシンを使ってユーザランドか ら安全なコードをカーネルに渡す仕組み • BPF はパケットフィルタのために登場したが eBPF

    はパフォーマンスモニタリングや seccomp などの用 途にも利用 • SmartNIC へのオフロードで標準的な仕組みでプロ グラム可能かつ広帯域に対応するフィルタリングへ の利用も期待
  23. 23 links • オリジナルのBPF: http://www.tcpdump.org/papers/bpf-usenix93.pdf • bpf(2): http://man7.org/linux/man-pages/man2/bpf.2.html • A

    thorough introduction to eBPF: https://lwn.net/Articles/740157/ • BCC: https://www.iovisor.org/technology/bcc • Why is the kernel community replacing iptables with BPF? https://cilium.io/blog/2018/04/17/why-is-the-kernel-community-replacing-iptables/ • BPF, eBPF, XDP and Bpfilter… What are These Things and What do They Mean for the Enterprise? https://www.netronome.com/blog/bpf-ebpf-xdp-and-bpfilter-what-are-these- things-and-what-do-they-mean-enterprise/