摘要 ACL(Access Control List,訪問控制列表)系統是一種軟件,它能夠為你的計算機提供更好的訪問控制。Grsecurity是眾多Linux ACL系統中比較典型和成熟的一種。這個文檔是grsecurity工程的一個官方文檔,是我最近在研究Linux的ACL系統時,順便翻譯的。和lids之類的系統一樣,grsecurity比較復雜,而且文檔裡面有很多地方也語焉不詳,所以出現錯誤在所難免。 簡介 1.什麼是ACL系統? ACL(Access Control List,訪問控制列表)系統是一種軟件,它能夠為你的計算機提供更好的訪問控制. 2.為什麼需要ACL系統? 訪問控制系統的作用是限制包括root用戶在內的所有用戶對文件、能力、資源或者套接字的訪問。這是一種合法性訪問控制(Mandatory Access Control)模型。隨著對系統安全性的日益關注,出現了很多針對Linux系統的訪問控制系統。這些Linux ACL系統多數是以內核補丁的形勢出現的,Grsecurity是其中比較典型和成熟的一種。使用grsecurity,系統管理員可以賦予進程盡可能小的權限,從而使攻擊者即使獲得了root權限也無法控制整個系統。 3.支持的特征 grsecurity具有以下功能: 基於進程的訪問控制; 基於進程的資源限制; IP訪問控制; 阻止進程暴力攻擊的限制; 完全智能的學習模型; 可讀的配置文件; 一個智能化的用戶空間管理工具; 通過include指令,支持附加的ACL配置。參數是一個目錄或者一個文件; O(1)搜索算法; 管理員模式; 能力和ACL的繼承。 安裝Grsecurity系統 1.下載grsecurity內核補丁和管理工具gradm 從grsecurity的官方網站http://www.grsecurity.net,我們可以獲得最新版本的grsecurity內核補丁和管理工具gradm的源代碼。本文將以Redhat 7.3和最新版本的Linux-2.4.19內核為例進行討論。 2.安裝grsecurity內核補丁 下載完成之後,我們開始安裝。進入內核源代碼所在的目錄,給內核源代碼打上grsecurity補丁: [nixe0n@nixe0n nixe0n]$ cd linux-2.4.19 [nixe0n@nixe0n linux-2.4.19]$ patch -p1 <../grsecurity-1.9.6-2.4.19.patch 然後在配置菜單中打開grsecurity支持的選項(相關選項的功能稍後將詳細介紹),重新編譯內核: [nixe0n@nixe0n linux-2.4.19]$ make menUConfig [root@nixe0n linux-2.4.19]# make dep&&make bzImage&&make modules&&make modules_install [root@nixe0n linux-2.4.19]# cp arch/i386/boot/bzImage /boot/GRSecKernel 最後,使用自己喜歡的編輯器在/boot/grub/menu.lst文件中把GRSecKernel加入啟動菜單。 安裝grsecurity管理工具gradm Grsecurity系統的管理工具叫做gradm,下載了最新版本的gradm之後,只要使用如下命令就可以完成編譯和安裝: tar –zxf gradm-.tar.gz cd gradm make make install 執行了make install命令時,需要定義一個管理Grsecurity ACL系統的密碼。為了系統的安全性,應該使密碼足夠長,另外不要使這個密碼和root賬戶的密碼相同。 Grsecurity的配置 1.Grsecurity ACL的結構 grsecurity ACL規則由主題進程和對象組成。主題進程是被執行的進程;對象是文件、資源、能力(capability)和對IP的訪問控制。系統的主要訪問控制列表文件位於/etc/grsec/acl,如果沒有這個文件,啟動grsecurity系統時就會報錯。 grsecurity ACL規則的結構如下所示:
{ [+-] connect { /:-
} bind { /:-
} } 2.grsecurity ACL規則的一些約定 grsecurity的訪問控制規則包含一些需要注意的問題。使用時一定要記住這些約定,才能准確地利用其加強系統的安全性。這些約定包括: 所有的路徑必須是絕對路徑; 如果要禁止對某個文件的訪問,只要忽略模式(mode)參數就可以了; 使用include關鍵詞,可以在規則中包含已經定義過的規則,例如: include grsecurity訪問控制規則支持注釋,絕大多數UNIX系統的配置文件以及shell等腳本都是用#作為注釋行的開頭,grsecurity規則也是; 主題和對象不必是文件,他們也可以是有效的目錄; 主題的模式包括:h、p、v、k和o(稍候我們將詳細介紹); 對象的模式包括:r、w、x、a、h、i和o(稍候我們將詳細介紹); 能力(capabilities)只有i一種模式; 不管如何配置,都至少需要一個默認的ACL,它的主題是/。如果沒有,在啟動grsecurity ACL系統時,gradm會告訴你缺少默認ACL; 任何主題進程的ACL規則都應該包含一個/對象; CAP_ALL不是一個真正的能力,只是為了方便,讓它表示所有的能力。例如,如果想要去掉CAP_SETUID之外的所有能力,可以使用-CAP_ALL和+CAP_SETUID實現; 傳統的UNIX中,只有文件系統被賦予了訪問權限才能訪問文件系統上的文件,grsecurity ACL系統也是如此。 3.模式及其含義 3.1.主題進程的模式 在grsecurity ACL系統中,主題有如下模式: h 這個進程是隱藏的,只能夠被具有v模式的進程看到; v 具有這個模式的進程擁有察看隱藏進程的能力; p 進程是受保護的,這種模式的進程只能被具有k模式的進程殺死; k 具有這個模式的進程可以殺死處於保護模式(p)的進程; l 為這個進程打開學習模式; o 撤銷ACL繼承 3.2.對象的模式 grsecurity訪問控制規則中的對象可以有如下模式: r 這個對象可以打開閱讀; w 這個對象可以打開寫或者添加; o 這個對象可以打開添加; h 這個對象是隱藏的; i 這個模式只用於二進制可執行文件。當這個對象被執行時,它繼承所在主體進程的訪問控制列表; 4.繼承 在grsecurity ACL系統中,存在一個叫做繼承(inheritance)的特征,它和C++種的繼承極為類似。繼承包括兩種方式,第一種和配置文件有關,而第二種和內河對ACL的處理方式有關。除了主題包含o模式的規則以外,所有的ACL規則都可以使用繼承。在ACL配置文件中有一些簡單的規則來控制繼承: 對於當前規則的某個對象,如果父ACL規則中存在對這個對象的訪問控制,grsecurity就會比較兩個規則所作的限制,盡量使當前規則允許的權限不大於父規則允許的權限,除非當前規則的被定義為o模式。 如果當前ACL規則中沒有對某個對象的限制,grsecurity會自動使用父規則對這個對象的限制。 4.1.繼承示例 為了便於理解,我們舉幾個有關繼承的例子: / { / rwx /etc rx /usr/bin rx /tmp rw } /usr/bin/mailman { /tmp rwxo } 這兩個涉及到繼承的ACL規則展開後,將是如下形式: / { / rwx /etc rx /usr/bin rx /tmp rw } /usr/bin/mailman { / rwx /etc rx /usr/bin rx /tmp rwx } 在/usr/bin/mailman和/兩個規則都包含對/tmp對象的訪問控制。而在/usr/bin/mailman規則中,/tmp對象具有o模式,因此/規則中對/tmp對象所作的限制將被忽略。 grsecurity系統采用的繼承算法不僅僅只計算對父規則的繼承(例如:/bin和/bin/su),它會按照整個路徑計算當前規則對所有祖先規則的繼承。例如,在使用一個以/usr/X11R6/bin/XFree86為主題的訪問控制規則時,grsecurity會自動地計算/usr/X11R6/bin、/usr/X11R6、/usr、/等規則設置的訪問控制。 針對很多可執行文件的訪問控制都有一些共性的設置,為了減少重復設置,grsecurity才引入繼承的特征。在某些特殊的規則中,你可以使用o主題模式,在整個規則的范圍內,禁止繼承父規則的訪問控制;也可以使用o對象模式,僅僅取消對某個對象訪問控制的繼承。 內核對於繼承的處理略有不同,在這個例子中,當執行具有i模式的對象時,內核會包含進去一個主題ACL的拷貝。這樣,你就可以賦予特定進程派生出的進程以特殊的權限。例如: / { / rwx /tmp rw } /usr/bin/mozilla { /usr/bin/mozilla-bin rxi /tmp rwxo } 在這個例子中,假設/usr/bin/mozilla是一個腳本(事實的確如此),通過它執行真正的mozilla程序/usr/bin/mozilla-bin。當/usr/bin/mozilla-bin被/usr/bin/mozilla執行時,它會繼承/usr/bin/mozilla的ACL,從而獲得了在/tmp目錄的權限。而如果用戶直接執行/usr/bin/mozilla-bin,由於訪問限制,進行不能在/tmp執行。 我們看到,i模式只能用於ACL對象,因為它涉及到對主題進程ACL的繼承。由於對象可以使文件或者能力,/usr/bin/mozilla的ACL可以是這樣的: /usr/bin/mozilla { /usr/bin/mozilla-bin rxi /tmp rwxo +CAP_SYS_RESOURCE i } 有關能力繼承的操作也有些不同。因為在一個文件對象上的繼承,造成被執行的文件繼承主題ACL的所有對象,包括主題ACL的能力。而如果為能力對象設置了i模式,會造成所有可執行文件繼承主題的能力。因此,如果/usr/bin/mozilla腳本會執行/bin/hostname和/usr/bin/mozilla-bin兩個程序,而你只要/usr/bin/bin/mozilla-bin繼承CAP_SYS_RESOURCE能力,你應該使用如下設置: /usr/bin/mozilla { /usr/bin/mozilla-bin rxi /tmp rwxo +CAP_SYS_RESOURCE } 最後,還要注意一個問題,只有應用程序是通過fork()系統調用接著執行exec系統調用,或者只執行exec系統調用時,i模式才能達到期望的效果。如果應用程序是通過system()系統調用執行程序,你將不會得到自己想要得結果,因為應用程序首先要執行一個shell,由shell在執行你需要執行的程序。 5.配置文件的匹配流程 為了能夠理解如何編寫正確的ACL配置文件,你需要理解grsecurity ACL系統是如何匹配指定的配置文件的。下圖是一個ACL匹配的流程圖。其中亮藍方框表示用戶的行為;亮綠方框表示內核的行為。綠色箭頭表示一個成功的操作;紅色箭頭表示一個失敗的操作: 從圖中你可以看到,為了建立一個對給定配置文件的匹配,grsecurity會順著父目錄向下搜索知道發現對指定目錄的ACL對象。對象的匹配是按照首次匹配的原則,也就是grsecurity使用首先發現的ACL對象作為對指定目錄的ACL。而訪問一個文件的權限不倚賴於對文件父目錄的訪問權限。