在新的基于RHEL一般都自带了selinux,多数情况下我们把selinux禁用了,事实上既然RHEL要集成它,必然有他的优点和长处,我们通过下文来了解selinux,也许你会喜欢用上它。英文原文来自www.RedHat.comby Russell Coker翻译:胡智江主要内容介绍:SELinux概览:SELinux深入研究:Fedora中策略的实现:Fedora的缺省SELinux策略:更多关于SELinux的资料:关于作者和译者:
介绍:当今世界,无处不在高速互联网连接、如备有无线接入点的咖啡馆和在网上到处传播的各种黑客工具使得出于对计算机安全的考虑成为老生常谈。出于解决安全问题,NSA在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。这种体系叫做 Security-Enhanced Linux或简化为SELinux。
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。
SELinux深入研究:
SELinux的策略数据库控制着SELinux的方方面面。它可以判断一个程序可能会运行在哪个域中,还可以说明某个域可以访问哪些资源。这种规定被叫做规则,一个典型的策略往往拥有100,000条规则。别被这数字吓坏,我们根本不必去关心它,因为当我们撰写策略时,我们可以使用高级宏,这些高级宏的一行就能生成10,000条规则。除了宏以外,还有一些工具,使用他们可以分析这些生成的规则是否能达到你对安全的要求。其实再和设置每个文件的UNIX 权限位这样的工作比起来,这100,000个规则也是相当小的工作量了。
Fedora Core 2安全策略的目标是满足大多数用户无需改动就可以工作的要求,但也有一些普通的简单的选项可以调节策略,一般都是简简单单的一行选项。比如是否允许用户通过dmesg阅读内核的日志,是否允许管理员(sysadm_r)直接通过SSH登陆或登陆图形会话,还有是否允许用户绑定TCP套接字。那100,000个左右的规则存储在一个大约2.6MB的文件中,当系统启动时随内核一起装入内存并占用同样大小(大约2.6MB)的内核空间。 Fedora Core 3默认的strict策略有着多余290,000条规则,占用7MB的内核空间。Fedora Core 3默认的target策略有大约5,000条规则,占用150K的内核空间。
目前,SELinux并没有在内存使用方面进行优化;但现在对这些优化工作已经有了计划和一些降低内存使用的方法。如果你不打算使用某些守护进程,你可以简单的将其对应的策略文件删除以便获得占用空间更少的策略。2003年,在Ottawa举办的一次Linux讨论会上,我提交过一篇文章,那是关于我在把 SELinux移植到HP iPAQ PDA上所做的工作的文章(在http //archive.linuxsymposium.org/ols2003/Proceedings/可以获得)。
证明我可以使SELinux(且选择 strict策略)很好的工作在一台只有 64 MBs的RAM 和32 MBs 存储空间的小平台上,并且我相信我还可以使它运行在更小的平台上。针对Fedora Core2系统,我们只把目光定位在目前最常见的硬件平台,从而得出了默认的策略配置。但那些使用老机器的用户们也许会希望配置出最小限度的策略以便减少内存使用和提高性能。
在使用了SELinux的系统中,每一个进程的上下文都包含三个组成部分:一个ID(identity),一个角色(role)和一个域(domain)
ID是指这个进程的所有者,就是UNIX账户,但前提是这个账户必须被预先编译到SELinux策略中去使SELinux认识这个账户,不然的话SELinux默认地将那些未知的系统进程ID记为 system_u ,将那些未知的用户进程ID记为 user_u;角色用来判断某个处于此角色的ID可以进入哪些域,还用来防止某个处于此角色的ID进入其它不该进入的域。比如, user_r角色就不允许进入 sysadm_t (重要的系统管理域)。
换句话说就是,那些只有 user_u [...]