1 什么是SELinux?
SElinux?(Security Enhanced Linux)安全增强的Linux,美国国防部门在1970-1980年对操作系统安全做了一个安全研究。来自那次安全性研究的关键报告叫做Anderson报告,第一次提出在操作系统中使用访问控制的概念。2000年12月,NSA发布了第一个公开版本。
SELinux 给系统的所有的事物进行标记,包括文件、进程等,通过不同的标记内容和组织的策略实现访问控制。
SELinux
对Linux操作系统的确是一个安全增强。这个增强可以有效地缓解应用软件的缺陷问题,包括那些还没有发现的缺陷。这个增强也实现了许多安全目标,从数据保密性到应用程序完整性到提高的坚固性。使用SELinux,将我们的”城堡”从目前的沙子位置超前移动了一大步。
2 引用监视程序原理
引用在一个引用监视程序中,操作系统将无源的资源隔离到截然不同的客体如文件、运行中的程序活动条目,引用监视程序机制(叫做引用有效机制)将会通过应 用一个嵌入在一套访问控制规则中的安全策略确认在活动主体和客体之间的访问。按照这种方法,程序访问系统资源(如文件)可以被限制到那些符合安全策略的访 问,访问控制决定基于每个活动主体和客体的安全属性,安全属性指活动主体/客体与安全有关的特性。例如:在标准的Linux中,活动主体(即进程)有真实 有效的用户标识,客体(如文件)有访问许可模式,由许可模式决定进程是否可以打开某个文件。
除实现安全策略外,引用监视程序原理最初的设计目标是:
- 防止窜改(不能恶意改变或修改)
- 无旁路(活动主体不能避免访问控制决定)
- 可验证(可以证明安全策略实现是正确的)
几乎所有的操作系统都实现了某种格式的引用监视,都包括活动主体、客体和安全策略规则。在标准的Linux中,活动主体通常是进程,客体通常是用于 信息共享、存储和通讯的系统资源(如文件、目录、套接字、共享内存等)。在Linux中,与其他大多数流行的操作系统一样,安全策略规则通过引用监视程序 (即内核)强制固定和硬编码,无论这些规则的安全属性用于验证什么(如访问模式),都是可以改变和分配的,标准Linux安全是DAC格式的安全。
3 任意访问控制的问题(DAC直接访问控制)
DAC是一种允许经授权的用户(通过它们的程序如一个shell)改变客体的访问控制属性的访问控制机制,由此明确指出其他用户是否有权访问这个客 体。一个简单的DAC形式可能要数文件密码了,访问该文件需要知道文件所有者创建的密码。大多数DAC机制都是基于用户标识的访问控制属性。几乎所有现代 操作系统都有一种基于用户标识的DAC实现。在Linux中,非常流行和广为人知的是所有者-组-其它许可模式机制。同样,常见的访问控制列表机制也是通 用的方法。
所有DAC机制都有一个共同的弱点,就是它们不能识别自然人与计算机程序之间最基本的区别。DAC通常是尝试模仿所有权原理。例如:文件所有者拥有 指定文件的访问权限,只授予可以信任的用户访问文件[4所有者使用它们的辨别力判断是否授予访问权。]。假设你可以信任某个用户(通常被认为是无效的事情),计算机工作方法不是完全模仿的真实世界, 只是按照用户指定的指令在计算机上执行操作,因此,我们不能向用户提供授予和使用访问的能力,相反,我们提供软件程序实现这个功能,在internet时 代变得特别明显,程序总是充满缺陷,或干脆就是恶意程序,这就是特洛伊木马问题,首次是在1970年被认定,到目前的流行病毒、蠕虫、间谍软件,都是它的 变体。简单点说就是,如果一个用户被授权允许访问,意味着程序也被授权访问,如果程序被授权访问,那么恶意程序也将有同样的访问权。
DAC假设一开始所有的程序都是值得信赖且没有缺陷的,早期的计算机研究社团大都是住在高校中的一群人(教师、学生),因此目前发展的技术可能都是 建立在那个假设的环境基础之上的,然而,实际上,我们知道在计算机科学历史上还没有出现过那种开始环境,人类的天性总是喜欢攻击有弱点的软件。
4.强制访问控制的起源
从1970年到1980年,最主要的精力都使用在寻找解决恶意软件或有缺陷的软件的问题上,目标是实现MAC,它的访问控制判断基础不是某个人或系 统管理员的辨别力,我们想实现一种有组织的安全策略来控制对客体的访问,不受个别程序的行为影响。军方在这方面积累了大量的经验,主要是保护政府的机密数 据。大多数常见的MAC机制实现了数据多层安全,图1-2显示了一个多层安全模型的组成结构。
多层安全(MLS)一般都是基于Bell-LaPadula模型[5 http://csrc.nist.gov/publications/history/bell76.pdf],在MLS模型中,所有主体和客体都标记有安全级别,在我们的例子中,我们有 一个PUBLIC和SECRET安全级别,这两个级别代表了数据的敏感程度(SECRET的敏感度比PUBLIC的敏感度要高),在MLS中,主体总是可 以读写客体,除此之外,主体还可以读取底层客体(向下读取),写入高层客体(向上写入),然而,主体可能永远不会读取高层客体(无向上读取),也不写入底 层客体(无向下写入),意思就是信息可以从底层流向高层,但不能反过来,因此要保护高层数据的机密性。
MLS是对访问控制最根本的改变,不再是数据所有者任意地决定谁可以访问客体,此外,对大部分被认为不受信任的软件我们也有足够的安全措施,因为信 息流规则阻止了不正当的数据访问,在MLS中,通过固定的规则决定数据如何共享,而不管用户的请求(更重要的是他们运行的程序),MLS实现了大部分 MAC机制,在目前流行的操作系统中普遍存在,MAC机制与MLS类似,也是经过深思熟虑建立起来的,它实现了小部分固定的安全属性。
MLS的主要弱点是它严格地,以不可改变的方式实现了单一安全目标(即保护政府文件敏感数据的机密性),不是所有的操作系统安全业务都与数据机密性 有关,大多数都对保密政府文件(包括许多处理保密数据的政府系统)的强硬的简单的模型不肯顺从,为了在MLS中扩大这个目标,主体必须被授予安全策略特权 (即违反无旁路的原则),并信任不会违反策略的目的,这个不屈性和有限的焦点使MLS和类似的MAC机制实现了充足的要求
5.更好的强制访问控制
SELinux实现了一个灵活的MAC机制,叫做类型强制(TE),正如你将会看到的,类型强制提供强壮的强制安全能够适应大量的安全目标,类型强 制提供一种思想,将访问控制到对某一个程序级别去,在某种程度上,它允许组织定义适合他们系统的安全策略。在类型强制下,所有主体和客体都有一个类型标识 符与它们关联,要访问某个客体,主体的类型必须为客体的类型进行授权,而不管主体的用户标识符。
使SELinux比MLS解决方案更高级的是规则决定了基于类型的访问控制,这不是预先定义好的,也不是硬编码在内核中的。默认情况下,SELinux不允许任何访问,组织可以开发任意数量的规则指定允许什么,这样使SELinux可以适应非常多样的安全策略。
定义允许访问一个系统收集的规则叫做SELinux策略,物理上,SELinux策略是一个特殊的文件,它包括SELinux内核将会实施的所有规 则,策略文件是从一套源文件编译而来的,正如你马上会看到的,系统与系统之间的SELinux策略是可以不同的,在启动过程中,策略被载入内核,然后内核 就会使用它作为访问控制决定的根据。
注意:在计算机安全领域,术语策略是一个非常大的范围。在这一章中,定义一个组织的安全目标和目的 时我们使用这个术语。然而,在谈到载入内核的SELinux规则集(和包括它们的文件)时也使用策略这个术语。我们尽力避免使用这个词时产生冲突,但不能 完全避免这个问题,如果遇到有歧义的地方,我们通常会明确地编写SELinux策略来避免冲突。
SELinux为Linux带来了灵活的类型强制和一套基于角色的访问控制,以及非强制的MLS。这个灵活性和适应性强的MAC安全已经内置到主流的Linux操作系统中,说明SELinux是如此有希望的提高安全性的技术。
6 SELinux的发展
SELinux起源于自1980开始的微内核和操作系统安全的研究,这两条研究线路最后形成了一个叫做的分布式信任计算机(Distribute Trusted Mach (DTMach))的项目,它融合了早期研究项目的成果(LOCK【锁】,它包含一组安全内核类型强制;Trusted Mach【信任计算机】,它将多层安全控制合并到计算机微内核中)。美国国家安全局的研究组织参加了DTMach项目,付出了巨大努力,并且继续参与了大 量的后续安全微内核项目。最终,这些工作和努力导致了一个新的项目产生,那就是Flask,它支持更丰富的动态类型的强制机制。
由于不同平台对这这项技术没有广泛使用,NAS认为需要在大量的社团中展示这个技术,以说明它的持久生命力,并收集广泛的使用支持意见。在1999 年夏天,NSA开始在Linux内核中实现Flask安全架构,在2000年十二月,NSA发布了这项研究的第一个公共版本,叫做安全增强的Linux。 因为是在主流的操作系统中实现的,所以SELinux开始受到Linux社区的注意,SELinux最迟是在2.2.x内核中以一套内核补丁的形式发布 的。
随着2001年Linux内核高级会议在加拿大渥太华顺利召开,Linux安全模型(LSM[7 http://lsm.immunix.org/])项目开始为Linux内核创建灵活的框架,允许 不同的安全扩展添加到Linux中。NSA和SELinux社区是SELinux的主要贡献者,SELinux帮助LSM实现了大量的需求,为了与LSM 一起工作,NSA开始修改SELinux使用LSM框架。2002年八月LSM核心特性被集成到Linux内核主线,同时被合并到Linux 2.6内核。2003年八月,NSA在开源社区的帮助下,完成了SELinux到LSM框架的迁移,至此,SELinux进入Linux 2.6内核主线,SELinux已经成为一种全功能的LSM模块,包括在核心Linux代码集中。
数个Linux发行版开始在2.6内核中不同程度使用SELinux特性,但最主要是靠Red Hat发起的Fedora Core项目才使SELinux具备企业级应用能力,NSA和Red Hat开始联合集成SELinux,将其作为Fedora Core Linux发行版的一部分。在Red Hat参与之前,SELinux总是作为一个附加的软件包,需要专家级任务才能进行集成。Red Hat开始采取行动让SELinux成为主流发行版的一部分,完成了用户空间工具和服务的修改,默认开启增强的安全保护。从Fedora Core 2开始,SELinux和它的支持基础架构以及工具得到改进。在2005年早些时候,Red Hat发布了它的Enterprise Linux 4(REL 4),在这个版本中,SELinux默认就是完全开启的,SELinux和强制访问控制已经进入了主流操作系统和市场。
SELinux仍然是一个相对较新和复杂的技术,重要的研究和开发在继续不断地改进它的功能。