歡迎您光臨本站 註冊首頁

selinux學習筆記

←手機掃碼閱讀     火星人 @ 2014-03-08 , reply:0

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!

本文出自 「路漫漫修遠兮」 博客,請務必保留此出處http://xinghen.blog.51cto.com/1080189/722082


[火星人 ] selinux學習筆記已經有782次圍觀

http://coctec.com/docs/linux/show-post-46594.html