溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

BPF中怎么將SSH會(huì)話(huà)轉(zhuǎn)換為結(jié)構(gòu)化事件

發(fā)布時(shí)間:2021-07-26 11:33:25 來(lái)源:億速云 閱讀:150 作者:Leah 欄目:編程語(yǔ)言

BPF中怎么將SSH會(huì)話(huà)轉(zhuǎn)換為結(jié)構(gòu)化事件,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

1、混淆處理-比如說(shuō)下列命令:

echo Y3VybCBodHRwOi8vd3d3LmV4YW1wbGUuY29tCg== | base64 –decode | sh

當(dāng)該命令解碼后即為“curl http://www.example.com”,但是SSH會(huì)話(huà)記錄中并不會(huì)包含curl命令。

2、Shell腳本-如果用戶(hù)上傳并執(zhí)行了一個(gè)腳本,那么腳本中的命令將無(wú)法被會(huì)話(huà)記錄捕捉到,而是直接將腳本文件輸出。

3、終端控制-終端支持各種控制命令,最常用的應(yīng)該是sudo了,禁用終端的echo將允許我們?cè)谶\(yùn)行命令的同時(shí)不會(huì)被SSH會(huì)話(huà)記錄捕捉到。

技術(shù)實(shí)現(xiàn)

為了解決這個(gè)問(wèn)題,Teleport需要一種方法來(lái)在會(huì)話(huà)持續(xù)的過(guò)程中將非結(jié)構(gòu)化的SSH會(huì)話(huà)轉(zhuǎn)換為結(jié)構(gòu)化的事件流。那么這種結(jié)構(gòu)化事件流中應(yīng)該包含什么呢?

我們對(duì)多種方法進(jìn)行了研究,我們研究的內(nèi)容從諸如regex模式匹配之類(lèi)的特殊方法到更復(fù)雜的嘗試,比如自己解析原始SSH會(huì)話(huà)。我們還研究了Linux提供的各種API和系統(tǒng),如Audit、fanotify和BPF。

在選擇使用哪種技術(shù)來(lái)構(gòu)建時(shí),我們有以下幾個(gè)關(guān)鍵的標(biāo)準(zhǔn):

1、減小誤報(bào),理想情況下為0。如果你的系統(tǒng)誤報(bào)率非常高,那么你對(duì)警報(bào)的關(guān)注度可能會(huì)因此而減少,這將導(dǎo)致關(guān)鍵問(wèn)題被忽略。

2、減少由監(jiān)控所引起的任何性能影響,理想情況下為0,這也能減輕向用戶(hù)添加額外資源的負(fù)擔(dān)。

這些特定的方法都會(huì)存在誤報(bào)的問(wèn)題。我們?cè)诮馕龊徒忉尳M成SSH會(huì)話(huà)的字節(jié)流時(shí),無(wú)法在不引起錯(cuò)誤警告的情況下保證數(shù)據(jù)的準(zhǔn)確率。而且由于性能方面的原因,我們排除了Linux Audit。

BPF是什么?

Brendan Gregg,是BPF程序的開(kāi)發(fā)人員,他經(jīng)常將BPF描述為一種“新型軟件”。BPF允許用戶(hù)空間程序以安全和高效的方式在內(nèi)核的某些位置設(shè)置鉤子并發(fā)出事件。

安全和性能意味著什么?在這種情況下,“安全”意味著B(niǎo)PF程序不能陷入無(wú)限循環(huán)中,導(dǎo)致系統(tǒng)崩潰。BPF程序不太可能像內(nèi)核模塊那樣使整個(gè)操作系統(tǒng)崩潰。BPF程序也有性能,如果不能足夠快地使用事件,則會(huì)刪除事件,而不是拖累整個(gè)系統(tǒng)的性能。

Teleport如何使用BPF

Teleport當(dāng)前使用了三個(gè)BPF程序:execsnoop用于捕捉程序執(zhí)行,opensnoop用來(lái)捕捉程序所打開(kāi)的文件,tcpconnect用來(lái)捕捉程序建立的TCP鏈接。

為了更好地了解這三個(gè)BPF程序的功能,大家看看我們?cè)谶\(yùn)行“man ls”命令時(shí),execsnoop捕捉到的內(nèi)容:

# ./execsnoopTracing exec()s. Ctrl-C to end.   PID   PPID ARGS 20139  20135 mawk -W interactive -v o=1 -v opt_name=0 -v name= [...] 20140  20138 cat -v trace_pipe 20171  16743 man ls 20178  20171 preconv -e UTF-8 20181  20171 pager -s 20180  20171 nroff -mandoc -rLL=173n -rLT=173n -Tutf8 20179  20171 tbl 20184  20183 locale charmap 20185  20180 groff -mtty-char -Tutf8 -mandoc -rLL=173n -rLT=173n 20186  20185 troff -mtty-char -mandoc -rLL=173n -rLT=173n -Tutf8 20187  20185 grotty

現(xiàn)在你也許已經(jīng)了解了BPF程序的功能了,簡(jiǎn)單的“man”命令,原來(lái)后面有這么多其他的程序在執(zhí)行。

