Linux系統行為新型實時監控技術
萬物互聯和大數據技術的發展,讓我們的生活更加活色生香,其背后離不開安全、穩定可靠的服務器系統。
為了保障服務器系統資源能被用戶正常使用,避免被惡意行為劫持,我們需要記錄服務器系統資源的使用情況、系統行為事件信息和I/O流量等信息,為服務器系統的運維和安全保障工作提供可靠的數據支撐。
這里我們主要是從系統日常行為安全的角度分享一種能滿足線上部署、能夠將進程或文件創建、網絡連接、網絡I/O、文件I/O、shell操作、數據庫操作、telnet操作、http訪問、系統調用(syscall)和系統資源信息等系統相關的行為信息實時采集和存儲的Linux行為監控技術。
傳統監控技術
現有系統行為監控的實現技術主要采用以下方法:
1.Linux Kprobes調試技術
Kprobes調試技術是一種專為Linux內核跟蹤和調試而設計的特定API。Kprobes允許內核開發人員為任何內核指令以及函數入口和函數返回處理程序安裝預處理程序和后處理程序,這些處理程序可以訪問并更改寄存器。這樣一來,內核開發者們就可以監控系統調用相關工作流程并簿記。利用Kprobes技術,內核開發人員可以在內核的絕大多數指定函數中動態地插入探測點來收集所需的調試狀態信息;關于“調用了哪些系統”、“系統何時被調用”、“執行是否正確以及函數的入參和返回值是什么”等疑惑都可以輕松解決。此外,還能將這些信息屏幕輸出或轉儲日志文件。
2.Linux內核的tracepoints(跟蹤點)技術
內核的tracepoint是一種輕量級的hooks技術,使用高效的系統調用行為跟蹤及相關性能計算,對系統本身的性能只有微小的時間損失和空間損失。通過注冊syscall_enter_probe等定制的probe函數,在發生系統調用相關行為后,內核找到probe函數,并將參數等信息傳遞給probe函數。只要將probe函數中記錄的相關行為信息輸出,即可達到監控目的。
在現有的Linux系統行為監控工具中,采用Linux Kprobes調試技術、Linux內核的tracepoints(跟蹤點)技術的工具有:strace、ftrace、tcpdump、lsof、htop、iftop、systemTap、perf……
以上的工具通常只能作為日常內核開發調試或日常運維分析工具來使用,主要用于開發調試或問題定位等簡單的信息輸出。然而,這些工具存在一些使用缺陷,可以總結為以下幾點:
1、僅適用于內核開發人員調試使用或是運維人員在現場開啟使用,各工具特點不一,難以滿足系統全面監控的需求。
2、沒有提供行為數據的良好存儲能力,只提供簡單的輸出或是日志存儲。由于沒有數據緩存功能,容易造成行為數據的丟包,不能很好地支撐事后數據回放或分析。
3、不能進行線上運行的實時部署,只能在事后或事中開啟,無法滿足運維或安全監控的自動化要求。在高吞吐、高并發的服務器上,增加了服務器運行的負擔。
新型實時監控緩存技術方案
針對現有技術無法滿足線上實時部署、影響服務器性能、行為數據不具備良好的存儲和緩存功能等缺陷,我們給大家分享一種具備實時監控和緩存功能的技術方案。
該方案主要是采用分層結構的模型進行架構的,具體分為內核probe層、基于內存映射mmap技術的buffer層、基于本地數據庫的用戶態緩存層。具體結構如下圖:
業務流程描述
下面通過一個具體的系統行為事件信息采集-緩存的例子,來說明這三層之間的業務流關系:
首先,當用戶發起網絡連接服務主機操作,在服務主機系統中將發生socket accpet系統調用中斷,服務進程陷入內核態,進入系統調用例程。
其次,通過Linux內核tracepoints機制,內核查找系統調用tracepoint的probe函數;此時,內核查到已經掛載的內核probe層的probe函數,并將相應accpet系統調用參數信息傳入probe函數。
接下來,內核probe層的probe函數將傳來的系統調用相關信息進行分類、序列化處理后,將相關參數信息轉化為系統行為事件信息寫入mmap buffer層。
最后,用戶態緩存層進程通過mmap映射技術,從mmap buffer層讀取具體的系統行為事件信息,將系統行為事件信息再次格式化為易于閱讀和分析的字符串信息,并選擇一種本地或分布式的緩存技術,持久化存儲系統行為事件信息。
通過上述業務流程的分析,可以概括出上述三層主體功能分別為:內核probe層采集系統調用信息、mmap buffer層轉化系統行為事件信息、用戶態緩存層持久化系統行為事件信息。如下圖所示:
通過上文可以得知,本方案與目前現有工具或方案的主要區別在于本方案體現了以下兩方面:實時性、緩存持久化。
實時性
“實時性”就是指系統操作行為(系統調用)信息能夠實時感知,“零損耗”地對信息進行采集。
我們知道系統行為信息的采集是由“內核probe層”完成的,在該層中主要也是采用了Linux內核字符設備驅動技術+Linux tracepoints機制。通過開發Linux內核字符設備驅動來驅動probe模塊,在probe模塊中掛載tracepoint函數,采集各系統調用的相關信息。
為了實現系統調用信息從內核probe層到用戶態緩存層的“Zero copy”高效傳遞,在probe層與用戶態緩存層采用了Linux內核驅動與用戶態進程實現地址共享的mmap buffer 技術方案。
緩存持久化
經過內核probe層采集的系統行為事件信息存放在mmap buffer層中,為了實時高效地將這些事件信息持久化存儲,本方案采用了一種開源高效的本地文件數據庫引擎,該引擎占用資源少、無需安裝和管理配置、數據吞吐率每秒可達上萬條記錄。這樣輕型的持久化模塊,可以通過“零損耗”的方式部署到線上服務器,而不占用服務器資源。
從mmap buffer層中讀取到系統行為事件信息,在用戶態緩存層還可以根據具體業務的要求,做一些數據處理分析,如格式化、過濾等。最終存放到文件數據庫中,從而實現系統行為事件信息的持久化緩存。具體流程如圖:
如若轉載,請注明原文地址。