SELinux并不是象許多人想的那樣難以管理?,F(xiàn)代Linux發(fā)行版都裝載了許許多多的安全特性和工具,大部分重要的特性都被添加到內(nèi)核中去了,如SELinux。
SELinux在安全方面解決了許多具有挑戰(zhàn)性的問題,如何控制信任用戶或進(jìn)程,信任用戶,如在*nix域的root用戶,可以無限制地訪問系統(tǒng),而這個賬號應(yīng)該只有系統(tǒng)管理員可用,但是,這會引起一個問題,如果root本身被黑會發(fā)生什么,讓黑客可以完全控制整個系統(tǒng),惡意用戶不是唯一的問題,錯誤配置一個安全工具,如iptables,導(dǎo)致隱藏極深難以發(fā)現(xiàn)的問題,除此之外,假設(shè)在你服務(wù)器上運行的服務(wù)有一個安全漏洞被發(fā)現(xiàn),而且補丁還沒有發(fā)布出來,假如這樣,你的系統(tǒng)就很脆弱,SELinux通過在內(nèi)核中實施強制訪問控制(MAC)來解決了這些安全問題,SELinux基于Flask安全框架,本文不打算討論Flask框架,在互聯(lián)網(wǎng)上可以找到有關(guān)它的優(yōu)秀文檔。
為了理解強制訪問控制,我們必須討論一下目前部署的叫做任意訪問控制(DAC)的安全模塊,在一個DAC系統(tǒng)上,對對象的訪問受限于它們的類別,這種類型的控制是任意的,一個主體擁有訪問權(quán)限后它可以將這個權(quán)限指派給其它用戶,例如:有相同訪問權(quán)限的用戶登陸后,都可以訪問你運行的任何程序,而權(quán)限又是另外一個用戶設(shè)置的(如root)。
任何特殊的權(quán)限(讀、寫、執(zhí)行等)都可以被看做一個二維圖,用戶在一個軸而對象在另外一個軸上,本質(zhì)上,DAC系統(tǒng)檢查存儲的信息目前憑證的有效性。
如前面提到的,SELinux安全模塊是強制訪問控制或MAC,這是一個不同的訪問控制方法,DAC安全模塊是基于認(rèn)證的,而MAC系統(tǒng)依賴授權(quán),不僅針對用戶而且系統(tǒng)載入的對象。
MAC系統(tǒng)單獨控制對象并且決定基于安全策略的對象權(quán)限和/或許可,安全策略定義了對象應(yīng)該授予的權(quán)限,以不同變量為基礎(chǔ)來進(jìn)行定義。
影響計算機(jī)操作的任意訪問控制的一個例子是一個Python腳本,如果腳本允許一個外部的實體在DAC計算機(jī)系統(tǒng)上插入并執(zhí)行惡意代碼,惡意代碼就具有與執(zhí)行的代碼相同的訪問權(quán)限,即與那個Python腳本權(quán)限一樣。
一個MAC系統(tǒng)能限制某個特定進(jìn)程的權(quán)限,僅允許它對需要的資源進(jìn)行正常操作,一個Python腳本可能會創(chuàng)建一個進(jìn)程(也可能被禁止),但是這個進(jìn)程不具有與創(chuàng)建它的進(jìn)程相同的權(quán)限,因此,MAC更安全。
簡述SELinux的本質(zhì)
在SELinux下,安全策略配置是用m4語言在一個文本文件中定義的,在安全策略定稿后被編譯,在系統(tǒng)啟動時載入內(nèi)存,只有安全服務(wù)器能決定一個對象的權(quán)限。
安全策略的執(zhí)行是由一個叫做對象管理器的組件完成的,它從客戶端對象接收請求,向安全服務(wù)器條件查詢并強制實施查詢結(jié)果。
安全服務(wù)器的SELinux實施使用了2個安全范例的組合,它們叫做類型增強(TE)和基于角色的訪問控制(RBAC)。
類型增強
類型增強做出的安全決定基于對象請求的許可種類,例如:對象類型可能包括一個常規(guī)文件、一個目錄、一個進(jìn)程或一個套接字,類型增強是一個對象標(biāo)記系統(tǒng),與訪問映射一起(對象請求許可的域和對象請求的類型),返回一個對象許可動作的定義。
基于角色的訪問控制
基于角色的訪問控制在一個基于角色的計算機(jī)系統(tǒng)上指出對對象的許可,在實踐中,這意味著一個進(jìn)程應(yīng)該基于它父進(jìn)程的許可。
進(jìn)程、文件系統(tǒng)對象和套接字是如何與其他通訊的?這個在安全策略中有定義,特別地,安全策略與其他特定規(guī)則一起管理不同類型和角色之間是如何交互的。
目前,SELinux提供與已有應(yīng)用程序二進(jìn)制兼容性,與內(nèi)核模塊具有源代碼兼容性,目前SELinux的實現(xiàn)是基于x86架構(gòu)的。
獲取并安裝SELinux
如今SELinux已經(jīng)包括在多數(shù)發(fā)行版中,即使在主發(fā)行版里沒有,一般也會提供特殊的安裝包,源代碼可以在http://www.nsa.gov/selinux/code/download0.cfm找到。
安裝seedit
seedit是一個基于webmin的用戶界面友好的工具,它允許管理員從一個web瀏覽器來管理SELinux策略,seedit允許用戶執(zhí)行通過用m4語言在一個點和點擊環(huán)境中手動編寫的腳本中指定的每一個操作??梢栽?A >http://seedit.sourceforge.net/找到它。
一旦安裝好后,SELinux策略被定義在$SELINUX/(seedit-something)/policy/policy.conf文件中($SELINUX是你安裝SELinux的根目錄—通常是/etc/selinux/)。
讓我們先來熟悉一下seedit的接口,打開一個瀏覽器,定位到http://localhost:10000,然后轉(zhuǎn)到系統(tǒng)-->SELinux配置小節(jié)。
你將看到6個標(biāo)記為配置ACL、定義域轉(zhuǎn)換、定義用戶角色之間的關(guān)系、創(chuàng)建新域/角色、刪除域/角色和升級配置圖標(biāo)。
配置ACL
實際上你可以在這里定義幾乎所有系統(tǒng)中對象的訪問控制,包括對目錄下的所有文件設(shè)置允許/不允許讀、寫或執(zhí)行,或?qū)为毜奈募M(jìn)行設(shè)置以及允許/不允許訪問網(wǎng)絡(luò),在這一小節(jié),你也可以定義應(yīng)用程序工作要用的端口,我們給Apache指定80端口,圖個它從81端口啟動,SELinux將終結(jié)這個進(jìn)程。
IPC訪問控制也可以在這一小節(jié)定義,你可以定義這個特定應(yīng)用程序使用哪種IPC機(jī)制,并定義哪個應(yīng)用程序能與其進(jìn)行通訊。
在這一小節(jié)還可以定義其他訪問控制包括許多管理的訪問控制,如內(nèi)核通訊權(quán)限、SELinux操作、進(jìn)程信息檢索等等。
定義域轉(zhuǎn)換
在域轉(zhuǎn)換小節(jié),你可以定義哪個進(jìn)程能生成當(dāng)前的應(yīng)用程序,例如:默認(rèn)情況下,seedit策略為MySQL定義域轉(zhuǎn)換:kernelinitmysqld,這意味著內(nèi)核能啟動init,init能啟動MySQL后臺進(jìn)程,如果應(yīng)用程序有一個后臺進(jìn)程,域轉(zhuǎn)換應(yīng)該被定義或者后臺進(jìn)程將永遠(yuǎn)不啟動。因此在這一小節(jié),用戶可以定義域轉(zhuǎn)換,修改已有的或移除它們。
定義用戶和角色之間的關(guān)系
角色是指某個對象(如用戶)在系統(tǒng)上擁有的權(quán)限,例如:可能有一個角色允許訪問系統(tǒng)里的所有文件,因此,在這一小節(jié),用戶可以在系統(tǒng)上將角色與特定用戶關(guān)聯(lián)起來。
下面的兩小節(jié)是不需要加以說明的,它們允許你定義一個新的域/角色和移除一個域/角色,定義一個域/角色是為一個新應(yīng)用程序或用戶添加訪問控制的第一步。
最好一小節(jié)是升級配置,它允許用戶升級策略、重新編譯以及重新載入。
seedit附帶了許多預(yù)設(shè)的策略,覆蓋了Linux系統(tǒng)每一個流行的服務(wù)/后臺進(jìn)程—從內(nèi)核到MySQL后臺進(jìn)程。
為一個后臺應(yīng)用程序定義一個新的策略
為一個后臺應(yīng)用程序定義一個SELinux策略是一個反復(fù)的過程,第一步是在SELinux中注冊后臺進(jìn)程,在seedit webmin接口上申明一個域/角色,前面已經(jīng)說過了,域約定用_t結(jié)束,角色定義用_r結(jié)束,因此,應(yīng)該有一個角色如admin_r,一個域如mysqld_t。
定義域轉(zhuǎn)換是另外一個重要步驟,這里你必須允許后臺進(jìn)程的父進(jìn)程生成相關(guān)的子進(jìn)程,通常,如果后臺進(jìn)程在啟動時激活,你需要定義一個從init到子進(jìn)程的域轉(zhuǎn)換。
給后臺進(jìn)程定義初始化訪問控制列表,目前,當(dāng)后臺進(jìn)程初始化安裝后,為用戶定義一個詳盡的ACL是不可能的,通常是通過初始化ACL列表定義完成的,但它有很大的局限,每當(dāng)應(yīng)用程序訪問一個對象時不被允許,產(chǎn)生一條訪問違規(guī)的消息,存儲在/var/log/messages中,當(dāng)你使用這個后臺進(jìn)程時,SELinux將報告一些違規(guī)信息,我們嘗試為一個叫做foobar的后臺進(jìn)程編寫規(guī)則,違規(guī)消息就象下面這樣:
|avc: denied { write } for pid=7279 exe=/usr/bin/foobar comm=ifup name=dhclient-eth0.conf dev=hda12 ino=57400 scontext=system_u:system_r:foobar_t tcontext=system_u:object_r:etc_t tclass=file |
從這個違規(guī)消息來看我們的應(yīng)用程序嘗試在dhclient-eth0.conf文件上進(jìn)行寫入操作,可以通過授予應(yīng)用程序?qū)懭雂hclient-eth0.conf文件的權(quán)限來消除這個違規(guī)信息,這個違規(guī)可以通過轉(zhuǎn)到配置ACL小節(jié)被解決,在文件ACL小節(jié)下,瀏覽到這個文件放置的位置,給應(yīng)用程序foobar寫入權(quán)限。
另一個違規(guī)看起來可能是這樣的:
|avc: denied { create } for pid=7279 exe=/usr/bin/foobar scontext=root:system_r:foobar_t tcontext=root:system_r:foobar_t\ tclass=udp_socket |
這個違規(guī)報告指出應(yīng)用程序嘗試創(chuàng)建一個UDP套接字,但是被拒絕了。要移除這個違規(guī)信息,我們只需要簡單地將網(wǎng)絡(luò)特征添加到foobar_t域的訪問控制,通過轉(zhuǎn)到配置ACL小節(jié)/網(wǎng)絡(luò)ACL小節(jié)來完成,為域foobar_t選項允許網(wǎng)絡(luò)。
所有訪問違規(guī)都可以在seedit webmin接口下的配置ACL小節(jié)來得到處理。
在每個策略升級后,通過seedit webmin接口升級策略選項重新載入,然后重新啟動后臺進(jìn)程,發(fā)生其他違規(guī)時,再次升級它,直到你幾乎看到違規(guī)消息為止。
在audit2alow工具的幫助下有其他辦法為一個應(yīng)用程序產(chǎn)生訪問規(guī)則,但是使用它能產(chǎn)生規(guī)則,也能產(chǎn)生安全問題,通常你還需要重新清理一篇這些規(guī)則。
當(dāng)創(chuàng)建或升級策略時,確保你已經(jīng)設(shè)置SELinux為許可模式,SELinux有3個模式:強制、禁止、許可。在強制模式下,所有訪問控制嚴(yán)格按照定義的策略執(zhí)行的,在許可模式下,策略不是強制的,但是當(dāng)任何違背策略的操作發(fā)生時都會生成一條違規(guī)消息,禁止模式完全禁用了SELinux。