与传统的自主访问控制不同,强制访问控制具有更高的安全性。SELinux是强制访问控制机制的一个代表,本文将介绍如何应用该机制来管理网络服务的文件系统访问权限,并以Fedora 16下的SELinux为例进行实例介绍。
一、强制访问控制机制简介
在传统的访问控制机制中,自主访问控制模型占主导地位。使用自主访问控制(discretionary access control,DAC)的系统可以让资源的拥有者指定哪些主体可以访问该资源。这种模型称为“自主型”是因为对访问的控制是由资源拥有者自主决定的。在 DAC模型中,访问根据授予用户的权限来进行限制,这意味着客体的拥有者有权指定对这些客体的访问类型。如果一个组织采用了DAC模型,那么网络管理员可以让资源的拥有者控制哪些人可以访问他们的文件。DAC模型中最常见的实现方式是访问控制列表(access control list,ACL),这个列表由用户指定,由操作系统实施。我们使用的大多数操作系统都是基于自主型访问控制模型的,比如Windows、 Macintosh和主流的Unix系统。
而在强制型访问(mandatory access control,MAC)模型中,数据的拥有者没有决定谁能访问这些文件的权力,是由操作系统最后做出决定,并且可能会覆盖数据拥有者的设置。这种模型更为结构化并更加严格,一般基于安全标签系统来实现。用户被赋予一个安全级别(秘密、机密、绝密等),且数据也被分成了多个类别。这种分类存储在资源的安全标签里面。分类标签指明了用户访问一个文件时必备的可信级别。
当系统接到一个客体访问请求时,它根据主体的安全级别和客体的安全类别作出决策。主体如何访问数据的规则由管理层制定,由管理员配置和管理,由操作系统来进行实施,由安全技术支持。安全标签和各个客体附在一起,所以每一个文件、目录和设备都有其自己的安全标签以及分类信息。一个用户可能具有秘密(Secret)的访问级别,他要访问的数据具有绝密(Top Secret)的安全标签。这种情况下用户会被拒绝访问,因为他的安全级别不等于或低于客体的安全类别。目前,最常见的MAC系统是由美国国家安全局(NSA)和安全计算(Secure Computing)公司开发的SELinux。在较高版本的Linux发行套件中,如Red Hat Enterprise Linux(RHEL)5,RHEL6,Fedora 1至Fedora 16等版本中,都包含对SELinux的支持。
二、如何启动和关闭SELinux
使用SELinux的前提启动它。启动和禁用SELinux的步骤主要包括:1)修改其配置文件;2)执行重启。
首先需要介绍一下SELinux的主配置文件。主配置文件/etc/selinux/config控制系统下一次启动过程中载入哪个策略,以及系统运行在哪个模式下,可以使用sestatus命令确定当前SELinux的状态,下面显示了一个config文件的例子:
SELinux模式(由上述例子中第6行的SELINUX选项确定):可以被设置为enforcing,permissive或disabled三种:
1) 在enforcing模式下,策略被完整执行,这是SELinux的主要模式,应该在所有要求增强Linux安全性的操作系统上使用。
2) 在permissive模式下,策略规则不被强制执行,而只是进行审核。除此之外,SELinux不会影响系统的安全性,这个模式在调试和测试一个策略时非常有用。
3) 在disabled模式下,SELinux内核机制是完全关闭的,只有系统启动时策略载入前系统才会处于disabled模式,这个模式和 permissive模式有所不同。permissive模式不会拒绝任何访问,只是进行审核;而在disabled模式下,SELinux将不会有任何动作。特别地,在enforcing和permissive模式或disabled模式之间切换时要小心,当返回enforcing模式时,通常会导致文件标记不一致。SELinux配置文件中的模式设置由init使用,在它载入初始策略前配置SELinux使用。
以下是启动SELinux的详细步骤示意:
(1)编辑配置文件
根据上面的介绍,编辑确定SELinux的运行模式和活动策略(见下面配置文件中的黑体部分)即可:
(2)使用getenforce命令和sestatus命令查看SELinux的运行模式和详细上下文信息:
#/usr/sbin/getenforce
#/usr/sbin/sestatus
(3)使用root用户身份重启系统即可:
#reboot
同理,禁用SELinux的步骤就是在编辑配置文件时设为“SELINUX=diabled”。
三、使用SELinux策略目录
如上述的例子中,SELinux配置文件中的SELINUXTYPE选项告诉init在系统启动过程中载入哪个策略,这里设置的字符串必须匹配用来存储二进制策略版本的目录名,例如,用户使用MLS(Multi-Level Security,多级安全)策略,因此用户设置SELINUXTYPE=MLS,确保用户想要内核使用的策略在/etc/selinux/config 文件中。在上述例子中,活动策略默认为目标策略(targeted),由第10行给出所示。
SELinux系统上安装的每个策略在/etc/selinux/目录下都它们自己的目录,子目录的名字对应于策略的名字(如,strict,targeted,refpolicy等),在SELinux配置文件中就要使用这些子目录名字,告诉内核在启动时载入哪个策略,在本章中提到的所有路径都是相对域策略目录路径/etc/selinux/[policy]/的,图1是在最新的Fedora 16系统上/etc/selinux/目录的简单列表输出: