SELinux 概览

SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。

众所周知,标准的UNIX安全模型是"任意的访问控制"DAC。就是说,任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件仍到/tmp目录下,那么在DAC情况下没人能阻止他!

而MAC情况下的安全策略完全控制着对所有资源的访问。这是MAC和DAC本质的区别。

SELinux里实现的MAC允许程序在/tmp目录下建立文件,也允许这个文件按照UNIX权限字的要求对全世界可读,但是当UNIX许可检查应用后, SELinux许可检查还要进一步判断对资源的访问是否被许可。
换句话说,尽管某些UNIX文件的权限被设定为0777但是你也许仍然会被禁止读,写和执行该UNIX文件。在只有DAC的情况下,用户可以查看或更改属于他的任何文件。SELinux则可以限制每一个进程对各种资源的访问,和访问的权级。就是说当一个程序在使用含有敏感数据时,这些数据会被禁止写入那些低权级进程可读的文件中。

SELinux提供了比传统的UNIX权限更好的访问控制。

例如,管理员可以只允许一个应用程序添加记录到一个日志文件但不允许其重写或者删除该日志文件的内容。虽然ext2和ext3文件系统有一个append-only标签(使用chattr设置),但是这属性不区分某一个进程(不能在为一个访问 append-only的同时,又允许另一个进程据有完全可写的权利);另一方面,一个应用程序可以被允许在一个文件夹中建立文件和向其写入数据,但不能删除文件:这种特性是没有SELinux的普通的Linux内核所不能做到的。还有,网络应用程序可以绑定到其需要的端口上(如BIND的53端口),但不能绑定其它端口。

域-类型模型意味着在安全域中运行着的每一个进程和每一个资源(一般文件、目录文件和套接字等)都有一个与之相联系的"类型"(type)。

在这基础之上建立了一系列规则,这些规则列出了某个域可以在每一个类型上执行的所有动作。域-类型模型的一个优点就是我们可以对策略进行分析,从而判断出哪些信息有可能外溢。在标准的UNIX环境中,用户一般可以使用ps命令来互相查看彼此的进程列表,然而这也会为攻击者提供有价值的信息。甚至就算完全阻止用户使用ps命令,信息还是会意外的或故意的泄露,其实在一个给定的UNIX环境中,哪些信息会发生泄露是无法判断的。

而在SELinux情况下,我们会有很多工具用来分析SELinux策略并判断哪些信息泄露是可能的。举个例子,假如有两个应用程序被允许向一个日志文件添加数据,且他们互相不能直接通信。那么如果一个其中进程又获得了对该日志的读权限的话,那么一个单方通信就有可能形成。

对访问/etc/shadow文件做访问限制是个很好的例子,通过该例子我们可以看出策略分析的好处。
如果你装了 Fedora Core 3,并且选择了严格的SElinux策略配置,那么将会有17个域被允许访问shadow_t(/etc/shadow的type),其中有9个域据有写权利。这17个域中有2个可以从用户域(user domain)进入,他们是/usr/bin/passwd和 /sbin/unix_chkpwd(一个为无特权应用程序提供密码检查的辅助程序,比如向锁屏程序就需要使用到unix_chkpwd)。这17个域中的某些域是为一些不常见的应用程序准备的(如radius_t域就是为RADIUS服务器准备的),所以,也就是说,就算除去这个不常用的域,一般的系统中还有16个可访问的域能够访问/etc/shadow呢!

值得注意的是,Fedora发型版的SELinux策略已经变得越来越灵活;未来版本的策略也许会使何以访问/etc/shadow的域超过17个,这取决于可调节选项的实际配置。还要注意的是,17这个数字是基于严格的策略设定之后而得出的,实际上一个默认的安装会大于这个数字。

在一个没有SE的机器上,任何以root身份运行的进程都可以访问/etc/shadow文件。这意味着任何被"SETUID root"的二进制代码或以root身份运行的网络服务守护进程,它们所产生的任何安全问题都将会是灾难性的。

SELinux允许我们限制这些守护进程只访问其所需:
BIND只能在53端口提供服务、DHCP服务器可以使用原始套接字(raw network access)、DHCP客户端也可以使用原始套接字并可以改变网络接口,但是它们谁都别想访问/etc/shadow,/home,/root等等这些重要的资源。
所以,在SElinux的情况下,如果BIND受到了危害,它最多也就是发送一些伪造的报文罢了。如果DHCPD受到了危害,最坏的可能就是你的ip地址分配被搞乱。这比root权力被远程滥用好多了!

大家很清楚,一个进程可以援引另一个进程。

在这种情况下,拿DHCPD为例,DHCPD也许会尝试援引 /sbin/unix_chkpwd对密码进行强力攻击。(But even that potential vulnerability is closed):SELinux能够提供"过渡"规则,这种规则可以用来判断各种域间过渡是否合法。有了"过渡"规则以后,由用户执行的屏幕保护程序可以顺利过渡到/sbin/unix_chkpwd这样一个特权域,然而DHCPD就别想了。

上述这些限制功能可以使你对系统的状态了如指掌。如果你发现你的DHCP服务器有BUG,那你只要简单的升级DHCP服务器到新版本并且确定每一个客户端都能正常获得IP地址就可以了。可是如果没有SE的话,你还要考虑你的新服务器是否已被黑客入侵并擦除了痕迹。

SElinux 对不同的域做了严格的隔离。我以前运行一个Debian系统有两年时间,在这期间我开放了他的root密码。最近两个月我在一个Fedora系统上做同样的事情。但这两个系统已经抵抗住了很多次以root身份的攻击(见httphttp://www.coker.com.au/selinux/play.html)。(译者注:这里有一些作者对其playmachine的介绍被忽略了)

为了给RHEL4做代码测试,Fedora core 2已经尝试集成了SELinux,但是默认是关闭的。而且将来RHEL和Fedora Core的SE还会有非常大的差别的。我们计划在RHEL中,将把SELinux的策略设置的比Fedora Core要严格,我们相信这样做也符合用户的要求。未来的Fedora版本的SELinux策略将会越来越严格,但再严格也不会超过RHEL。