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