selinux學習筆記

SElinux(Security Extend linux)

Red hat Enterprise 5支持內核實施的一項新的安全策略:SElinux。SElinux是由美國國防部讓安全局針對計算機基礎結構開發的,SElinux允許管理員定義高度靈活的策略,讓linux內核把它作爲日常操作的一部。

SElinux將每個程序都編入到SElinux域內,同時將每個資源放在SElinux安全上下文中,然後根據SElinux策略定義哪個進程可以訪問哪些資源。

Redhat 5支持的SElinux策略叫做目標策略,隻影響指定的網絡守護進程。在目標策略中,只有目標進程受到SElinux的限制,其它進程則不受限制,目標策略隻影響常用的網絡應用程序,在RHEL5中,受限制的網絡服務程序數量在200個以上,SElinux限制的典型應用程序如下:

dhcpd、vsftpd、httpd、mysqld、nscd、named、portmap、squid、syslogd等

SElinux的三種狀態模式:

1、 Enforcing:強制模式,此模式情況下,任何違反SElinux策略的行爲都被禁止,並被作爲內核信息記錄下來,圖形界面下會跳出來一個黃色五角星提醒你,並提供解決辦法,命令行下運行tail  /var/log/messages |grep  run命令,將過濾出來的內容複製run後面的內容運行。

2、 Permissive:警告模式,此模式情況下,任何違反SElinux策略的行爲都不會被阻擋,只是會提醒警告用戶,這個模式可以排錯用。

3、 Disabled:關閉模式,此模式是不啓用SElinux,和沒有它是一樣的。

SElinux配置文件:/etc/sysconfig/selinux,如圖:

可以通過修改它改變SElinux狀態;SELINUXTYPE參數用於指定SElinux使用什麼策略模塊保護系統,在RHEL5中默認使用的爲targeted模塊,這個模塊是由redhat開發的策略模塊,只對Apache、sendmail、bind等網絡服務進行保護,不屬於這些服務的就都屬於unconfined_t,該模塊可導入性高,可用性好,但不能對整體進行保護。

也可以在圖形化界面下打開終端輸入system-config-securitylevel,通過圖形界面改變它的工作狀態,如圖:

需要注意的是:SElinux狀態在強制模式和警告模式之間切換是不用重啓計算機的,如果改成禁止模式後則必須要重啓計算機才能生效。

那麼怎麼判斷它當前的狀態呢?通過命令即可查看:

getenforce:判斷SElinux現在處於什麼狀態

setenforce:轉換成強制或警告模式(setenforce  1轉換成強制模式,setenforce  0轉換成警告模式),如圖:

每個進程都屬於一個SElinux域(domain),而每一個文件都被賦予一個SElinux上下文的context值,那麼如何查看它們的contex值呢?

使用命令ls  -Z 或ps  -Z查看上下文contex值,如圖:

上面紅色方框中的文件SElinux上下文或SElinux域格式字符串以冒號作爲字段分隔,第一個字段爲用戶標識第二個字段爲角色(role),root和user_u表示文件是根用戶或普通用戶建立的,第三個字段爲類型,第四個爲擴展的MIS或MCS,這裏我們只關心第三個字段就可以了。

這裏我們還可以看到,大部分的網絡守護進程與系統進程都屬於特定的域類型,而sshd和ps ax -Z命令的進程域的類型確都是unconfined_t,說明它們的進程不受任何SElinux上下文的限制,特別是用戶交互式shell,任何用戶交互式shell開始的進程(除了一些特例外)都不受SElinux目標策略的影響。

下面來舉例說明文件上下文contex值的定義與SElinux的訪問控制:

如圖分別爲不同目錄下的文件context值:

仔細看上圖就會發現tmp目錄下的index.html文件context值第三個字段是tmp_t,而html目錄下的index.html文件context值第三個字段爲httpd_sys_content_t,下面我們在分別來看它們兩個文件的上一級目錄context值,如圖:

