こんにちは。サイバーエージェントの青山真也
弊社のインフラ組織 CIU
第1回目は、2022年初の新春企画で取り上げたeBPF関連のプロダクトでもあるTetragonについて紹介します。
eBPFとは?
eBPFは、カーネルのソースコードの変更なしに任意のプログラムをカーネルに組み込み、カーネル空間で任意の処理を実行するための仕組みです。CNCFのプロジェクトでは、Cilium・
また、eBPFプログラムをKubernetesノードに組み込む形をとることで、そのノード上のすべてのコンテナに対して様々な制御を行えるほか、アプリケーションやマニフェストの変更・
Tetragonとは?
TetragonはCilium Projectで作られているOSSで、
参考情報:eBPF自体の詳細についてはゆううきさんのブログが参考になります。
Tetragonでは、プロセス実行・
また、Tetragonは2022年5月に公開されたOSSですが、数年前からIsovalent Cilium Enterpriseの機能として提供されており、すでに一定の実績があります。Tetragonの開発を主導しているIsovalent社は、Tetragon以外にもCNI
The Four Golden Signals of Security Observbability
少しセキュリティに関する可観測性自体について振り返ってみましょう。
Isovalent社が発行している
- プロセス実行
- ネットワークソケット
(TCP・ UDP・ Unix) - ファイルアクセス
- L7ネットワークアイデンティティ
これらのシグナルを適切に記録しておくことで、侵害の検出・
Tetragonのポリシー設定とeBPF
Tetragonのデフォルト動作ではプロセス実行のシグナルを記録するようになっています。それ以外のシグナルに関しては、TracingPolicy CustomResorceで挙動を設定します。TracingPolicy CustomResourceには大きく分けて
- kprobe
- 任意の関数・
システムコールに対してフックポイントを設定し検知するための設定 - tracepoints
- Linux カーネルに予め定義されたフックポイントで検知するための設定
参考情報:kprobes/
例えば、TCP接続を検知するためのTracingPolicyはkprobeを用いて以下のように記述します。これにより、tcp_args
フィールドで指定します。例えば、tcp_
関数のシグネチャはint tcp_
」sk
とsize
の情報を記録するようにしています。
# https://raw.githubusercontent.com/cilium/tetragon/main/crds/examples/tcp-connect.yaml
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: "connect"
spec:
kprobes:
- call: "tcp_connect"
syscall: false
args:
- index: 0
type: "sock"
- call: "tcp_close"
syscall: false
args:
- index: 0
type: "sock"
- call: "tcp_sendmsg"
syscall: false
args:
- index: 0
type: "sock"
- index: 2
type: int
こうしたポリシーが定義されたKubernetesクラスタ上で、コンテナからcurl
」tcp_
関数が実行されたタイミングでイベントをログから確認することができます。イベント情報には、Kubernetes関連のメタデータや、事前に定義したargsのsocket情報とsizeも記録されています。
同様にファイルアクセスなどに対しても、特定の関数に対するポリシーを設定することで記録できます。ファイルI/
なお、公式ブログによると、これらのポリシーは
Tetragonのイベント情報と外部連携
上記の例のように、Tetragonにおいては検知したイベントは構造化されたデータとして出力されます。大きく分けて4種類に分類されています。現時点ではドキュメントなどを見る限りはログとして集約するという形を想定しているようです。
- process_
exec / process_exit : プロセスが実行 / 終了された際のイベント情報 - process_
kprobe : プロセスがカーネル関数を呼び出した際のイベント情報 - process_
tracepoint : プロセスがカーネルのtracepointに到達した際のイベント情報
Tetragonはノードごとに起動しているAgent単位にイベントを生成・
現在Tetragonでエクスポートされているメトリクスは、Tetragon内部で使われているリングバッファの状況・
また、これらのログを人が読みやすいように整形するツールとしてtetragon CLIが提供されています。tetragon CLIを使うと特定のNamespaceやPodのみにするフィルタリングも可能です。
$ cat output.log | tetragon observe - 🚀 process default/xwing /usr/bin/curl http://cilium.io 📬 open default/xwing /usr/bin/curl /etc/ssl/openssl.cnf 📪 close default/xwing /usr/bin/curl 📬 open default/xwing /usr/bin/curl /etc/hosts 📪 close default/xwing /usr/bin/curl 📬 open default/xwing /usr/bin/curl /etc/resolv.conf 📪 close default/xwing /usr/bin/curl 🔧 tcp_connect default/xwing /usr/bin/curl 10.4.2.8:20117 -> 104.198.14.52:80 ⁉️ syscall default/xwing /usr/bin/curl tcp_sendmsg ⁉️ syscall default/xwing /usr/bin/curl tcp_close 💥 exit default/xwing /usr/bin/curl http://cilium.io 0
リアルタイムの実行時制御(Enforcement)
TetragonではTracingPolicyのactionにSigkillが指定されている場合、定義されたポリシーに合致した場合にそのプロセスを停止する実行時制御
プロセスを停止させる際はロードされたeBPFプログラムからsend_
こうした挙動を実現するために、TetragonではTracingPolicyをもとにルールごとにeBPFプログラムを生成し、cilium/
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: sigkill-test
spec:
kprobes:
- call: "fd_install"
syscall: false
selectors:
matchActions:
- action: Sigkill
…
類似プロダクト - Falco / Tracee
最後に同等のことを実現する手法と、類似プロダクトについて紹介します。
eBPFを利用した手法以外には、アプリケーション側に特定のライブラリを組み込んだり、ptraceを利用したり、seccomp/
Tetragonと類似したeBPFを利用してセキュリティの可観測性を実現するプロダクトは、他にも
FalcoはもともとはSysdigが開発したプロダクトでしたが、現在はeBPF ProbeやライブラリなどのコアコンポーネントがCNCFに寄贈されています。Falcoはカーネルモジュールを利用してイベントを収集していましたが、カーネルへの安定性などの理由からeBPF Probe版が作られました。Falcoはプリセットのルールセットが提供されている点が良い点で、商用版のSysdig Secureだとより多くのポリシーが提供されていそうです。
TraceeはAqua Securityが開発しているプロダクトで、同様にeBPF Probeを利用してイベント情報を収集しています。
まとめ
Tetragonの強みは、リアルタイムの実行時制御
他にも、Cilium v1.
Cilium Projectでは、それぞれCilium・