修改RHEL 5.1的/etc/selinux/config文件,将SELINUXTYPE设置为strict。重启,使配置生效,结果系统进不去了。
本来以为是少装了selinux-policy-strict这个包,结果装完还是进不去。
在网上查了一下,在红帽官网看到原来这是RHEL 5 SELinux的BUG:
https://bugzilla.redhat.com/show_bug.cgi?id=486354
看来只能升级RHEL 5原装的SELinux的版本了。也好,之前在网上搜到09年SELinux爆漏洞,导致开启SELinux的服务器root用户权限被盗,而没启用SELinux的服务器却毫无大碍。这个丑闻真是狠狠给千辛万苦学习SELinux的人一巴掌。
所以说升级是好事。只是Linux上升级软件包是一件几乎不可能完成的任务,重重依赖会让你放弃最后信心。所以绝不能手动使用rpm命令一个一个去删、装,最好是能使用智能的yum命令。
yum命令不仅能帮你把依赖缺的给装了。要是你要装的包版本更新,它还会自动检查yum仓库,把一系列依赖也更新。所以配置好yum仓库是关键。yum仓库去centos官网找个镜像。建立/etc/yum.repos.d/centos.repo文件,内容如下:
[centos]
name=CentOS 5.6
baseurl=http://centos.ustc.edu.cn/centos/5.6/os/i386/
enabled=1
gpgcheck=1
gpgkey=http://centos.ustc.edu.cn/centos/5.6/os/i386/RPM-GPG-KEY-CentOS-5
然后就可以使用yum更新RHEL 5.1原装的SELinux了:
# yum install selinux-policy-strict
这里我使用install参数。因为默认RHEL 5.1没装selinux-policy-strict,所以yum要解决它的依赖问题。而centos的selinux-policy-strict版本比RHEL5的新,所以yum会顺便更新SELinux。
等SELinux更新好了,我发现直接改为strict还是没法进系统。测试正确的步骤应该是这样子的:
步骤一:修改/etc/selinux/config文件,将SELINUX设置为permissive,将SELINUXTYPE设置为strict;
步骤二:执行命令# touch /.autorelabel,RHEL5将在开机后重新标记整个文件系统;
步骤三:重启;
第四步:进入系统,执行# getenforce,查看SELinux状态,若为Permissive则成功。因为未更新SELinux前,按上述步骤操作至此,SELinux的状态将变为Disabled。
第五步:设置SELinux状态为Enforcing,# setenforce 1,并修改/etc/selinux/config文件,将SELINUX设置为enforcing,确保每次系统开机以Enforce状态启动。
如此一来下次使用ssh登录root用户,提示符将变成:
-bash: /root/.bash_profile: 权限不够
使用id命令查看安全上下文(Security Context):
-bash-3.1# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:staff_r:staff_t:SystemLow-SystemHigh
切换SELinux角色:
-bash-3.1# newrole -r sysadm_r
口令:
输入密码~~
问题才刚刚开始。如果你会发现本地登录系统无法进入图形界面,startx命令报错。setforce 0后又可以了。可见还是SELinux在作怪。看来还有多少本该正常启动的程序因为受到SELinux的限制而没有启动还不得而知。
查看日志:
# less /var/log/audit/audit.log
找到和“Xorg”这个命令有关的任意一行:
type=AVC msg=audit(1315069348.069:29): avc: denied { search } for pid=3082 comm="Xorg" name="input" dev=tmpfs ino=3135 scontext=system_u:system_r:xdm_xserver_t:s0-s0:c0.c1023 tcontext=system_u:object_r:udev_tbl_t:s0 tclass=dir
简单分析下这条记录的意思,命令Xorg尝试对input文件(其实input是个目录,tclass=dir指明了这点)进行search操作。input文件位于tmpfs磁盘上(tmpfs实际上是Linux的虚拟磁盘),inode节点序号为3135:
scontext:system_u:system_r:xdm_xserver_t:s0(源,即Xorg的安全上下文)
tcontext:system_u:object_r:udev_tbl_t:s0(目标,即input的安全上下文)
将该条记录内容复制出来,保存在一个文件里,如/tmp/xorg.log,然后进入该文件所在目录:
# audit2allow -M xorg<xorg.log
audit2allow这个命令会在当前目录下分别生成xorg.te及xorg.pp。这个xorg.te为策略文本文件,可以查看其中具体内容:
module xorg 1.0;
require {
type xdm_xserver_t;
type udev_tbl_t;
class dir search;
}
#============= xdm_xserver_t ==============
allow xdm_xserver_t udev_tbl_t:dir search;
SELinux的策略不会写没关系,audit2allow这个命令给我们自动生成并编译好了,接下来只要直接应用策略:
# semodule -i xorg.pp
# echo $?
semodule命令执行的时间可能会比较久。命令执行无误后,就能在strict模式下直接使用startx了。或者建立/tmp/xorg.te文件,内容如上,然后手动编译:
# checkmodule -m -o /tmp/xorg.pp /tmp/xorg.te
列出所有载入SELinux的策略模块:
# semodule -l
删除某一模块:
# semodule -r xorg
关于SELinux的策略具体的写法:
http://www.ylmf.net/zhuanti/linux20101115d/
使用seinfo可以得到当前规则库中各种SELinux语法使用情况的摘要信息:
# seinfo
除了语法规则之外,seinfo可以输出某个语法成分的具体信息。比如显示当前policy中定义的所有SELinux User:
# seinfo --user
可以指定具体的SELinux User,并使用-x选项输出扩展信息,比如观察user_u可以扮演的角色以及MLS range如下:
# seinfo --user=user_u -x
可以用sesearch工具精细地查找一条具体的SELinux规则,用户在命令行指定待查找的语法类型、source/target,比如查找关于source domain == xdm_xserver_t、target domain == udev_tbl_t的所有allow规则:
# sesearch -C --allow -s xdm_xserver_t -t udev_tbl_t
-C参数表示含条件表达式。显示全部规则:
# sesearch -C -al|less