由此可以看出文件的context值是受上一級目錄影響的,一般情況下它們會繼承上一級目錄的context值,一些安裝服務產生的文件context值會例外,不繼承上級目錄的context值,服務會自動創建它們的context值,比如沒有裝http服務的時候/var/目錄下時沒有www目錄的,安裝httpd服務後該服務會自動創建出所需的目錄,並定義與服務相關的目錄及文件才context值,它們並不會繼承上級目錄的context值,如圖是var目錄的context值:

這個是安裝httpd軟件包後的www目錄context值:

 

通過上面的兩個截圖你會看出來由服務定義的目錄文件context值是不繼承它們的上一級目錄的。

我們知道了文件的context值是怎麼定義的了,那麼到底context值會給我們帶來什麼影響,它是怎麼控制服務以及我們怎麼解決呢?下面就以http服務來舉例說明。

首先我們把/var/www/html目錄下的index.html文件的context值第三段改爲tmp_t,至於怎麼更改會在後面說明,如圖:

在沒有更改前我們是能夠正常訪問網站的,如圖:

當我們更改了此文件的context值後,網站就會變得的不能正常訪問,並且會跳出一個黃色五角星提示你SElinux設置有誤,如圖:

 

這裏跳出黃色五角星提示你錯誤,並且提供解決辦法,你點擊黃色五角星會出來一個對話框,裏面有詳細的說明信息以及解決辦法,按照提示修改後即可訪問,如圖:

知道了SElinux上下文文件context值的作用後就要了解怎麼修改文件的context值了,下面介紹修改文件context值的命令:

chcon  -t  tmp_t  /var/www/html/index.html  //修改文件的context值

restorecon  -v  /var/www/html/index.html //根據SElinux的目標策略恢復文件的安全上下文(context值)

restorecon  -R(recursion)  -v  /var/www/html //根據SElinux的目標策略恢復html目錄下所有文件的安全上下文(context值)

運行提示命令恢復文件的context值後網站訪問即可恢復正常!

如果我們是在字符界面下,沒有裝圖形界面該怎麼辦呢?這個時候就要求救於我們偉大的日誌了!

首先運行tail  /var/log/messages  |grep  run,如圖:

然後根據提示運行run後面的內容就會出來解決辦法,如圖:

看到了吧,與圖形界面下出來的解決辦法一模一樣,呵呵,這下不管在什麼界面下都能解決問題了吧!

如果這個軟件包沒有安裝怎麼辦呢?首先使用rpm  -qf查看這個服務是屬於哪個軟件包,之後再使用yum安裝上,/etc/init.d/setroubleshoot  restart重啓服務即可,如圖:

注:若軟件包安裝上了,且一切正常但是黃色五角星就是不跳出來可使用sealert  -b命令讓詳細的提示信息對話框彈出來!

有的人或許會問了,我要查看每個文件的context值怎麼辦呢?總不能一個個文件查看吧,呵呵,大可不必,所有文件的context值都存放在/etc/selinux/targeted/contexts/files目錄下,你可以用cat查看!

圖形化界面下運行system-config-selinux查看,如圖:

 

如果標籤被你修改混亂無法解決後,可在這裏勾上一個選項使系統在重新啓動後重打標籤,如圖:

 

勾上這個勾之後你之前所做的操作都將被清除,那麼我們如何讓系統在重打標籤後不改變你之前定義的文件context值呢?

你可以通過以上圖形化界面將該文件context值添加進去,若是在字符界面下可運行semanage  fcontext  -a  -t  httpd_sys_content_t  ‘/myweb/html(/.*)?’命令添加進去,這樣在系統重啓重打標籤後就不會改變你自己定義的文件或目錄context值了!

Managing  Boole(管理SElinux布爾值)

什麼是SElinux布爾值呢?SEliux布爾值就相當於一個開關,精確控制SElinux對某個服務的某個選項的保護,比如ftp服務,如圖:

說明:getsebool -a //查看sebool值

  setsebllo -P //設置sebool值

