Cilium 開(kāi)源 Tetragon – 基于 eBPF 的安全可觀測(cè)性 & 運(yùn)行時(shí)增強(qiáng)
?原文鏈接??:https://isovalent.com/blog/post/2022-05-16-tetragon
譯文原文鏈接??:https://icloudnative.io/posts/tetragon/ 請(qǐng)復(fù)制到瀏覽器打開(kāi)
譯者:米開(kāi)朗基楊、范彬

Isovalent Cilium 企業(yè)版[1] 包含一個(gè)基于 eBPF 的實(shí)時(shí)安全可觀測(cè)性和運(yùn)行時(shí)增強(qiáng)(runtime enforcement)平臺(tái),2022 年 5 月 16 日,Isovalent 終于決定將該平臺(tái)的主要功能開(kāi)源,并將其命名為 Tetragon[2]。
什么是 Tetragon?
Tetragon 提供了基于 eBPF 的完全透明的安全可觀測(cè)性能力以及實(shí)時(shí)的運(yùn)行時(shí)增強(qiáng)(runtime enforcement)能力。由于基于 eBPF 的內(nèi)核級(jí)收集器中直接內(nèi)置了智能內(nèi)核過(guò)濾能力和聚合邏輯,因此 Tetragon 無(wú)需更改應(yīng)用程序即可以非常低的開(kāi)銷實(shí)現(xiàn)深度的可觀測(cè)性。內(nèi)嵌的運(yùn)行時(shí)執(zhí)行層不僅能夠在系統(tǒng)調(diào)用層面進(jìn)行訪問(wèn)控制,而且能夠檢測(cè)到特權(quán)、Capabilities 和命名空間的提權(quán)逃逸,并實(shí)時(shí)自動(dòng)阻止受影響進(jìn)程的進(jìn)一步執(zhí)行。

智能可觀測(cè)性
Tetragon 的基石是一個(gè)強(qiáng)大的可觀測(cè)層,它可以觀測(cè)整個(gè)系統(tǒng),從低級(jí)別的內(nèi)核可見(jiàn)性到跟蹤文件訪問(wèn)、網(wǎng)絡(luò)活動(dòng)或能力(capability)變化,一直到應(yīng)用層,涵蓋了諸如對(duì)易受攻擊的共享庫(kù)的函數(shù)調(diào)用、跟蹤進(jìn)程執(zhí)行或解析發(fā)出的 HTTP 請(qǐng)求??偟膩?lái)說(shuō),Tetragon 可以提供對(duì)各種內(nèi)核子系統(tǒng)的可觀測(cè)性,涵蓋了命名空間逃逸、Capabilities 和特權(quán)升級(jí)、文件系統(tǒng)和數(shù)據(jù)訪問(wèn)、HTTP、DNS、TLS 和 TCP 等協(xié)議的網(wǎng)絡(luò)活動(dòng),以及系統(tǒng)調(diào)用層的事件,以審計(jì)系統(tǒng)調(diào)用和跟蹤進(jìn)程執(zhí)行。

