キーワードで検索

今日を知り、明日を変えるシステム運用メディア

bcc/bpftraceで書く、初めてのeBPFプログラム|Hello, Kernel World!

bcc/bpftraceで書く、初めてのeBPFプログラム|Hello, Kernel World!

日々のシステム運用業務において、「もっと手軽に、そして深くシステムの動きを把握したい」と感じることはありませんか?

カーネルの再コンパイルやモジュールのロードといった煩雑な手順なしに、システムの挙動をリアルタイムで観測し、分析できたら、運用はどれだけ効率的になるでしょうか。

この記事では、そのような課題を解決する革新的な技術「eBPF」について、実際に手を動かしながら学べるチュートリアルをご紹介します!

この記事を読み終える頃には、eBPFの強力なフロントエンドであるbccbpftraceを使いこなし、「特定のファイルが開かれたことを通知する」「新しいプロセスが生成された瞬間を捉える」といった、実践的なプログラムを自分の手で書けるようになるはずです。ぜひご覧下さい!

eBPFとは

eBPF(extended Berkeley Packet Filter)とは、Linuxカーネル内でサンドボックス化されたプログラムを実行可能にする技術です。 

 これにより、OSのコア部分に手を加えることなく、ネットワーキング、セキュリティ、そしてオブザーバビリティ(可観測性)を飛躍的に向上させることができます。

eBPFの心強い味方、bccとbpftrace!

eBPFのプログラムは本来、特定のバイトコードで記述する必要があり、習得には相当な労力を要します。 

 しかし、bccbpftraceといった高レベルなフレームワークの登場により、私たちはもっと身近な言語でeBPFの力を引き出すことができるようになりました。

フレームワーク詳細
bcc (BPF Compiler Collection)PythonやLuaといった汎用言語を使い、eBPFプログラムを作成・制御するためのツールキットです。  複雑なロジックやデータ処理を含む、より高度なトレーシングツールを開発するのに適しています。
bpftraceDTraceやAwkに影響を受けた専用のスクリプト言語で、特にワンライナー(1行の短いコマンド)でのアドホックな分析を得意とします。   「今すぐ、この関数の呼び出し回数が知りたい」といった場面で絶大な威力を発揮します。

このチュートリアルでは、これら2つのツールを使い、それぞれの特徴を活かしたeBPFプログラムを作成していきます。

【ハンズオン1】bccとPythonで新規プロセス生成をトレースする

最初のステップとして、bccのPythonラッパーを使い、システム上で新しいプロセスが生成されるたびにその情報を出力するプログラムを作成してみましょう。

これは、意図しないプロセスの起動を監視するなど、セキュリティやリソース管理の第一歩となる実践的な例です。

環境準備

まず、bccをインストールする必要があります。bccのGitHubリポジトリには、各種ディストリビューション向けの詳細なインストール手順が記載されています。 

 Ubuntuを例にとると、以下のコマンドで必要なパッケージを導入できます。

bash

sudo apt-get update
sudo apt-get install -y bpfcc-tools linux-headers-$(uname -r)

“Hello, New Process!” プログラム

以下のPythonスクリプトを作成し、new_process_tracer.pyとして保存してください。

python

from bcc import BPF

# 1. eBPFプログラムをC言語で記述
bpf_program = """
int kprobe__sys_clone(void *ctx) {
    bpf_trace_printk("New process created!\\n");
    return 0;
}
"""

# 2. BPFオブジェクトを初期化
b = BPF(text=bpf_program)

# 3. トレース結果を読み取って出力
print("Tracing new process creation... Ctrl+C to end.")
b.trace_print()

コード解説

eBPFプログラム

C言語の文字列としてeBPFのロジックを記述します。

kprobe__sys_cloneという関数名が重要です。kprobe__という接頭辞は、カーネル関数sys_clone(プロセスの生成を担うシステムコール)の実行開始時にこの関数をフックすることをbccに伝えます。bpf_trace_printkは、カーネルのトレース用バッファにメッセージを書き込むためのヘルパー関数です。