舉例:getsebool -a |grep  ftp

  setsebool -P ftp_home_dir=1 //設置sebool值,1爲on,不保護,0爲off,保護

更詳細的說明可以man  ftpd_selinux來獲取幫助!

注:sebool值出新問題後同樣的也無法訪問相關的服務,系統也會跳出黃色五角星說明並提供解決辦法,與上述文件context值出現的提示一樣,這裏就不截圖說明了,自己試下吧!

補充知識

圖形化界面下打開SElinux配置工具裏boolean選項參數說明:

1、 Admin:在Admin類下,可以允許系統使用未分配的終端(ttys),允許對root目錄進行寫操作,從非標準位置讀取文件,禁止任何進程加載內核模塊,禁止任何對SElinux策略的修改,以及提供對緩衝區溢出保護的支持。

2、 Cronn:在Croon類下,可以啓用額外的規則以支持fcron調度命令,以及禁用SElinux對cron服務的保護。

3、 CVS:在使用CVS版本控制系統的情況下,可以關閉SElinux對密碼文件的保護。

4、 Databases:在使用MySQL或PostgreSQL數據庫系統的情況下,可以關閉SElinux對它們的保護。

5、 FTP:在FTP類下游6個配置項,RHEL5中的SElinux允許FTP作爲獨立於超級服務的服務(即支持vsftpd作爲常規服務運行,而不與inetd或xinetd有關聯)。允許目錄上傳,需使用public_content_rw_t標籤,同樣支持使用CIFS或NFS進行文件傳輸,允許讀寫家目錄或禁用SElinux對FTP服務器的保護。

6、 HTTPD Service:HTTPD Service類是一些SElinux指令以增強Apache服務器的安全性,主要包括以下內容:

(1) 允許apache使用mod_auth_pam

(2) 允許httpd支持CGI腳本

(3) 允許httpd守護進程對有public_content_rw_t標籤的目錄與文件寫入

(4) 允許httpd腳本和模塊連接到網絡

(5) 允許httpd腳本和模塊通過網絡連接到數據庫

(6) 允許httpd腳本對有public_content_rw_t標籤的目錄與文件寫入

(7) 允許httpd讀取家目錄

(8) 允許httpd作爲ftp服務器運行

(9) 允許httpd運行SSL與CGI在同一域中

(10) 允許httpd支持內置腳本

(11) 禁止SElinux對httpd守護進程的保護

(12) 禁止SElinux對httpd suexec(可允許httpd服務的可執行文件)的保護

(13) 統一httpd處理的所有內容文件

(14) 統一httpd連接終端需要處理的證書

7、 Kerberos:在Kerberos類下有3個配置項,一個選項允許其它進程使用Kerberos文件(默認啓用),其它兩個選項禁止SElinux對Kerberos管理進程(kadmind)和Kerberos鍵盤控制進程(krb5kdc)的保護

8、 Memory Protection:在目前版本的RHEL中,內存保護選項不與任何服務或系統關聯。

9、 Mount:在Mount類中是一些與自動掛載服務有關的控制,可以通過配置它以允許掛載者掛載任何目錄或文件,同樣也可以禁用SElinux的保護。

10、 Name Service:名稱服務器進程(named)指的是RHEL中的DNS服務,如果維護一個區域,一般會希望允許named進程可以覆蓋主域文件,也可以禁用SElinux的保護,名稱服務器的緩存進程(ncsd)也是如此。

11、 NFS:在NFS啓用SElinux之前,至少需要啓用NFS文件系統的讀權限。如果使用NFS共享系統,可能在NFS文件系統上啓用讀、寫、創建功能。如果配置某個服務器上的家目錄作爲NFS共享,可能想讓NFS支持家目錄,這些都有通常安全管理服務進程(gssd)提供支持。

12、 NIS:如果在SElinux系統上運行NIS,可能想允許NIS運行進程,可以取消SElinux對NIS密碼和NIS傳輸進程的保護,如果還有問題,可以取消SElinux對相關進程(ypbind)的保護。