深度可觀測(cè)性:可以觀測(cè)整個(gè)系統(tǒng)和應(yīng)用程序的幾乎所有調(diào)用環(huán)節(jié)。比如檢測(cè) TCP 連接中的低級(jí)微突發(fā)(microbursts),為黃金信號(hào)監(jiān)控面板提供 HTTP 可見(jiàn)性,或者檢測(cè)特定易受攻擊的共享庫(kù)的使用的能力。Tetragon 提供了一個(gè)易于使用的框架,以涵蓋更多的可觀測(cè)性用例,因此可以探索更多的可能性。 完全透明:Tetragon 所有的可觀察性數(shù)據(jù)都是從內(nèi)核中透明地收集的,無(wú)需更改應(yīng)用程序代碼,應(yīng)用也無(wú)法檢測(cè)到自己何時(shí)被監(jiān)控,這是安全用例的理想選擇。 低開(kāi)銷:Tetragon 直接在內(nèi)核中使用 eBPF 執(zhí)行過(guò)濾、聚合、度量統(tǒng)計(jì)和直方圖收集,大大減少了系統(tǒng)的開(kāi)銷。此外,Tetragon 使用高效的數(shù)據(jù)結(jié)構(gòu),如每個(gè) CPU 的哈希表、環(huán)形緩沖區(qū)和 LRU 地圖,以提供高效和快速的數(shù)據(jù)收集手段,并避免向用戶空間 agent 發(fā)送大量的低信號(hào)事件。
?譯者注:微突發(fā)(microbursts)是指端口在非常短的時(shí)間(毫秒級(jí)別)內(nèi)收到非常多的突發(fā)數(shù)據(jù)。
運(yùn)行時(shí)增強(qiáng)(runtime enforcement)
基于豐富的可觀測(cè)性,Tetragon 還提供了實(shí)時(shí)的運(yùn)行時(shí)增強(qiáng)(runtime enforcement)能力。大部份運(yùn)行時(shí)增強(qiáng)(runtime enforcement)系統(tǒng)都只有有限的一組強(qiáng)制執(zhí)行點(diǎn)(例如僅在系統(tǒng)調(diào)用級(jí)別),而 Tetragon 能夠以預(yù)防的方式在整個(gè)操作系統(tǒng)中執(zhí)行安全策略,而不是對(duì)事件異步地做出反應(yīng)。除了能夠?yàn)槎鄠€(gè)層級(jí)的訪問(wèn)控制指定允許列表外,Tetragon 還能夠自動(dòng)檢測(cè)特權(quán)和 Capabilities 升級(jí)或命名空間提權(quán)(容器逃逸),并自動(dòng)終止受影響的進(jìn)程。安全策略可以通過(guò) Kubernetes(CRD)、JSON API 或 Open Policy Agent(OPA)等系統(tǒng)注入。

預(yù)防式安全:Tetragon 的運(yùn)行時(shí)策略直接在內(nèi)核中執(zhí)行,并且是同步的(實(shí)時(shí)的),這樣可以真正防止攻擊,而不僅僅是對(duì)攻擊做出異步的反應(yīng)。 無(wú)需了解所有攻擊載體:Tetragon 無(wú)需了解單個(gè)攻擊載體并對(duì)其進(jìn)行阻斷,它的做法是允許你定義一系列難以被攻破的隔離和特權(quán)限制保證措施,并自動(dòng)執(zhí)行這些保證措施。 可插拔策略架構(gòu):Tetragon 允許執(zhí)行多種不同來(lái)源的安全策略,包括用戶自定義的策略,Open Policy Agent (OPA) 等系統(tǒng)定義的策略,以及通過(guò)可擴(kuò)展的 Kubernetes CRD 和 JSON 接口對(duì)接來(lái)自第三方組件的安全策略。
運(yùn)行時(shí)增強(qiáng)為何是實(shí)時(shí)的?
除了有更多的位置(enforcement points)可以執(zhí)行策略,eBPF 還使得我們?cè)谠馐苈┒垂魰r(shí)馬上作出反應(yīng),實(shí)時(shí)、同步地執(zhí)行策略。當(dāng)然,Tetragon 也能夠像其他運(yùn)行時(shí)增強(qiáng)(runtime enforcement)系統(tǒng)一樣允許或拒絕與特定參數(shù)相匹配的特定系統(tǒng)調(diào)用,但它的殺手锏是一旦觀察到特權(quán)/功能升級(jí)或命名空間提權(quán),便立即阻止進(jìn)程繼續(xù)運(yùn)行,從而將運(yùn)行時(shí)增強(qiáng)(runtime enforcement)功能提升到一個(gè)新的臺(tái)階。更厲害的是,Tetragon 甚至不需要了解這個(gè)攻擊載體是什么。

