使RHEL5.1支持編譯refpolicy源碼

 

之前在RHEL5.1上使用自己編譯的refpolicy二進制策略模塊從來都是失敗的。一般失敗的情況有兩種,第一種是設置/etc/selinux/config爲Permissive後,重啓後SELinux狀態變成Disabled;第二種是設置爲Enforcing,重啓後無法進入系統。

究竟是什麼原因,是我配置錯誤?經過在搜索引擎上的多番尋找,終於找到解決問題的方法。可能它不是完美的,但至少是行得通的。

步驟一:確保安裝gcc。
編譯refpolicy時要用到。

步驟二:更新內核版本。
查看RHEL5.1使用的內核安裝包:
# rpm -qa|grep kernel
RHEL5.1默認的內核安裝包爲kernel-xen-2.6.18-53.el5,RHEL5.2默認爲kernel-xen-2.6.18-92.el5,RHEL5.6爲kernel-xen-2.6.18-238.el5。我是怎麼知道的?因爲一般內核的安裝包都在安裝盤的disc1裏,然後這些版本我其實下過,所以我知道。都是xen-2.6.18的,更新爲RHEL5.6的內核吧。更新內核不要更太新了,不然可能不能支持原來已安裝的軟件包。
想辦法去下kernel-xen-2.6.18-238.el5.rpm及kernel-headers-2.6.18-238.el5.rpm。kernel-headers是gcc的一個依賴包,包含系統頭文件。可以像我這樣下整個ISO文件的,也可以另外單獨下,如果找得到的話。千萬不要下CentOS的,CentOS的內核安裝包也叫kernel-xen-2.6.18-238.el5.rpm,但是是重新定製過的。下到這兩個包後務必驗證其MD5值:
http://rhn.redhat.com/errata/RHSA-2011-0017.html
之後更新內核:
# rpm -Uvh kernel-headers-2.6.18-238.el5.rpm
# rpm -Uvh kernel-xen-2.6.18-238.el5.rpm
重啓後內核更新生效。

步驟三:安裝refpolicy。
去官網下載refpolicy-20081014.tar.bz2這個壓縮檔。因爲之後更新的refpolicy都爲版本2了,要求更高版本內核及SELinux。
http://oss.tresys.com/projects/refpolicy/wiki/DownloadRelease
解壓壓縮檔:
# bzip2 -d refpolicy-20081014.tar.bz2
# tar -xvf refpolicy-20081014.tar
進入解壓出來的refpolicy目錄,安裝refpolicy:
# make install-src

步驟四:編譯refpolicy策略。
關閉selinux:
# setenforce 0
進入/etc/selinux/refpolicy/src/policy目錄,編輯build.conf文件,將“#DISTRO = redhat”前的井號去掉,將“DIRECT_INITRC = n”n改爲y。
生成refpolicy配置文件:
# make conf
生成refpolicy策略:
# make install
編輯/etc/selinux/config文件,將“SELINUXTYPE”設爲“refpolicy”。並設定下次系統啓動期間重標記整個文件系統:
# touch /.autorelabel
重啓後refpolicy策略就生效了。

小記:解決問題的方法是找到了。分析RHEL5.1不支持refpolicy的原因,我認爲一共有2個:
一個是紅帽提供的refpolicy源碼問題。RHEL5.1默認使用的策略源碼存在於selinux-policy-2.4.6-104.el5.src.rpm包中,不知道是哪個版本的refpolicy。之前我一直覺得這東西應該配套,就只用這個rpm包裏解壓出來的refpolicy,文件名爲serefpolicy-2.4.6.tgz,但編譯出來的策略一直報安全上下文的錯。使用官方版本的refpolicy顯然沒有這一問題。進一步測試發現,從selinux-policy-2.4.6-104.el5.src.rpm到selinux-policy-2.4.6-316.el5.src.rpm解壓出來的serefpolicy-2.4.6.tgz的MD5都是一樣的。說明不能直接使用這個策略源碼,要使用rpmbulid爲這個策略源碼打上補丁。而我之前怕麻煩,直接使用rpm2cpio命令解壓rpm的源代碼包,然後直接使用serefpolicy-2.4.6.tgz,皆失敗。
另一個是2.6.18-53版本的內核在支持refpolicy上存在BUG。RHEL5.1默認的targeted模式其實是targeted-mls模式,可以使用seinfo這個命令看出來。而BUG就是內核不支持SELinux從mls或mcs的模式轉換到非mls、非mcs的模式。refpolicy默認的模式就是一個非mls、非mcs模式。故在應用refpolicy策略上存在無法轉換模式的問題。因此,若不升級RHEL5.1的內核,在build.conf文件中選擇mls模式是沒有問題的。
就是這兩個BUG搞了花了我兩週時間去探究,終於可以搭建一個學習SELinux的環境了。。。

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