ノート:
- このチュートリアルではOracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructure資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了する場合は、これらの値をクラウド環境に固有の値に置き換えてください。
TetragonのインストールおよびOracle Container Engine for KubernetesでのTracingPoliciesの構成
イントロダクション
このチュートリアルでは、eBPFベースのツールがクラウド・ネイティブ・アプリケーションにより広く利用されるようになるため、Oracle Cloud Infrastructure (OCI)でのセキュリティの可観測性と適用のためのeBPFベースのツールであるTetragonを実行する方法について説明します。
eBPFとは何ですか?なぜ人気があるのですか?
オペレーティング・システム・カーネルは、通常、システムを監視および影響を与える最適な場所です。機能を実行するツールと、監視および影響を与えるアクティビティの間に障壁がほとんどないためです。カーネル領域内で実行すると、多くの場合、プログラムのオーバーヘッドは非常に低くなりますが、セキュリティと保守のコストがかかります。
eBPFは、カーネルソースコードを変更したりカーネルモジュールをロードしたりすることなく、サンドボックスおよび特権コンテキストで実行できる新しい機能を導入する方法を提供します。基本的に、仮想マシンベースのプログラミング言語と同様のパラダイムを作成することによって機能します。最新の Javaプログラムが、JVM (Java Virtual Machine)がJITコンパイラを使用してネイティブコードにコンパイルし、ネイティブパフォーマンスを取得する方法に似た方法で、eBPFプログラムはバイトコード表現を使用します。BPFは Linuxカーネルに深く関連付けられており、カーネル内JITコンパイラはeBPFバイトコードをカーネル領域で実行できるネイティブコードにコンパイルします。
eBPFはイベントベースのモデルを使用してプログラムをロードし、eBPFプログラムはネットワークイベントやシステムコールなどに「フック」で書き込まれます。eBPFプログラムがフックするイベントが呼び出されると、eBPFプログラムが検証およびJITコンパイル後にカーネルにロードされます。検証ステップにより、プログラムの実行が安全であり、適切な権限を持ち、完了まで実行できるが、JITコンパイルによってネイティブのパフォーマンスが保証されます。多くの場合、eBPFプログラムは上位レベルの言語で記述され、バイトコード表現にコンパイルされます。これらは、プログラムがフックされるイベントに基づいて、JITコンパイル後に実行中のカーネルにロードされます。
テトラゴン- eBPFベースのセキュリティー可観測性と強制
Tetragonは、セキュリティーの可観測性と適用を実行する、クラウドネイティブのeBPFベースのツールです。シリウムプロジェクトのコンポーネントです。eBPFを使用すると、Tetragonはカーネルの外部で実行されているエージェントにイベントを送信することなく、イベントをフィルタおよび監視し、リアルタイムでポリシーを適用できます。Tetragonは、ネットワーク接続のオープン、ファイルへのアクセス、コンテナ内のプロセスの開始などのイベントをフィルタリングすることで、多数のセキュリティおよび可観測性ユースケースに対処できます。たとえば、アプリケーション・コンテナ内で起動されているシェル・プロセスは、セキュリティ・イベントとみなすことができます。問題のトラブルシューティングを試みている人がいるか、悪意のあるアクティビティーである可能性があり、いずれの場合も、システムへの攻撃を除外するためにセキュリティーチェックをトリガーする必要があります。開いているネットワーク接続やファイルの読取りについても同じことが言えます。Tetragonは、オーバーヘッドをほとんどまたはまったく発生させずに、これらのイベントをソフトウェアで検出できる最も早い段階で、これらのアクティビティをトレースおよびフィルタできます。
TetragonはKubernetesワークロードに最適で、クラスタの各ノードでdaemonsetとして実行されます。その後、TetragonはKubernetes APIサーバーからメタデータをプルし、そのメタデータを各ノードのカーネル内で観測されたイベントに関連付けることができます。Tetragonを使用すると、TracingPoliciesを使用して、これらのアクティビティのリアルタイム・フィルタを簡単に設定できます。TracingPolicyはTetragonによって作成されたカスタム・リソースで、管理者およびDevSecOpsはカーネル・イベントのフィルタをKubernetesリソースとして作成およびデプロイできます。TracingPolicyは、システム・コール、プロセス属性および引数を照合し、一致に対するアクションをトリガーできます。
目標
- OCIでOKEクラスタにTetragonを設定する方法について学習します。
- TracingPoliciesを使用してイベントを監視およびコレートする方法について学習します。
前提条件
- Oracle Cloudアカウントにサインアップまたはサインインします。
-
OKEクラスタの作成
ノート: Tetragonは、Tetragonプロジェクトによって公開されたhelmチャートを使用して、Oracle Container Engine for Kubernetes (OKE)などのKubernetesクラスタにデプロイできます。インストールすると、TracingPolicy CRDが作成され、Tetragonはクラスタ・ノードで
daemonsetとして実行されます。
Oracle Linuxの前提条件
OKEはOracle Linuxを使用し、TetragonはカーネルでのBTF (BPFタイプ・フォーマット)のサポートに依存します。最近のOracle Linuxカーネルには、この即時利用可能なカーネルが含まれているため、ユーザーは5.4.17-2136.305.3.el7uek以上のカーネルを使用する必要があります。また、TetragonはArm (linux/arm64)アーキテクチャのサポートを提供せず、記述時にx86 (linux/amd64)サポートのみを提供します。OKEクラスタにアーム・ノードがある場合、デーモン・セットはInit:CrashLoopBackOffステータスのままになります。
ノート: OKEノード・イメージの最新バージョンは、BTFサポートを含むカーネルに基づいています。BTFサポートのこの注意事項は、ノードOSがしばらく更新されておらず、新しく作成されたクラスタではないクラスタにのみ適用されます。不明な場合、BTFサポートがあるかどうかを確認する最善の方法は、ノードにSSHで接続して
ls /sys/kernel/BTFを実行することです。ここにリストされているモジュールとカーネル(vmlinux)が表示されます。一般的なノートとして、このデプロイメントにはOracle Linux 8ベースのノードをお薦めします。
ノードが実行されているカーネルのバージョンを確認するには、ノードでuname -aを実行します。古いバージョンのカーネルを実行している場合は、ノード・プール構成でバージョンをアップグレードできます。ただし、これは新しく作成されたノードにのみ影響し、既存のノードは自動的にアップグレードされないため、ワークロードで実行される可能性のある継続性が確保されます。ノード・プールのアップグレード・プロセスに従って、既存のノードを新しいカーネル・バージョンにすることができます。
-
ノード上の最新バージョンのカーネルで実行していることを確認したら、Tetragonヘルム・チャートを使用してTetragonのインストールを開始できます。Tetragonのgithubページからも指示に従ってください。
helm repo add cilium https://helm.cilium.io helm repo update helm install tetragon cilium/tetragon -n kube-system kubectl rollout status -n kube-system ds/tetragon -w -
デーモン・セットの準備ができて、テトラゴン・ポッドが「実行中」状態になると、ノード上のイベントのリスニングを開始できます。即時利用可能なため、プロセスの実行を監視できます。Tetragonは一致するイベントをJSON形式で発行し、ログは次のコマンドで確認できます(
jqがインストールされている場合)kubectl logs -n kube-system -l app.kubernetes.io/name=tetragon -c export-stdout -f | jq -
クラスタで発生しているアクティビティに応じて、これらのイベントを表すJSONオブジェクトのストリームが表示されます。次のコード・スニペットは、gitリポジトリをクローニングしていたArgoCDを実行していたクラスタからの出力例です。
{ "process_exec": { "process": { "exec_id": "MTAuMC4xMC4yMTg6OTE0MTQ2NjAzODU0MDcwOjEwNDA4Ng==", "pid": 104086, "uid": 999, "cwd": "/tmp/_argocd-repo/83c509d8-f9ba-48c3-a217-a9278134963e/", "binary": "/usr/bin/git", "arguments": "rev-parse HEAD", "flags": "execve clone", "start_time": "2022-06-07T17:03:42.519Z", "auid": 4294967295, "pod": { "namespace": "argocd", "name": "argocd-repo-server-7db4cc4b45-cpvlt", "container": { "id": "cri-o://1c361244fcb1d89c02ef297e69a13bd80fd4d575ae965a92979deec740711e17", "name": "argocd-repo-server", "image": { "id": "quay.io/argoproj/argocd@sha256:85d55980e70f8f7073e4ce529a7bbcf6d55e51f8a7fc4b45d698f0a7ffef0fea", "name": "quay.io/argoproj/argocd:v2.3.4" }, "start_time": "2022-05-31T16:57:53Z", "pid": 319 } }, "docker": "1c361244fcb1d89c02ef297e69a13bd", "parent_exec_id": "MTAuMC4xMC4yMTg6MzA4OTk3NTAyODQyMTEzOjExMjQ3", "refcnt": 1 } }, "node_name": "10.0.10.218", "time": "2022-06-07T17:03:42.519Z" }
JSON出力としてのイベント・ストリームは冗長で理解しにくいですが、情報密度です。このJSONデータを取り込み、そこから分析情報を導出する方法はいくつかあります。明らかなのは、tetragon CLIツールを使用することです。CiliumとTetragonの背後にあるIsovalentは、このデータを分析および視覚化して、より実用的で同化しやすいようにするフル機能の商用製品も提供しています。
タスク1: tetra CLIのインストール
-
Tetragon cli tol
tetraは、ポッド、ホスト、ネームスペースまたはプロセスでイベントをフィルタする場合に便利です。CLIはgithubのリリース・ページからダウンロードできます。オペレーティング・システムおよびCPUアーキテクチャに基づいてツールをダウンロードし、untarを/usr/local/binなどの標準の場所にダウンロードするか、バイナリへのパスをシェルのPATH変数に追加できます。 -
または、cliを実行するワークステーションに
goをインストールしている場合は、次のコマンドでダウンロードしてインストールできます。GOOS=$(go env GOOS) GOARCH=$(go env GOARCH) curl -L --remote-name-all https://github.com/cilium/tetragon/releases/latest/download/tetra-${GOOS}-${GOARCH}.tar.gz{,.sha256sum} sha256sum --check tetra-${GOOS}-${GOARCH}.tar.gz.sha256sum sudo tar -C /usr/local/bin -xzvf tetra-${GOOS}-${GOARCH}.tar.gz rm tetra-${GOOS}-${GOARCH}.tar.gz{,.sha256sum} -
CLIのインストール後、JSON出力を
tetra geteventsに渡すことで、イベントをかなり出力できます。kubectl logs -n kube-system ds/tetragon -c export-stdout -f | tetra getevents -o compact-o compactオプションは、JSONではなくコンパクトな出力を表示します。このツールでは、出力の表示を特定のネームスペースやプロセスなどに制限することもできます。フラグの完全なリストを次に示しますUsage: tetra getevents [flags] Flags: --color string Colorize compact output. auto, always, or never (default "auto") -h, --help help for getevents --host Get host events -n, --namespace strings Get events by Kubernetes namespaces -o, --output string Output format. json or compact (default "json") --pod strings Get events by pod name regex --process strings Get events by process name regex --timestamps Include timestamps in compact output Global Flags: -d, --debug Enable debug messages --server-address string gRPC server address (default "localhost:54321")
タスク2: FileAccessおよびネットワークの可観測性に対するTracingPoliciesの構成
TracingPoliciesは、カーネル・イベントのリアルタイム・フィルタの設定を簡単にするカスタム・リソースです。TracingPolicyは、システム・コールで可観測性を照合およびフィルタ処理し、これらの一致に対するアクションもトリガーします。Tetragonは、この機能を紹介するいくつかの例を提供し、TracingPoliciesを構成するための開始点として使用できます。
-
FileAccessおよび可観測性に対するトレース・ポリシーの例の適用
kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/crds/examples/sys_write_follow_fd_prefix.yaml kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/crds/examples/tcp-connect.yaml -
これらの追加の TracingPoliciesを有効にすると、Tetragonはファイルアクセスとネットワークアクティビティーのトレースを開始します。次の出力は、
curlコマンドが呼び出されたときにカーネルから表示されるアクティビティーを示しています。etc/hostsや/etc/resolv.confなどのファイルにアクセスし、TCP接続を開いてデータを転送するcurlプログラムを示しています。$ kubectl logs -n kube-system ds/tetragon -c export-stdout -f | tetra getevents -o compact ...[output truncated] 🚀 process default/xwing /usr/bin/curl -Lv https://cloud.oracle.com 📬 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 🔌 connect default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 📬 open default/xwing /usr/bin/curl /etc/ssl/certs/ca-certificates.crt 📪 close default/xwing /usr/bin/curl 📤 sendmsg default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 bytes 517 📤 sendmsg default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 bytes 126 📤 sendmsg default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 bytes 109 📤 sendmsg default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 bytes 31 🧹 close default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 💥 exit default/xwing /usr/bin/curl -Lv https://cloud.oracle.com 0 💥 exit default/xwing /bin/bash 0 ...[output truncated]
これらのイベントはカーネル内から直接監視されるため、これらのコールをトレースする処理にオーバーヘッドがほとんどなく、悪意のあるアクターによって難読化またはマスクされる可能性もほとんどありません。
このアプローチの主な欠点は、たとえば、ファイルを読み取るプロセスを強制終了するというようなアクションを実行できるという点です。つまり、イベントが発生しているときではなく、イベントについて知っているということです。ただし、カーネルレベルでイベントをフィルタリングおよび照合し、それらを監視および処理するのに役立つポリシーを作成できるよう、オーバーヘッドが低いソリューションを持つことは非常に強力です。
トラブルシューティング
エラー: TetragonポッドがCrashLoopBackOff状態であることが判明した場合、これは2つの理由が原因である可能性があります。
考えられる理由: クラスタ内にArmベースのノードがある場合、これがArmベースのノードで発生している可能性が最も高い理由です。テトラゴンはまだ腕で走っていない。
トラブルシューティング:
-
確認するには、次を使用します
kubectl describe pod -
tetragon-operatorという名前のinitコンテナを表示します。これは失敗する可能性があり、終了コードが1の終了状態です。次を使用できますkubectl logs <pod_name> -c tetragon-operator -n kube-system -
initコンテナ・ログを表示すると、initコンテナが
standard_init_linux.go:228: exec user process caused: exec format errorとして終了する理由が表示され、バイナリがArm CPUアーキテクチャでの使用を意図していないことが示される場合があります。
2つ目の理由は、ノードに古いカーネルがあり、BTFサポートが含まれていないことです。これが実際の問題であるかどうかを確認するには、前述のようにポッド内の障害が発生したコンテナのコンテナ・ログを取得します。カーネルでのBTFサポートが不足している場合は、次のようなエラーメッセージが表示されます。
aborting. kernel autodiscovery failed: Kernel version BTF search failed kernel is not included in supported list.
Use --btf option to specify BTF path and/or '--kernel' to specify kernel version
これは、OSが最近または古いバージョンのOSを更新していないノードで想定されます。これを解決するには、ワーカー・ノードの最新のOracle Linux 8ベースのOKEまたはプラットフォーム・イメージに切り替えます。ノード・プール構成をこの選択で更新し、標準ノード・プールのアップグレード・プロセスに従ってノードをアップグレードする必要があります。
関連リンク
謝辞
- 作成者 - Jeevan Joseph(シニア・プリンシパル・プロダクト・マネージャー)
その他の学習リソース
docs.oracle.com/learnで他のラボをご覧いただくか、Oracle Learning YouTubeチャネルでより無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Install Tetragon and configure TracingPolicies on Oracle Container Engine for Kubernetes
F74876-01
December 2022
Copyright © 2022, Oracle and/or its affiliates.