Tetragon 另辟蹊徑,它不需要了解特定的漏洞或攻擊載體,而是直接定義執(zhí)行策略,指定哪些應(yīng)用程序應(yīng)在運(yùn)行時(shí)可以提升特權(quán)、附加額外的 Capabilities、跨越內(nèi)核命名空間的邊界,而后便監(jiān)視內(nèi)核的提權(quán)和逃逸,并自動(dòng)終止違反定義策略的進(jìn)程。而且殺死進(jìn)程是在內(nèi)核中同步執(zhí)行的,這意味著如果一個(gè)進(jìn)程使用 write(2) 或 sendmsg(2) 來(lái)利用內(nèi)核漏洞獲得權(quán)限,那么這些系統(tǒng)調(diào)用將永遠(yuǎn)不會(huì)返回,該進(jìn)程及其所有線程都將被終止,不會(huì)再繼續(xù)執(zhí)行。
為什么使用 Tetragon?
傳統(tǒng)的可觀測(cè)性和運(yùn)行時(shí)增強(qiáng)(runtime enforcement)解決方案無(wú)外乎都是基于以下幾個(gè)方面來(lái)實(shí)現(xiàn),它們都有各自的優(yōu)勢(shì)和缺陷。而 Tetragon 利用 eBPF 將更多的優(yōu)勢(shì)進(jìn)行結(jié)合,并消除了絕大多數(shù)的缺陷。


上述解決方案都是在應(yīng)用程序和系統(tǒng)調(diào)用層面上執(zhí)行,并且可觀測(cè)性方案也各不相同。它們都有一個(gè)用戶空間代理,這個(gè)代理依賴于按定義收集的可觀測(cè)性數(shù)據(jù),然后對(duì)其作出反應(yīng),且無(wú)法對(duì)內(nèi)核級(jí)別的事件進(jìn)行觀測(cè)。


第二類解決方案都是直接在內(nèi)核層面操作,主要針對(duì)運(yùn)行時(shí)增強(qiáng)(runtime enforcement),觀測(cè)能力較弱(甚至沒(méi)有觀測(cè)能力)。內(nèi)置的內(nèi)核系統(tǒng)提供了非常多的策略執(zhí)行選項(xiàng),但內(nèi)核在構(gòu)建時(shí)卻只重點(diǎn)提供訪問(wèn)控制的能力,而且非常難以擴(kuò)展,例如內(nèi)核是無(wú)法感知到 Kubernetes 和容器的。雖然內(nèi)核模塊解決了可擴(kuò)展性問(wèn)題,但由于其產(chǎn)生的安全風(fēng)險(xiǎn),在很多場(chǎng)景下往往不是一種明智的選擇。
像 LSM-eBPF 這樣年輕的內(nèi)核子系統(tǒng)功能非常強(qiáng)大,也非常有前景,只是需要依賴最新的內(nèi)核(≥5.7)。Tetragon 可以使用 eBPF-LSM 作為策略執(zhí)行點(diǎn),而且不受 eBPF-LSM 所需的內(nèi)核版本的限制。
由此可見(jiàn),在 eBPF 的加持下,Tetragon 結(jié)合了現(xiàn)有解決方案的絕大多數(shù)優(yōu)勢(shì)。