13、 Other:在Other類中可以允許完整文件的訪問,通過FTP和未標籤的包,Other類同樣可以禁止SElinux對PC讀卡器和特殊時區數據的保護。

14、 Polyinstation:用戶在相同的目錄下可能會看到不同的東西(比如/tmp),可以使用SElinux工具啓用這一支持。

15、 Pppd:這一進程使用電話調制解調器進行通信,可以允許pppd在內核中插入支持通信的模塊或禁用SElinux保護。

16、 Printing:在Printing類中可以允許禁用SElinux對於不同CUPS進程的保護,包括CUPS後臺服務、cupsd進程、cupsd-lpd服務和HP打印機進程(hplip)。甚至可以用LPD代替CUPS。

17、 Rsync:在rsync類中可以允許標籤爲public_content_rw_t目錄配置寫權限或禁用SElinux的保護。

18、 Samba:在Samba類中可以使用SElinux保護samba,主要包括以下內容:

(1) 允許samba共享nfs目錄

(2) 允許samba共享用戶家目錄

(3) 允許samba對標籤爲public_content_rw_t的目錄文件進行寫操作

(4) 允許用戶登錄到CIFS家目錄

(5) 禁止SElinux對nmbd進程(NetBIOS進程)的保護

(6) 禁止SElinux對smbd進程(samba進程)的保護

(7) 禁止SElinux對winbind進程(WINS服務進程)的保護

19、 SASL Authentication Server:簡單的身份驗證和安全層(SASL)服務器是另一個驗證方法,通過安全級別配置工具,可以允許它進入/etc/shadow驗證數據庫,以及禁用SElinux的保護。

20、 SElinux Server Protection:在SElinux Server Protection類中允許爲大範圍的進程禁用SElinux保護(比如從amanda到zebra),這些服務不包含在其它類中。

21、 Spam Protection:Spam  Protection類作用於SpamAssassin服務,對於常規用戶需要進入家目錄,當然依然可以禁用。

22、 SQUID:如果需要設置squid代理的緩存,將需要允許它訪問網絡,也可以禁止SElinux保護。

23、 Universal  SSL  Tunnel:在Universal SSL Tunnel類中可以爲網絡配置一個安全通道,通過SElinux添加保護,可以使用此工具允許stunnel作爲單獨的服務運行,也可以禁用SElinux的保護。

24、 Zebra:可以利用這一工具讓Zebra路由服務隊路由表進行寫入。

文件上下文context值說明:

1、 用戶:指的是SElinux用戶,root表示root賬戶身份,user_u表示普通用戶無特權用戶,system_u表示系統進程,通過用戶可以確認身份類型,一般搭配角色使用。身份和不同的角色搭配時有權限不同,雖然可以使用su命令切換用戶但對於SElinux的用戶並沒有發生改變,賬戶之間切換時此用戶身份不變,在targeted策略環境下用戶標識沒有實質性作用。

2、 角色:object_r一般爲文件目錄的角色、system_r一般爲進程的角色,在targeted策略環境中用戶的角色一般爲system_r,在strict策略中用戶的角色被細分爲sysadm_r、system_r、user_r、staff_r角色。用戶的角色類似用戶組的概念,不同的角色具有不同的身份權限,一個用戶可以具備多個角色,但是同一時間只能使用一個角色。在targeted策略環境下角色沒有實質作用,在targeted策略環境中所有的進程文件的角色都是system_r角色,在strict策略中一般用戶登錄時角色是user_r,root用戶登錄時角色是staff_r,但是沒有特殊權切換到sysadm_r角色才具備超級用戶的權限,只有staff_r角色纔可以切換成sysadm_r角色。

3、 類型(進程的類型又可以稱爲域):文件和進程都有一個類型,SElinux依據類型的相關組合來限制存取權限。


2010年12月20日更改,以前的學習筆記了,現在看到了貼出來供大家參考,寫的不好大家多多包涵,如有錯誤請通知我我會改正的,謝謝啦同志們!系統環境RHEL5.4!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章