企業(yè)級Linux系統(tǒng)下的進程安全管理方法
在企業(yè)級的Linux應用中,進程是整個計算機系統(tǒng)的一個主體,它需要通過一定的安全等級來對客體(包括系統(tǒng)中的文件、數據、設備等)發(fā)生作用。進程在一定條件下可以對諸如文件、數據庫等客體進行操作。如果進程用作其他不法用途,將給系統(tǒng)帶來重大危害。在當前形形色色的面向Linux系統(tǒng)的攻擊中,許多網絡黑客都是通過種植“木馬”的辦法來達到破壞計算機系統(tǒng)和入侵的目的,而這些“木馬”程序無一例外的是需要通過進程這一方式在系統(tǒng)中運行才能發(fā)揮作用的。
作為服務器中占絕大多數市場份額的Linux系統(tǒng),要切實保證計算機系統(tǒng)的安全,我們必須對其進程進行安全管理。
Linux進程管理的方法主要包括:(1)確定并綜合分析系統(tǒng)中當前運行進程的狀態(tài)及信息,包括內存、CPU、執(zhí)行用戶身份、進程ID等,以確定其是否合法以及狀態(tài)是否正常;(2)事先限制進程所占用的系統(tǒng)資源,如文件系統(tǒng)資源和派生進程數目等,以合理控制進程的運行狀況。下面將對這些手段進行詳細介紹。
一、管理手段一:使用基本命令進行進程查看
傳統(tǒng)的方法可以通過Linux系統(tǒng)的一些基本命令進行Linux系統(tǒng)的進程查看和分析。Linux系統(tǒng)提供了who、w、ps和top等察看進程信息的系統(tǒng)調用,安全工作者可以通過結合使用這些系統(tǒng)調用,清晰地了解進程的運行狀態(tài)以及存活情況,從而采取相應的措施,來確保Linux系統(tǒng)的安全。
其中,who命令主要用于查看當前在線上的用戶情況。系統(tǒng)管理員可以使用who命令監(jiān)視每個登錄的用戶此時此刻的所作所為;w命令也用于顯示登錄到系統(tǒng)的用戶情況,但是與who不同的是,w命令功能更加強大,它不但可以顯示有誰登錄到系統(tǒng),還可以顯示出這些用戶當前正在進行的工作,w命令是who命令的一個增強版;ps和top命令則是最基本同時也是非常強大的進程查看命令。使用這些命令可以動態(tài)和靜態(tài)地確定有哪些進程正在運行和運行的狀態(tài)、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等。
舉個例子,黑客在入侵系統(tǒng)后通過植入一些系統(tǒng)本沒有的非法進程來留作“后門”,以達到下次使用該系統(tǒng)資源或者利用該系統(tǒng)作為“肉雞”發(fā)動拒絕服務等來攻擊其他目標主機的目的,而我們就可以結合上述命令來找出異常進程。
二、管理手段二:使用進程文件系統(tǒng)進行管理
管理手段一中所使用的命令行方式對Linux系統(tǒng)中的進程管理比較粗略和不全面,如果要進行全面地管理,可以借助進程文件系統(tǒng)(即PROC文件系統(tǒng))來獲取系統(tǒng)中運行進程所占用的內存、CPU、中斷、命令行等情況,以輔助安全管理員進行惡意進程的發(fā)現(xiàn)和排查。
PROC文件系統(tǒng)是一個虛擬的文件系統(tǒng),通過文件系統(tǒng)的接口實現(xiàn),用于輸出系統(tǒng)的運行狀態(tài)。它以文件系統(tǒng)的形式,為操作系統(tǒng)本身和應用進程之間的通信提供了一個界面,使應用程序能夠安全、方便地獲得系統(tǒng)當前的運行狀況和內核的內部數據信息,并可以修改某些系統(tǒng)的配置信息。另外,由于PROC以文件系統(tǒng)的接口實現(xiàn),因此用戶可以像訪問普通文件一樣對其進行訪問,但它只存在于內存之中,并不存在于真正的物理磁盤當中。所以,當系統(tǒng)重啟和電源關閉的時候,該系統(tǒng)中的數據和信息將全部消失。
表1說明了該文件系統(tǒng)中一些重要的文件和目錄。
表1重要的PROC文件系統(tǒng)文件和目錄
下面舉個簡單的例子,說明安全管理員如何來全面查看系統(tǒng)中一個運行進程的相關信息。
(1)進程的基本信息都會存放在/proc文件系統(tǒng)中,具體位置是在/proc目錄下。通過使用如下命令可以查看系統(tǒng)中運行進程的相關信息,如圖1所示,其中顯示為系統(tǒng)中運行進程的信息所存放的目錄,每個進程對應一個目錄,3193為例子使用的進程的詳細信息所在目錄:
圖1/ls/proc命令顯示結果
(2)切換到3193目錄,以方便詳細的查看進程信息,并列出進程詳細的狀態(tài)信息文件,如圖2所示:
圖2進程3193信息所在目錄
(3)在這些文件當中,status這個狀態(tài)文件是比較重要的,包含了很多關于進程的有用的信息,用戶可以從這個文件獲得信息,如下所示:
其中,比較重要的字段詳細含義如下:
Name:scientific_comp//進程名
State:R(running)//進程運行狀態(tài)
Tgid:3193//進程組ID
Pid:3193//進程ID
PPid:3123//父進程ID
TracerPid:0//跟蹤調試進程ID
Uid:6004600460046004//進程所對應程序的UID
Gid:6004600460046004//進程所對應程序的GID
FDSize:256//進程使用文件句柄大小
Groups:6004//組信息
這樣,安全管理員就可以通過進程名、進程ID、父進程ID、UID、GID等信息來綜合判定系統(tǒng)中進程的合法狀態(tài),以捕捉非法進程,并進行后續(xù)處理。
三、管理手段三:限制進程使用的資源
在系統(tǒng)使用過程中,一些用戶編寫的進程可能無意識地創(chuàng)建一些大型的文件或者派生(fork)過多地進程,從而過度消耗系統(tǒng)資源,引起系統(tǒng)的不穩(wěn)定。同時,一些病毒也可能有派生多個進程的行為出現(xiàn),如臭名昭著的“震蕩波”病毒。這些都使得我們有必要來限制進程使用的資源,保證系統(tǒng)安全。
為了防止進程或者其子進程創(chuàng)建大型文件,可以使用ulimit命令來進行限制,具體的命令使用ulimit–f后接以K字節(jié)為單位指定的最大文件尺寸。圖3舉出了一個具體的例子加以說明。在該例子中,首先采用ulimit命令限制當前shell進程可以創(chuàng)建的文件大??;然后,采用yes命令不斷寫入大量的字符串到test.txt文件中,該文件大小超過了ulimit命令許可的范圍,結果系統(tǒng)提示文件超過了大小,并終止了yes命令的不斷寫入過程。從后面使用ls命令來查看test.txt文件的大小來看,ulimit命令很好地將該文件大小限制在20KB的范圍之內。
圖3ulimit命令使用示意
在實際的使用過程中,用戶可以降低自身的限制值,但是不能增加限制值。并且,只有root用戶才能在/etc/profile文件中增加ulimit選項的設置。因此,圖4中所示的增加自身限制值大小的操作是被禁止的;反之,圖5種所示的root用戶的操作就是允許的(請讀者注意圖4和圖5中使用不同的用戶進行操作)。
圖4不允許非root用戶增加ulimit值
圖5允許root用戶增加ulimit值
另外,值得注意的是:雖然能夠采用ulimit值來限制進程創(chuàng)建文件的大小,但是該機制并不能保證用戶創(chuàng)建多個相同大小的文件。比如,ulimit的限制值是20KB,那么該機制只能限制進程創(chuàng)建的單個文件大小不能超過20KB,而不能限制進程創(chuàng)建10個甚至100個20KB大小的文件。
Ulimit命令還可以用來限制單個用戶(父進程)所能調用的最大子進程個數,以避免某個父進程由于無所限制的創(chuàng)建子進程而造成整個系統(tǒng)崩潰。
圖6給出了一個使用ulimit命令限制子進程無限調用的例子。首先,使用腳本編輯來自動生成進程;然后,使用ulimit命令來限制父進程調用的最大子進程個數為8。最后,可以看到當創(chuàng)建到第9個時,系統(tǒng)報錯并阻斷子進程的再度調用。
圖6使用ulimit限制單個用戶調用的最大進程個數
【編輯推薦】