高效 & 透明:Tetragon 提供了對(duì)應(yīng)用的可觀測(cè)性和高效的應(yīng)用運(yùn)行時(shí)檢測(cè),并且完全透明,對(duì)應(yīng)用無(wú)侵入性,無(wú)需更改應(yīng)用代碼。 實(shí)時(shí)增強(qiáng):Tetragon 提供了像 seccomp、SELinux 和 LSM 一樣的內(nèi)核級(jí)別同步執(zhí)行策略的能力,但它將策略執(zhí)行從純粹的訪問(wèn)控制提升到了防止對(duì)系統(tǒng)和組件造成傷害的級(jí)別,而不是僅僅限制對(duì)資源和數(shù)據(jù)的訪問(wèn)。 深度可擴(kuò)展的可觀測(cè)性:Tetragon 提供了深度的系統(tǒng)觀測(cè)能力和自定義 Linux 內(nèi)核模塊的可擴(kuò)展性,同時(shí)沒(méi)有安全和可用性風(fēng)險(xiǎn)。
此外,Tetragon 還提供了一個(gè) agent,可以原生集成各種現(xiàn)代化的可觀測(cè)性系統(tǒng)和策略標(biāo)準(zhǔn)(例如 Kubernetes、Prometheus、fluentd、Open Telemetry、Open Policy Agent 以及傳統(tǒng)的 SIEM 平臺(tái))。
自動(dòng)緩解特權(quán)或容器逃逸
Linux 內(nèi)核的安全漏洞緩解是一個(gè)具有挑戰(zhàn)性的問(wèn)題。解決方案通常依賴于檢測(cè)和阻止已知的攻擊途徑、減少攻擊面或限制受損組件的爆炸半徑。Tetragon 通過(guò)檢測(cè)和停止相關(guān)進(jìn)程來(lái)阻止內(nèi)核中的特權(quán)、Capabilities 和命名空間提權(quán)。Kuberenetes 的每個(gè)應(yīng)用程序都可以明確聲明一組特權(quán)、Capabilities 和跨特權(quán)的命名空間。
緩解 CVE-2021-22555 漏洞
如下是一個(gè)簡(jiǎn)單的策略,它描述了在 CAP_SYS_ADMIN 能力更改時(shí),進(jìn)程將終止:
apiVersion:?cilium.io/v1alpha1
kind:?TracingPolicy
metadata:
??name:?"capability-protection"
spec:
??[...]
????selectors:
????-?matchCapabilityChanges:
??????-?type:?Effective
????????operator:?In
????????values:
????????-?"CAP_SYS_ADMIN"
??????matchActions:
??????-?action:?Sigkill
CVE-2021-22555 漏洞是通過(guò) Netfilter 漏洞來(lái)獲取特權(quán)。在實(shí)施上面的策略情況下,運(yùn)行該漏洞,讓我們看看會(huì)發(fā)生什么:
root@ubuntu2:/#?/root/cve-2021-22555
[+]?Linux?Privilege?Escalation?by?theflow@?-?2021
[+]?STAGE?0:?Initialization
[*]?Setting?up?namespace?sandbox...
[...]
[+]?STAGE?5:?Post-exploitation
[*]?Escaping?container...
[*]?Cleaning?up...
[*]?Popping?root?shell...
Killed
可以看到當(dāng)利用該漏洞進(jìn)行特權(quán)提權(quán)時(shí),該進(jìn)程直接被終止了。請(qǐng)注意,上述的策略不包含漏洞本身的特定元素,所以使用不同攻擊途徑的不同漏洞進(jìn)行攻擊,會(huì)獲得相同的結(jié)果。
使用 Tetragon CLI 進(jìn)行應(yīng)用行為檢查
在 Isovalent 中,Tetragon CLI 代號(hào)為 amazing-cli,可能是使用 Tetragon 進(jìn)行可觀測(cè)性的第一個(gè)切入點(diǎn)。該 CLI 通常是令人吃驚,因?yàn)樗芤砸环N簡(jiǎn)單易懂的形式公開(kāi)復(fù)雜系統(tǒng)的大量信息。
在以下示例中,我們將展示如何使用 Tetragon 來(lái)觀測(cè) Kubernetes Pod 的行為,該 Pod 運(yùn)行命令 curl -L github.com:

開(kāi)始執(zhí)行 curl -L github.com進(jìn)行 github.com 的 DNS 解析,及端口 80 的 TCP 連接打開(kāi)。 github.com 在 7 毫秒內(nèi)返回 HTTP 碼 301 ,將流量重定向到端口 443。啟用 TLS,curl 重定向并執(zhí)行另一個(gè) DNS 解析。 TCP 連接端口 443 打開(kāi),開(kāi)始 TLS 握手。使用 TLS 1.3 協(xié)議,協(xié)商的密鑰是 AES-128-GCM-SHA256。 進(jìn)行數(shù)據(jù)交換。端口 80 上總共接收約 80 個(gè)字節(jié),端口 443 上接收 218KiB。 進(jìn)程退出,錯(cuò)誤碼為 0。
網(wǎng)絡(luò)和運(yùn)行時(shí)可觀測(cè)性的結(jié)合
Tetragon 使用 eBPF 的其中一個(gè)令人興奮的優(yōu)勢(shì)是它可以結(jié)合多個(gè)方面的可觀測(cè)性,目前為止,這些可觀測(cè)性通常都是單獨(dú)處理的。下面是一個(gè)結(jié)合網(wǎng)絡(luò)和運(yùn)行時(shí)可觀測(cè)性的示例,以演示識(shí)別哪些進(jìn)程涉及哪種類型的網(wǎng)絡(luò)通信的能力。以下示例顯示了使用 Tetragon 來(lái)觀測(cè)一個(gè) Kubernetes Pod,該 Pod 被入侵并受到橫向移動(dòng)攻擊:

在上圖中,我們看到了通過(guò)反向 Shell 進(jìn)行的經(jīng)典橫向移動(dòng)攻擊:
Kubernetes 的 Pod crawler-c57f9778c-wtcbc在 Kubernetes 命名空間tenant-jobs中運(yùn)行。Pod 是通過(guò) Containerd 運(yùn)行的,Containerd 作為 PID 1 init 進(jìn)程的子進(jìn)程運(yùn)行。在 Pod 內(nèi)運(yùn)行的二進(jìn)制文件稱為“爬蟲(chóng)”,它會(huì)產(chǎn)生一個(gè)執(zhí)行server.js的 Node 進(jìn)程。Node 應(yīng)用的出口網(wǎng)絡(luò)連接是 api.twitter.com和 Kubernetes 中的 Elasticsearch 服務(wù)。Pod 啟動(dòng) 5 分鐘后,又啟動(dòng)了另一個(gè)子進(jìn)程調(diào)用 netcat (nc)。結(jié)合運(yùn)行時(shí)和網(wǎng)絡(luò)可觀測(cè)性來(lái)看,很明顯這是一個(gè)正在進(jìn)行的反向 Shell 攻擊。 然后,可以觀察到攻擊者正在運(yùn)行 curl 訪問(wèn)內(nèi)部 es 服務(wù)器,然后使用 curl 將檢索到的數(shù)據(jù)上傳到 S3 存儲(chǔ)中。
監(jiān)控對(duì)敏感文件的訪問(wèn)
Tetragon 具有監(jiān)控文件和數(shù)據(jù)訪問(wèn)的能力。以下示例說(shuō)明了 Tetragon 與 Splunk 集成,以跟蹤對(duì)敏感文件的訪問(wèn),同時(shí)提供訪問(wèn)的上下文(例如:Kubernetes 元數(shù)據(jù)、容器鏡像、二進(jìn)制文件和用戶信息)。

上面的示例列出了對(duì) /etcd/passwd 的訪問(wèn),包括進(jìn)程、及容器鏡像和 Kubernetes 命名空間。除了監(jiān)視 /etc/passwd 或 /etc/shadow 之外,還可以監(jiān)控系統(tǒng)上其他的明顯文件,包括:容器運(yùn)行時(shí)的 UNIX 套接字,及可能改變系統(tǒng)引導(dǎo)的 Systemd 單元或 Init 文件。
Tetragon 不僅提供了對(duì)此類敏感文件訪問(wèn)的監(jiān)控能力,而且可以阻止訪問(wèn)此類文件。
檢測(cè) TLS 弱密鑰和版本
TLS 是當(dāng)今世界安全的基石,但使用較舊的 TLS 版本或不安全的 TLS 密鑰可能會(huì)構(gòu)成嚴(yán)重的安全威脅。無(wú)意識(shí)的錯(cuò)誤使用 TLS 密鑰和版本會(huì)導(dǎo)致故意的 TLS 降級(jí)攻擊。

