您好,登錄后才能下訂單哦!
BPF中怎么將SSH會話轉換為結構化事件,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1、混淆處理-比如說下列命令:
echo Y3VybCBodHRwOi8vd3d3LmV4YW1wbGUuY29tCg== | base64 –decode | sh
當該命令解碼后即為“curl http://www.example.com”,但是SSH會話記錄中并不會包含curl命令。
2、Shell腳本-如果用戶上傳并執行了一個腳本,那么腳本中的命令將無法被會話記錄捕捉到,而是直接將腳本文件輸出。
3、終端控制-終端支持各種控制命令,最常用的應該是sudo了,禁用終端的echo將允許我們在運行命令的同時不會被SSH會話記錄捕捉到。
為了解決這個問題,Teleport需要一種方法來在會話持續的過程中將非結構化的SSH會話轉換為結構化的事件流。那么這種結構化事件流中應該包含什么呢?
我們對多種方法進行了研究,我們研究的內容從諸如regex模式匹配之類的特殊方法到更復雜的嘗試,比如自己解析原始SSH會話。我們還研究了Linux提供的各種API和系統,如Audit、fanotify和BPF。
1、減小誤報,理想情況下為0。如果你的系統誤報率非常高,那么你對警報的關注度可能會因此而減少,這將導致關鍵問題被忽略。
2、減少由監控所引起的任何性能影響,理想情況下為0,這也能減輕向用戶添加額外資源的負擔。
這些特定的方法都會存在誤報的問題。我們在解析和解釋組成SSH會話的字節流時,無法在不引起錯誤警告的情況下保證數據的準確率。而且由于性能方面的原因,我們排除了Linux Audit。
Brendan Gregg,是BPF程序的開發人員,他經常將BPF描述為一種“新型軟件”。BPF允許用戶空間程序以安全和高效的方式在內核的某些位置設置鉤子并發出事件。
安全和性能意味著什么?在這種情況下,“安全”意味著BPF程序不能陷入無限循環中,導致系統崩潰。BPF程序不太可能像內核模塊那樣使整個操作系統崩潰。BPF程序也有性能,如果不能足夠快地使用事件,則會刪除事件,而不是拖累整個系統的性能。
Teleport當前使用了三個BPF程序:execsnoop用于捕捉程序執行,opensnoop用來捕捉程序所打開的文件,tcpconnect用來捕捉程序建立的TCP鏈接。
為了更好地了解這三個BPF程序的功能,大家看看我們在運行“man ls”命令時,execsnoop捕捉到的內容:
# ./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
現在你也許已經了解了BPF程序的功能了,簡單的“man”命令,原來后面有這么多其他的程序在執行。
Teleport已將這三個程序的代碼嵌入在了自己的庫中,當我們啟用了增強型會話記錄功能之后,它便會執行這些程序。
就其本身而言,這些程序都是用于調試和跟蹤的優秀工具,因為它們可以告訴我們整個系統在執行哪些操作。事實上,這就是我們最開始選擇這些工具的目的:我們使用它們來調試Teleport遇到的一些問題,而這些問題可能會導致它在某些場景中耗盡文件描述符。但是,我們使用Teleport的目的各有不同,我們有時需要將程序執行與SSH會話以及標識符關聯起來。
為了將程序執行與特定的SSH會話關聯起來,我們選擇使用cgroup(cgroupv2)。當Teleport啟動SSH會話時,它首先會重新啟動并將自己放置在cgroup中。這將允許程序對當前進程以及Teleport將要啟動的所有進程進行跟蹤,并分配唯一標識ID。Teleport所運行的BPF程序還可以發出執行它們的程序的cgroup ID,這允許我們將事件與特定的SSH會話和標識關聯起來。
了解了關于BPF的相關內容之后,你也可以將增強型會話記錄功能引入你自己的程序之中,腳本代碼已托管至GitHub【傳送門】。
首先啟動Ubuntu 19.04或RHEL/CentOS 8 VM并運行上面鏈接提供的腳本。該腳本只會安裝內核頭和bcc-tools,這些都是增強型會話記錄運行的前提條件。除此之外,它還會安裝jq,這樣更有助于可視化查看結構化事件流。
yum install -y kernel-headers bcc-tools
或
apt install -y linux-headers-$(uname -r) bpfcc-tools
如需啟用Teleport中的增強型會話記錄功能,請將下列內容添加至配置文件中:
ssh_service: enhanced_recording: enabled: yes
當你以本文說明的方式在終端中執行“curl http://www.gravitational.com”時,你將會看到下列輸出內容:
{ "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}
此時,我們可以看到用戶將以兩種方式運行curl程序。第一種就是程序執行本身,第二種方法就是程序的行為,curl將會發送一個網絡請求。
當然了,你也可以嘗試運行其他內容,比如說經過混淆處理的命令等等,你同樣可以在日志中查看到執行結果。
關于BPF中怎么將SSH會話轉換為結構化事件問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。