BPFオブジェクトの初期化

BPF(text=bpf_program)という一行で、bccはC言語のコードをeBPFバイトコードにコンパイルし、検証を経てカーネルにロードするまでの一連の処理を自動的に行ってくれます。 

トレース結果の出力

b.trace_print()は、bpf_trace_printkによって書き込まれたメッセージを継続的に読み込み、標準出力に表示する便利な関数です。

実行してみる

管理者権限でこのスクリプトを実行します。

bash

sudo python3 new_process_tracer.py

別のターミナルを開いてlsdateといった任意のコマンドを実行してみてください。元のターミナルに「New process created!」というメッセージがリアルタイムで表示されるはずです。

これで、あなたはカーネルのイベントを捉える最初のeBPFプログラムを動かすことができました。 

【ハンズオン2】bpftraceでファイルオープンを監視する

次に、bpftraceを使い、より手軽にシステムの挙動を観察してみましょう。ここでは、/etc/passwdファイルが開かれた際に、どのプロセスがそれを行ったかを表示するワンライナーを作成します。これは、重要な設定ファイルへのアクセスを監視するセキュリティ監査の基本です。

環境準備

bpftracebccと同様にパッケージマネージャからインストールできます。

bash

sudo apt-get install -y bpftrace

ファイルオープンを監視するワンライナー

以下のコマンドをターミナルで直接実行してください。

bash

sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /strcmp(args->filename, "/etc/passwd") == 0/ { printf("Process %s opened /etc/passwd\\n", comm); }'

コマンド解説

このワンライナーは3つの部分から構成されています。 

構成要素記述説明
プローブtracepoint:syscalls:sys_enter_openatプログラムをフックするイベントを指定します。ここではopenatシステムコールの開始を示す静的トレースポイントを使っています。 
フィルター/strcmp(args->filename, "/etc/passwd") == 0/プローブが発火した際に、後続のアクションを実行するかどうかを判断する条件式です。openatシステムコールの引数であるファイル名(args->filename)が/etc/passwdと一致する場合のみ真となります。
アクション{ printf("Process %s opened /etc/passwd\\n", comm); }フィルター条件が満たされたときに実行される処理です。コマンド名(comm)をメッセージと共に出力します。

実行してみる

このコマンドを実行した状態で、別のターミナルからcat /etc/passwdless /etc/passwdなどを実行すると、コマンドを実行したプロセス名(catless)がリアルタイムで表示されることが確認できます。 

 このように、bpftraceを使えば、複雑なコンパイル手順なしに、アイデアを即座に試すことが可能です。

まとめ

この記事では、eBPFの世界への第一歩として、bccbpftraceという2つの強力なツールを使ったハンズオンチュートリアルを紹介しました。

  • bccPythonを使い、新規プロセス生成をトレースするプログラムを作成しました。
  • bpftraceを使い、特定のファイルへのアクセスを監視するワンライナーを実行しました。

これで、カーネルのイベントをフックし、システムの深層で何が起きているかを可視化する基本的なスキルが学習できました。これは、日々の運用業務におけるパフォーマンス分析、トラブルシューティング、セキュリティ監視の質を大きく向上させる力となります。 

今日作成したプログラムを拡張して、より詳細な情報(例えば、プロセスIDや実行ユーザーなど)を取得してみるのも良いでしょう。あるいは、bpftraceのGitHubリポジトリにある豊富なワンライナーやツール例を探求し、あなたの課題解決に役立つものがないか探してみるのも面白いかもしれません。 

この記事が参考になれば幸いです!

24時間365日のシステム運用監視サービス「JIG-SAW OPS」を提供する、JIG-SAW株式会社のOps Today編集部です。 サーバー運用監視実績50,000台の実績をもとに、システム運用監視に役立つ情報をお届けします!

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録