上面的儀表板顯示了 TLS 協(xié)議版本信息,并將其與 Kubernetes Pod 和命名空間上下文相關(guān)聯(lián)。它還可以顯示密鑰信息,及更重要的是密鑰長(zhǎng)度信息。
運(yùn)行時(shí)感知的網(wǎng)絡(luò)策略
你可能熟悉 Kubernetes 的 NetworkPolicies,它定義了 Kubernetes 工作負(fù)載的允許和禁止的網(wǎng)絡(luò)通信。簡(jiǎn)而言之,這些策略描述了允許 Pod A 與 Pod B 或 CIDR 10.0.0.0/8 通信,但禁止 Pod A 與 Pod C 或 CIDR 20.1.1.1/32 通信。
這些策略的粒度是在 Pod 級(jí)別。所以無(wú)論 Pod 中運(yùn)行的 app.js 還是 attack.py 腳本調(diào)用 curl,這些策略都可以生效的。借助 Tetragon 技術(shù),可以擴(kuò)展 Cilium 的網(wǎng)絡(luò)策略功能以包括運(yùn)行時(shí)上下文:
kind:?CiliumNetworkPolicy
[...]
??endpointSelector:
??-?matchLabels:
????-?name:?Frontend
??egress:
??-?toEndpoints:
??????-?matchLabels:?????????????
????????-?name:?Backend
????fromRuntime:
??????-?binary:?app.py
????????privileged:?false
上述策略獲得明顯更好的最小特權(quán)策略。它允許前端 Pod 與后端 Pod 對(duì)話,但前提是:
源 Pod 中的二進(jìn)制文件為 app.py 源 Pod 中的進(jìn)程以非特權(quán)運(yùn)行
上述示例將二進(jìn)制名稱和特權(quán)執(zhí)行上下文考慮在內(nèi),此概念可以擴(kuò)展為基于其他參數(shù)進(jìn)行限制,例如:確保進(jìn)程仍處于該命名空間、UID/GID 上下文,甚至考慮可執(zhí)行文件的內(nèi)存哈希。
總結(jié)
Laf 是一個(gè)完全開(kāi)源的云開(kāi)發(fā)平臺(tái),可以在線編寫、調(diào)試函數(shù),不用重啟服務(wù),隨時(shí)隨地在?Web 上查看函數(shù)的運(yùn)行日志,無(wú)需連接服務(wù)器,無(wú)需折騰數(shù)據(jù)庫(kù)、對(duì)象存儲(chǔ)、Nginx 等,可以隨時(shí)隨地上線應(yīng)用,招之即來(lái),揮之即去,隨手發(fā)布!
Laf 可以幫助開(kāi)發(fā)者擁有自己的云開(kāi)發(fā)平臺(tái),讓寫代碼像寫博客一樣簡(jiǎn)單,支持云函數(shù)/云數(shù)據(jù)庫(kù)/對(duì)象存儲(chǔ),讓前端秒變?nèi)珬?,?jié)省 60% 研發(fā)成本,實(shí)現(xiàn) 0 運(yùn)維!
我們非常樂(lè)意將 Tetragon 開(kāi)源。額外的可觀測(cè)性和安全控制將會(huì)幫助你們改善安全、平臺(tái)和應(yīng)用程序團(tuán)隊(duì)的工作,助力整體的基礎(chǔ)架構(gòu)(特別是 Kubernetes 環(huán)境)更加安全。更重要的是,有了開(kāi)源社區(qū)的加持,我們非常期待接下來(lái)會(huì)發(fā)生的故事。
引用鏈接
Isovalent Cilium 企業(yè)版: https://isovalent.com/product
[2]Tetragon: https://github.com/cilium/tetragon
[3]關(guān)于 Tetragon 的網(wǎng)絡(luò)研討會(huì): https://isovalent.com/tetragon/
[4]Cilium Slack: https://cilium.io/slack
END
或許,書應(yīng)該一起讀
Go 最細(xì)節(jié)篇|pprof 統(tǒng)計(jì)的內(nèi)存總是偏?。?/a>
想要了解Go更多內(nèi)容,歡迎掃描下方???關(guān)注?公眾號(hào),回復(fù)關(guān)鍵詞 [實(shí)戰(zhàn)群]? ,就有機(jī)會(huì)進(jìn)群和我們進(jìn)行交流~
分享、在看與點(diǎn)贊,至少我要擁有一個(gè)叭~


