通過綜合采用用戶級別的top、ps等系統工具以及Linux內核防護技術,我們可以從用戶/內核兩個層次全方位地保護Linux系統中重要系統進程以及用戶進程的安全性。
經典的信息保密性安全模型Bell-LaPadula模型指出,進程是整個計算機系統的一個主體,它需要通過一定的安全等級來對客體發生作用。進程在一定條件下可以對諸如文件、數據庫等客體進行操作。如果進程用作其他不法用途,將給系統帶來重大危害。在現實生活當中,許多網絡黑客都是通過種植“木馬”的辦法來達到破壞計算機系統和入侵的目的,而這些“木馬”程序無一例外的是需要通過進程這一方式在機器上運行才能發揮作用的。另外,許多破壞程序和攻擊手段都需要通過破壞目標計算機系統的合法進程尤其是重要系統進程,使得系統不能完成正常的工作甚至無法工作,從而達到摧毀目標計算機系統的目的。作為服務器中占絕大多數市場份額的Linux系統,要切實保證計算機系統的安全,我們必須對其進程進行監控和保護。
用戶級進程監控工具
Linux系統提供了who、w、ps和top等察看進程信息的系統調用,通過結合使用這些系統調用,我們可以清晰地了解進程的運行狀態以及存活情況,從而采取相應的措施,來確保Linux系統的安全。它們是目前在Linux下最常見的進程狀況查看工具,它們是隨Linux套件發行的,安裝好系統之後,用戶就可以使用。
1、who命令:該命令主要用於查看當前在線上的用戶情況。系統管理員可以使用who命令監視每個登錄的用戶此時此刻的所作所為。
2、w命令:該命令也用於顯示登錄到系統的用戶情況,但是與who不同的是,w命令功能更加強大,它不但可以顯示有誰登錄到系統,還可以顯示出這些用戶當前正在進行的工作,w命令是who命令的一個增強版。
3、ps命令:該命令是最基本同時也是非常強大的進程查看命令。利用它可以確定有哪些進程正在運行及運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等。ps命令可以監控後台進程的工作情況,因為後台進程是不和屏幕鍵盤這些標准輸入/輸出設備進行通信的,如果需要檢測其情況,可以使用ps命令。
4、top命令:top命令和ps命令的基本作用是相同的,顯示系統當前的進程及其狀態,但是top是一個動態顯示過程,可以通過用戶按鍵來不斷刷新當前狀態。如果在前台執行該命令,它將獨占前台,直到用戶終止該程序為止。比較准確地說,top命令提供了實時的對系統處理器的狀態監視。它可以顯示系統中CPU最“敏感”的任務列表。該命令可以按CPU使用、內存使用和執行時間對任務進行排序,而且它的很多特性都可以通過交互式命令或者在個人定制文件中進行設定。
需重點監控的一些進程
由上面的介紹可知,Linux提供的這些命令都能提供關於進程的一些信息,可以通過它們查看系統當前的進程狀況,也可以找出那些占用了過多系統資源的進程並結束該進程。它們的優點在於速度快,透明性好,直觀明了。下表給出了Linux系統中較為常見的重要的進程(沒有完全列出,用戶可以參考相應的資料),用戶可以采用上述工具來實時的監測這些重要進程的情況,並采取相應的防護措施。
系統調用存在缺點
我們上述所介紹的進程監控方法和工具都是基於調用操作系統給我們提供的相應的API接口函數或者系統調用來實現的。我們所得到的只是接口函數處理後的結果,不能夠主動地從操作系統內核的進程數據結構當中獲取我們需要的信息。因而,它們具有如下缺點:
1、傳統的進程監控方法運行效率比較低,同時反應時間也比較長,實時性能差。
2、不能夠實時、高效地向用戶報告當前系統運行的安全狀況,就算系統中有不法進程在運行,系統也不能識別出來。
3、不能給用戶捕捉不法進程的行為提供證據和進程的活動軌跡。當一個不法進程運行並對系統產生破壞時,用戶即使通過察看進程列表找到了不合法的進程,也不清楚到底從進程開始運行直到捕捉到這樣一個不法進程這樣一段時間內,進程都對系統造成了哪些破壞,比如說,訪問、修改了哪些重要的系統文件,占用了哪些系統資源等等。這些都給以後的恢復和處理工作帶來了很大的問題。
4、執行程序工作在用戶態,本身就不安全,入侵系統的黑客可以輕松地找到這些進程監控程序的磁盤映像,進行刪除甚至替換,從而會給系統帶來不可估量的損失。這一點尤其需要強調,比如說,黑客入侵系統成功,就可以植入他們所改寫的ps程序以替換原來系統的ps程序,這樣就使得用戶不能通過該工具得知系統中當前運行的不法進程,這樣無論黑客如何植入木馬或者其他程序,用戶都無法知道,從而無法采取措施終止這些行為。不言而喻,這樣的後果是很嚴重的。而在我們下面所要介紹的一種運行於內核的進程監控程序當中,黑客根本無法或者很難深入內核來破壞該進程監控程序,從而使其能夠很好地保證自身的安全。
基於上述種種不足,我們提出了在Linux內核中實現進程實時監控的原理和技術。該技術主要分為以下幾個步驟:
首先,在“干淨”的系統環境下,全面地運行系統中的安全進程,分析和搜集Linux環境下這些進程的相關信息(包括進程ID號、進程名稱、進程可執行映像、進程的開始時間、進程的父進程等主要信息),形成一張“系統安全進程列表”,作為進程監控的依據。
接著,監控代碼在進程調度過程中實時地搜集系統中運行進程的信息。如果發現進程不在 “系統安全進程列表”當中,則馬上通過終端輸出該進程的PID號、名稱、進程的可執行映像等信息,或者通過聲音向用戶報警,等待用戶處理,在這個等待的過程中,終止調度該進程,直到用戶做出響應(放行該進程或者殺死該進程)。
在第二步當中,如果超級用戶(系統管理員)放行了該進程,則可以將該進程加入“系統安全進程列表”,以完善該列表;如果是一般用戶在使用過程當中放行了某個進程,那麼,需要將該用戶的用戶名和身份記錄下來,並且將放行的進程記錄下來存為日志,那麼,當超級用戶(系統管理員)無論是在審核用戶行為還是在修改“系統安全進程列表”時,都是一個有力的依據。
另外,在系統運行過程當中,如果發現“系統安全進程列表”當中的某些重要的進程 (包括kswapd、bdflush等)不在運行,則馬上將該進程“遺失”的信息存入文件,以備在系統的恢復過程當中,對它們進行針對性的恢復,根據不同的情況,有的需要馬上停機,恢復進程,有的則可以現場恢復