注意:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱開始使用 Oracle Cloud Infrastructure Free Tier 。
- 它會使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值替代為您雲端環境特定的值。
在 Oracle Container Engine for Kubernetes 上安裝 Tetragon 並設定 TracingPolicies
簡介
由於 eBPF 型工具對雲端原生應用程式而言更為普及,此教學課程描述如何在 Oracle Cloud Infrastructure (OCI) 上執行 Tetragon (一種用於安全性觀察和強制執行的 eBPF 工具)。
什麼是 eBPF 和為何流行?
作業系統核心通常是觀察和影響系統的最佳位置,因為執行功能的工具與嘗試觀察和影響活動之間的障礙極少。在核心空間內執行通常可以讓程式擁有非常低的負荷,但代價是安全與維護的代價。
eBPF 提供導入的新功能的方法,無需變更核心原始碼或載入核心模組,即可在封閉測試環境與授權環境中執行。它基本上是透過建立與虛擬機器程式設計語言類似的典範。eBPF 程式的位元組程式碼格式與現代 Java 程式是如何編譯成使用 JIT 編譯器編譯至原生程式碼的位元組程式碼,而 JVM (Java Virtual Machine) 則採用位元組程式碼表示。BPF 與 Linux 核心深度連結,核心 JIT 編譯器會將 eBPF 位元組程式碼編譯為可在核心空間中執行的原始程式碼。
eBPF 使用以事件為基礎的模型來載入程式,而 eBPF 程式會寫入「鉤點」至網路事件、系統呼叫等等。在呼叫 eBPF 程式的事件後,eBPF 程式會在驗證與 JIT 編譯後載入核心中。驗證步驟可確保程式安全執行、具備正確權限以及可執行完成,而 JIT 編譯可確保原生效能。在許多情況下,eBPF 程式會以較高層次的語言撰寫,並編譯為位元組程式碼表示。然後在 JIT 編譯之後,依據程式實際連接到的事件,將這些程式載入執行中的核心。
Tetragon - 基於 eBPF 的安全性觀察與執行
Tetragon 是一種基於雲端原生的 eBPF 工具,可執行安全性觀察並實施。它是鈣項目的一部分。使用 eBPF,Tetragon 可篩選與觀察事件並在即時套用原則,而不需將事件傳送給核心外部執行的代理程式。Tetragon 可以透過篩選用於開啟網路連線、存取檔案或甚至在容器內啟動程序等事件的多個安全與可觀察使用案例。例如,在應用程式容器內啟動的 Shell 處理作業可能會被視為安全事件。有可能是有人嘗試排解問題,或可能是某個惡意活動,這可能是該活動應觸發安全檢查,以排除系統上的攻擊。也可以說是有關正在開啟的網路連線或讀取的檔案。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 支援的 caveat 只適用於尚未在一段時間內更新節點作業系統,而不是新建立的叢集。如果您不確定,檢查是否有 BTF 支援的最佳方式是將 SSH 連線至節點並執行
ls /sys/kernel/btf,您應該看到核心 (vmlinux) 以及此處所列的模組。一般請注意,此部署偏好使用 Oracle Linux 8 型節點。
若要檢查節點執行的核心版本,請在節點上執行 uname -a。如果您執行的是舊版的核心,則可以升級節點集區組態上的版本。不過,這只會影響新建立的節點與現有節點不會自動升級,以確保工作負載在其上執行的連續性。您可以按照節點集區升級程序,將現有的節點更新為較新的核心版本。
-
一旦您確定正在節點上最新版本的核心執行,即可開始使用 Tetragon helm 圖表來安裝 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 Pod 處於「執行中」狀態後,您就可以開始監聽節點上的事件。立即可用,監控流程執行。Tetragon 以 JSON 格式發出相符的事件,並使用下列指令觀察日誌 (假設已安裝
jq)kubectl logs -n kube-system -l app.kubernetes.io/name=tetragon -c export-stdout -f | jq -
視叢集上發生的活動而定,您會看到代表這些事件的 JSON 物件串流。下列程式碼片段是執行 ArgoCD 的叢集的範例輸出,在其中複製 Git 儲存區域。
{ "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 工具。Isovalent,Cilium 和 Tetragon 公司也提供功能齊全的商業產品,能夠分析和視覺化這些資料,使其更容易採取行動。
作業 1:安裝 tetra CLI
-
Tetragon tube tol
tetra可用於依 Pod、主機、名稱空間或程序篩選事件。您可以從 github 版本頁面 下載 CLI。您可以根據作業系統和 CPU 架構下載此工具,然後將它untar下載至標準位置 (例如/usr/local/bin),或將二進位檔的路徑新增至 shell 的PATH變數。 -
或者,如果您的工作站上安裝了
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:將 TracingPolicies 設定為 FileAccess 與網路可觀察性
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指令時,從核心看到的活動。它會顯示curl程式來存取etc/hosts和/etc/resolv.conf等檔案,並開啟 TCP 連線和傳輸資料。$ 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 Pod 處於 CrashLoopBackOff 狀態,這可能是因為兩個原因所造成。
可能的原因:如果您的叢集中有以 Arm 為基礎的節點,則最有可能發生此情況。Tetragon 尚未在 Arm 上執行。
疑難排解:
-
若要確認,請使用
kubectl describe pod -
查看名為
tetragon-operator的 init 容器。這可能會失敗,且處於已終止狀態,結束代碼為1。您可以使用kubectl logs <pod_name> -c tetragon-operator -n kube-system -
若要檢視 init 容器日誌,您可能會看到以
standard_init_linux.go:228: exec user process caused: exec format error身分終止起始容器的原因,表示此二進位檔不適用於 Arm CPU 架構。
第二種原因可能是您的節點上有舊版的核心,但未包含 BTF 支援。若要確認問題是否確實存在,請按照上述方式取得 Pod 中失敗之容器的容器日誌。如果核心缺少 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
這適用於最近或舊版作業系統尚未更新的節點。若要解決此問題,您可以切換至工作者節點的最新 Oracle Linux 8 型 OKE 或平台映像檔。必須使用此選擇更新節點集區組態,以及依照標準節點集區升級處理作業升級的節點。
相關連結
確認
- 作者 - Jeevan Joseph (資深產品經理)
其他學習資源
探索 docs.oracle.com/learn 的其他實驗室,或者存取更多 Oracle Learning YouTube 頻道上的免費學習內容。此外,請瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning 檔案總管。
如需產品文件,請造訪 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.