Teleport已將這三個(gè)程序的代碼嵌入在了自己的庫(kù)中,當(dāng)我們啟用了增強(qiáng)型會(huì)話(huà)記錄功能之后,它便會(huì)執(zhí)行這些程序。

BPF中怎么將SSH會(huì)話(huà)轉(zhuǎn)換為結(jié)構(gòu)化事件

就其本身而言,這些程序都是用于調(diào)試和跟蹤的優(yōu)秀工具,因?yàn)樗鼈兛梢愿嬖V我們整個(gè)系統(tǒng)在執(zhí)行哪些操作。事實(shí)上,這就是我們最開(kāi)始選擇這些工具的目的:我們使用它們來(lái)調(diào)試Teleport遇到的一些問(wèn)題,而這些問(wèn)題可能會(huì)導(dǎo)致它在某些場(chǎng)景中耗盡文件描述符。但是,我們使用Teleport的目的各有不同,我們有時(shí)需要將程序執(zhí)行與SSH會(huì)話(huà)以及標(biāo)識(shí)符關(guān)聯(lián)起來(lái)。

為了將程序執(zhí)行與特定的SSH會(huì)話(huà)關(guān)聯(lián)起來(lái),我們選擇使用cgroup(cgroupv2)。當(dāng)Teleport啟動(dòng)SSH會(huì)話(huà)時(shí),它首先會(huì)重新啟動(dòng)并將自己放置在cgroup中。這將允許程序?qū)Ξ?dāng)前進(jìn)程以及Teleport將要啟動(dòng)的所有進(jìn)程進(jìn)行跟蹤,并分配唯一標(biāo)識(shí)ID。Teleport所運(yùn)行的BPF程序還可以發(fā)出執(zhí)行它們的程序的cgroup ID,這允許我們將事件與特定的SSH會(huì)話(huà)和標(biāo)識(shí)關(guān)聯(lián)起來(lái)。

切入主題

了解了關(guān)于BPF的相關(guān)內(nèi)容之后,你也可以將增強(qiáng)型會(huì)話(huà)記錄功能引入你自己的程序之中,腳本代碼已托管至GitHub【傳送門(mén)】。

首先啟動(dòng)Ubuntu 19.04或RHEL/CentOS 8 VM并運(yùn)行上面鏈接提供的腳本。該腳本只會(huì)安裝內(nèi)核頭和bcc-tools,這些都是增強(qiáng)型會(huì)話(huà)記錄運(yùn)行的前提條件。除此之外,它還會(huì)安裝jq,這樣更有助于可視化查看結(jié)構(gòu)化事件流。

安裝命令如下:

yum install -y kernel-headers bcc-tools

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

如需啟用Teleport中的增強(qiáng)型會(huì)話(huà)記錄功能,請(qǐng)將下列內(nèi)容添加至配置文件中:

   ssh_service:       enhanced_recording:          enabled: yes

當(dāng)你以本文說(shuō)明的方式在終端中執(zhí)行“curl http://www.gravitational.com”時(shí),你將會(huì)看到下列輸出內(nèi)容:

{  "argv": [    "http://www.gravitational.com"  ],  "cgroup_id": 4294967355,  "code": "T4000I",  "ei": 15,  "event": "session.command",  "login": "root",  "namespace": "default",  "path": "/bin/curl",  "pid": 2315,  "ppid": 2294,  "program": "curl",  "return_code": 0,  "server_id": "e56dc762-0171-4d6e-aa56-24f2ae268c7f",  "sid": "72aabcd8-38c8-11ea-af55-42010a800031",  "time": "2020-01-17T01:27:05.07Z",  "uid": "4b493296-7df2-4ec7-9282-a19c0d98e261",  "user": "test-user"}{  "cgroup_id": 4294967355,  "code": "T4002I",  "dst_addr": "104.24.97.116",  "dst_port": 80,  "ei": 0,  "event": "session.network",  "login": "root",  "namespace": "default",  "pid": 2315,  "program": "curl",  "server_id": "e56dc762-0171-4d6e-aa56-24f2ae268c7f",  "sid": "72aabcd8-38c8-11ea-af55-42010a800031",  "src_addr": "10.128.0.49",  "time": "2020-01-17T01:27:05.145Z",  "uid": "42831223-1da2-4b26-a783-08060fd8d7b1",  "user": "test-user",  "version": 4}

此時(shí),我們可以看到用戶(hù)將以?xún)煞N方式運(yùn)行curl程序。第一種就是程序執(zhí)行本身,第二種方法就是程序的行為,curl將會(huì)發(fā)送一個(gè)網(wǎng)絡(luò)請(qǐng)求。

當(dāng)然了,你也可以嘗試運(yùn)行其他內(nèi)容,比如說(shuō)經(jīng)過(guò)混淆處理的命令等等,你同樣可以在日志中查看到執(zhí)行結(jié)果。

關(guān)于BPF中怎么將SSH會(huì)話(huà)轉(zhuǎn)換為結(jié)構(gòu)化事件問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI