如何應(yīng)用SELinux中的目標(biāo)策略限制進(jìn)程運(yùn)行,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
10年積累的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有桐城免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
一、安裝SELinux相關(guān)的安裝包
雖然在有的Linux發(fā)行套件中已經(jīng)缺省安裝了SELinux(例如Fedora 10和Red Hat Enterprise Linux 5、6),然而用戶(hù)還是需要了解具體安裝SELinux所需要的安裝包,下面對(duì)他們進(jìn)行簡(jiǎn)要介紹,主要包括如下幾個(gè)部分:
Policycoreutils:提供與SELinux相關(guān)的命令,比如semanage,restorecon,audit2allow,semodule,load_policy,以及setsebool等,來(lái)操作和管理SELinux。
Policycoreutils-gui:提供圖形化的工具system-config-selinux來(lái)管理SELinux。
Selinux-policy:提供SeLinux應(yīng)用策略。該應(yīng)用策略包括了所有的SELinux策略,并作為其他諸如目標(biāo)策略(targeted policy)的基礎(chǔ)使用。
Selinux-policy-policy:提供SELinux策略。對(duì)于目標(biāo)策略,安裝selinux-policy-targeted包,對(duì)于MLS策略,則安裝selinux-policy-mls包。需要說(shuō)明的是:在Fedora 8中,strict策略與目標(biāo)策略結(jié)合在一起。
Setroubleshoot-server:翻譯SELinux拒絕操作信息,成為sealert軟件可以查看的詳細(xì)描述信息。
Setools,setools-gui和setools-console:這些安裝包提供了與SELinux有關(guān)的策略分析和檢索、審計(jì)日志監(jiān)控、文件上下文管理等命令和工具。
Libselinux-utils:提供諸如avsstat,getenforce,getsebool,matchpathcon,selinuxconlist,selinuxdefcon,selinuxenabled,setenforce,togglesebools等工具。
Mcstrans:提供對(duì)SELinux上下文中級(jí)別(比如s0-s0:c0.c1023)信息的翻譯工作,在缺省情況下該軟件包不安裝。
二、使用與SELinux有關(guān)的日志文件
SELinux有許多相關(guān)的日志文件來(lái)記錄在運(yùn)行過(guò)程中對(duì)操作的拒絕日志,以便用戶(hù)在后續(xù)過(guò)程中進(jìn)行審計(jì)評(píng)估。在缺省情況下,SELinux將拒絕日志寫(xiě)入到/var/log/audit/audit.log文件中,該文件的部分內(nèi)容顯示如圖1所示:
圖1 /var/log/audit/audit.log文件的部分內(nèi)容顯示
另外,如果setroubleshooted運(yùn)行的話(huà),在/var/log/audit/audit.log中的記錄將被翻譯成容易理解和閱讀的方式,保存在/var/log/messages文件中:
圖2 var/log/messages文件的部分輸出
當(dāng)然,拒絕信息被送到不同的地方,這要根據(jù)不同的守護(hù)進(jìn)程而定表1列出了對(duì)應(yīng)于不同的守護(hù)進(jìn)程的日志文件的路徑:
表1 SELinux日志文件列表
守護(hù)進(jìn)程 | 日志文件 |
auditd on | /var/log/audit/audit.log |
Auditd off; rsyslogd on | /var/log/messages |
Setroubleshootd, rsylogd, auditd on | /var/log/audit/audit.log翻譯后存入/var/log/messages |
為了啟動(dòng)上述的守護(hù)進(jìn)程,需要來(lái)分別配置auditd,rsyslogd以及setroubleshootd來(lái)使他們?cè)谙到y(tǒng)啟動(dòng)時(shí)自動(dòng)運(yùn)行,可以以root身份運(yùn)行下述命令:
#/sbin/chkconfig -levels 2345 auditd on
#/sbin/chkconfig -levels 2345 rsyslogd on
#/sbin/chkconfig -levels 2345 setroubleshootd on
并且,可以使用如下命令檢查這些守護(hù)進(jìn)程是否正常運(yùn)行:
#/sbin/service auditd status
#/sbin/service rsyslogd status
#/sbin/service setroubleshootd status
三、啟動(dòng)和禁用SELinux
啟動(dòng)和禁用SELinux的步驟非常簡(jiǎn)單,只需要修改其配置文件,然后執(zhí)行重啟即可。以下是啟動(dòng)SELinux的詳細(xì)步驟:
(1)編輯配置文件
根據(jù)上面的介紹,編輯確定SELinux的運(yùn)行模式和活動(dòng)策略(見(jiàn)下面配置文件中的黑體部分)即可:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
(2)使用getenforce命令和sestatus命令查看SELinux的運(yùn)行模式和詳細(xì)上下文信息:
#/usr/sbin/getenforce
#/usr/sbin/sestatus
(3)使用root用戶(hù)身份重啟系統(tǒng)即可:
#reboot
同理,禁用SELinux的詳細(xì)步驟如下:
(1) 編輯配置文件
根據(jù)上面的介紹,編輯確定SELinux的運(yùn)行模式和活動(dòng)策略(見(jiàn)下面配置文件中的黑體部分)即可
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=diabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
(2) 使用getenforce命令和sestatus命令查看SELinux的運(yùn)行模式和詳細(xì)上下文信息
#/usr/sbin/getenforce
#/usr/sbin/sestatus
(3) 使用root用戶(hù)身份重啟系統(tǒng)即可
#reboot
四、目標(biāo)策略原理
Targeted策略是從strict示例策略衍生而來(lái)的,它的結(jié)構(gòu)和組織幾乎是一樣的,但strict策略更趨向于最大化使用SELinux所有特性,為大部分程序提供強(qiáng)壯的安全保護(hù),而targeted策略的目標(biāo)是隔離高風(fēng)險(xiǎn)程序,使用targeted策略的好處是一方面可以向Linux系統(tǒng)添加大量的安全保護(hù),同時(shí)又盡量少影響現(xiàn)有的用戶(hù)程序,targeted策略主要集中于面向網(wǎng)絡(luò)的服務(wù)(即那些暴露在外任意遭受******的組件),targeted策略是RHEL和Fedora系統(tǒng)上標(biāo)準(zhǔn)的策略,因?yàn)樗谠鰪?qiáng)安全性和減少對(duì)現(xiàn)有應(yīng)用程序影響之間達(dá)到了一個(gè)很好的平衡。
如果安裝了targeted示例策略,可以在/etc/selinux/targeted/src/policy/目錄下看到它的源文件,從各個(gè)方面來(lái)看,targeted示例策略源與strict示例源都非常相似。
Targeted示例策略和strict示例策略之間主要的差異是使用了無(wú)限制的域類(lèi)型unconfined_t,并移除了所有其他用戶(hù)域類(lèi)型,如sysadm_t和user_t,這也意味著基本的角色結(jié)構(gòu)也被移除了,所有用戶(hù)都以角色system_r運(yùn)行,幾乎所有的用戶(hù)運(yùn)行的程序都以u(píng)nconfined_t域類(lèi)型執(zhí)行。當(dāng)然,無(wú)限制域和限制域都需要接受可執(zhí)行和可寫(xiě)的內(nèi)存檢查。在默認(rèn)情況下,運(yùn)行在無(wú)限制域下的主體不能分配可寫(xiě)和可執(zhí)行的內(nèi)存,這個(gè)機(jī)制降低了系統(tǒng)遭受緩沖區(qū)溢出***(buffer overflow attack)的風(fēng)險(xiǎn)。當(dāng)然,這些內(nèi)存檢查可以通過(guò)設(shè)置下面需要詳細(xì)介紹的布爾變量來(lái)關(guān)掉,它使得SELinux策略可以在運(yùn)行時(shí)得到修改。
用戶(hù)可以在./domain/unconfined.te中找到unconfined域定義,注意在targeted示例策略中,strict策略文件admin.te和user.te不再位于./domains/目錄下,這些文件為strict示例策略定義了各種各樣的用戶(hù)域,每一個(gè)都具有受限的特權(quán),在targeted示例策略中,所有程序都以u(píng)nconfined_t域類(lèi)型運(yùn)行,除非它們都明確地指定了域類(lèi)型(因此稱(chēng)其為targeted),本質(zhì)上unconfined域可以訪(fǎng)問(wèn)所有的SELinux類(lèi)型,使它免除SELinux安全控制(因此成為unconfined)。在strict示例策略中,./domains/program/包括許多策略模塊,每個(gè)模塊代表一個(gè)或多個(gè)域類(lèi)型和關(guān)聯(lián)的類(lèi)型,以及為特定程序制定的規(guī)則。在targeted示例策略中,這個(gè)目錄包括的文件要少得多,這些就是目標(biāo)。
目標(biāo)示例策略模塊與strict策略中策略模塊類(lèi)似,例如:strict ping模塊和targeted ping模塊是一致的,但有部分targeted模塊只是簡(jiǎn)單地定義類(lèi)型使域不受限制(不是targeted),例如:如果查看crond的targeted策略(crond.te),會(huì)發(fā)現(xiàn)有一行unconfined_domain(crond_t)。這個(gè)宏在targeted示例中定義在./policy/macros/global_macros.te文件中,它將crond域類(lèi)型提供了所有SELinux訪(fǎng)問(wèn)權(quán),使得它不受限制,如果用戶(hù)將其域strict版本(/etc/selinux/strict/src/policy/domains/program/crond.te)crond模塊進(jìn)行比較,會(huì)看到它們之間有很大的差異,在targeted策略中,crond被認(rèn)為是不受限制的域,但在這兩個(gè)策略中ping卻保留是strict域。
五、應(yīng)用目標(biāo)策略限制進(jìn)程運(yùn)行
幾乎所有的服務(wù)進(jìn)程都在限制下運(yùn)行。并且,大多數(shù)以root身份運(yùn)行的系統(tǒng)進(jìn)程(比如說(shuō)passwd進(jìn)程)都是受限制域性的。當(dāng)進(jìn)程受限制時(shí),它只能在自己限制的域內(nèi)運(yùn)行,例如Web服務(wù)進(jìn)程httpd只能運(yùn)行在httpd_t域內(nèi)。如果一個(gè)受限制的進(jìn)程被******并控制了,根據(jù)SELinux策略配置,這個(gè)***也僅僅只能訪(fǎng)問(wèn)這個(gè)受限制的域,因此***所帶來(lái)的危害也比傳統(tǒng)的Linux小了很多。
以下通過(guò)一個(gè)具體的限制進(jìn)程的例子(RHEL或者Fedora系統(tǒng)中的例子)來(lái)說(shuō)明SELinux是如何將進(jìn)程限制在自己的域內(nèi)運(yùn)行的。這個(gè)例子以用戶(hù)非常熟悉且常用的Apache服務(wù)器中的httpd進(jìn)程為例,來(lái)介紹SELinux是如何阻止httpd進(jìn)程來(lái)訪(fǎng)問(wèn)由其他域管理的文件類(lèi)型的。
(1)運(yùn)行sestatus命令來(lái)確認(rèn)Linux中SELinux是運(yùn)行的,它運(yùn)行在enforcing模式下,該模式可以簡(jiǎn)單理解為SELinux的完全運(yùn)行模式,它可以進(jìn)行強(qiáng)制訪(fǎng)問(wèn)控制),且確保采用了目標(biāo)策略。
圖1 使用sestatus確認(rèn)SELinux是否運(yùn)行
上述運(yùn)行結(jié)果表明SELinux運(yùn)行在enforcing模式下,且采用了目標(biāo)策略。
(2)采用Linux中的root用戶(hù)權(quán)限,使用如下命令在httpd的工作目錄中創(chuàng)建一個(gè)新的文件:
#touch /var/www/html/testfile
(3)運(yùn)行如下命令來(lái)查看該文件的SELinux上下文信息:
# ls -Z /var/www/html/testfile-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile
從上述結(jié)果可以清楚地看到:在默認(rèn)情況下,Linux用戶(hù)是非限制的,因此剛創(chuàng)建的testfile文件的SELinux上下文中的類(lèi)型標(biāo)記為unconfined_u。RBAC訪(fǎng)問(wèn)控制機(jī)制是用于進(jìn)程的,不是用于文件。并且,角色對(duì)于文件來(lái)說(shuō)也沒(méi)有什么太大的含義,因此上述結(jié)果中的object_r角色也僅僅是一個(gè)用于文件的通用角色。在/proc目錄下,與進(jìn)程相關(guān)的文件可以采用system_r角色。另外,結(jié)果中的httpd_sys_content_t類(lèi)型允許httpd進(jìn)程訪(fǎng)問(wèn)該文件。
(4)以L(fǎng)inux的root用戶(hù)身份,運(yùn)行下述命令來(lái)運(yùn)行httpd進(jìn)程。
圖2 成功啟動(dòng)httpd進(jìn)程
(5)切換到一個(gè)Linux用戶(hù)具有權(quán)限的目錄下,運(yùn)行如下命令,圖3所示結(jié)果為該命令能夠正確的執(zhí)行并下載文件。
圖3 wget正確執(zhí)行并下載文件
(6)使用chcon命令來(lái)對(duì)文件的類(lèi)型進(jìn)行重新標(biāo)識(shí)。然而,這樣的標(biāo)識(shí)不是永久性的修改,一旦系統(tǒng)重啟,該標(biāo)識(shí)就會(huì)改變回去。對(duì)于文件類(lèi)型的永久性改變,需要采用semanage命令,這個(gè)命令在后面將進(jìn)行詳細(xì)介紹。下面,以root用戶(hù)的身份,運(yùn)行圖4所示chcon命令來(lái)將上面步驟中創(chuàng)建的testfile文件的類(lèi)型改為由Samba進(jìn)程使用的文件;然后,運(yùn)行l(wèi)s -z /var/www/html/testfile命令來(lái)查看改變的結(jié)果。
圖4 chcon命令運(yùn)行結(jié)果
(7)在傳統(tǒng)的Linux中httpd進(jìn)程可以訪(fǎng)問(wèn)testfile文件,下面需要嘗試一下在SELinux中,該進(jìn)程是否能夠成功訪(fǎng)問(wèn)testfile文件。如步驟(5)所示,再次運(yùn)行該命令進(jìn)行文件下載工作,發(fā)現(xiàn)命令運(yùn)行失敗,文件沒(méi)有權(quán)限下載,運(yùn)行結(jié)果。
圖6 wget命令執(zhí)行失敗
通過(guò)上述7個(gè)步驟的詳細(xì)演示可以得知:雖然傳統(tǒng)的Linux的DAC機(jī)制允許httpd進(jìn)程訪(fǎng)問(wèn)testfile文件,然而SELinux的MAC機(jī)制卻拒絕該訪(fǎng)問(wèn)操作。原因在于:該文件的類(lèi)型(samba_share_t)httpd進(jìn)程不能訪(fǎng)問(wèn),因此SELinux拒絕了該操作。同時(shí),SELinux對(duì)這些操作日志進(jìn)行了詳細(xì)的記載,以方便系統(tǒng)管理員事后進(jìn)行審計(jì)和處理,可以查看/var/log/messages文件。
圖7 /var/log/messages文件圖示
另外,相關(guān)的錯(cuò)誤日志也可以查看/var/log/audit/audit.log文件,如圖8所示:
type=AVC msg=audit(1241564654.246:26): avc: denied { getattr } for pid
并且,由于該操作牽涉到httpd服務(wù)進(jìn)程,由于該服務(wù)也有自己的日志文件,因此,也可以通過(guò)/var/log/httpd/error_log文件進(jìn)行查看。
看完上述內(nèi)容,你們掌握如何應(yīng)用SELinux中的目標(biāo)策略限制進(jìn)程運(yùn)行的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!