使RHEL5.1支持编译refpolicy源码

来源:互联网 发布:java数据分析语言 编辑:程序博客网 时间:2024/06/03 09:57
 

之前在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的环境了。。。

原创粉丝点击