分类: 网络与安全
2009-06-24 13:40:38
SELinux全称Security Enhanced Linux,由美国国家安全局(National Security Agency)开发,构建于kernel之上的、拥有灵活而强制性的访问控制结构,旨在提高Linux系统的安全性,提供强健的安全保证,可防御未知攻击,相当于B1级的军事安全性能。
Selinux源于1980年开始的微内核和安全操作系统的研究,最后形成一个叫分布式信任计算机DTMach的项目;
1999年NSA在Linux内核中实现Flask安全框架;
2000年发布了这项研究的第一个版本,叫做安全增强的Linux。
2001年,Linux内核高级会议在加拿大召开,期间,在Linus的建议下确立了一个灵活的Linux安全模型LSM,允许不同的安全扩展可以添加到Linux。
2002年LSM成功的植入Linux ,合并到2.6内核当中。
2003年,在开源社区的帮助下,selinux成功的移植到LSM框架,从此selinux成为2.6kernel的一部分。
2005年RedHat发布Enterprise Linux 4,其中包含selinux功能,标志着selinux从此进入主流的商业操作系统。
在标准Linux中,主体的访问控制属性是与进程通过在内核中的进程结构关联的真实有效的用户和组ID,这些属性通过内核利用大量工具进行保护,包括登陆进程和setuid程序,对于客体(如文件),文件的inode包括一套访问模式位、文件用户和组ID。以前的访问控制基于读/写/执行这三个控制位,文件所有者、文件所有者所属组、其他人各一套。由此带来一系列的问题:
1、存在特权用户root,任何用户只要的到了root权限就可以对整个系统进行随意的操作。倘若运行于之上的服务被骇客攻陷,其服务器最高权限就有可能随之丧失,这带来了安全隐患。
2、对于文件的访问权限的划分不够细,对于文件的操作只能有【所有者】、【所有组】、【其他】。比如无法对于所有组当中在进行划分,无法对其他再进行更细的划分。
3、DAC(自主存取访问控制),对于文件的拥有者可以对文件进行所有操作,这会对系统的管理带来很大的安全隐患。
4、SUID的使用,Linux中的权限问题给Linux的编程和使用带来了很多麻烦,因此产生了SUID。它可以使普通用户的程序的执行权限变成root权限,解决了很多权限问题,但当程序本身存在漏洞时,会给系统带来灾难性的后果的。
Setuid解决的是标准linux的域转换问题,例如,当joe要更改密码时,通过给passwd赋一个setuid值,使它执行时具有root权限。在一个普通Linux系统上列出密码文件,看到的会是:
# ls -l /usr/bin/passwd |
在所有者权限的x位置被设置为s了,这就是所谓的setuid位,意思是任何执行这个文件的进程,它的有效UID(即用户ID)将会被改为文件所有者。这里,root是文件所有者,因此当执行密码程序时实际上将会以root用户的ID运行,图1显示了这些步骤。
图1
1、当joe执行密码程序时,shell将产生fork调用创建一个自身的副本,这个复制进程仍然有真实有效的用户ID(joe)。
2、新的进程将会产生一个execve()系统调用来执行密码程序。之后,真正的用户ID将从进程的原始ID改为文件所有者的ID(root)。
由此,我们可以看到两个问题:
一、当以普通用户执行密码程序时,密码程序会以root权限运行,因为root具有访问所有系统资源的权限,所以密码程序也就拥有访问所有系统资源的权限。违反了安全原则的最小权限原则。
二、当别的程序同样以setuid的方式获取了root权限以后,可以访问/etc/shadow文件从而可以更改密码。
Selinux中,每个对象(程序、档案、进程)都拥有一个安全上下文(security context),它就像一个标签,标示每一个对象,表示这个对象所具有的权限。可以通过制定security Policy(安全策略)来定义这些安全上下文,从而来规定那种对象具有哪些权限。当一个对象要执行某项动作时,系统按照security policy所规定的内容来检查相对应的权限,若权限符合,则执行,反之,则拒绝。当然,selinux当中的权限认证不仅跟selinux所制定的security policy有关,而且跟标准linux的DAC访问控制相关,他们是正交的关系。确切来说是先进行DAC检验,权限不符直接返回失败,DAC通过以后再进行selinux安全认证
1、MAC(Mandatory Access Control)-对访问的控制彻底化,对所有的文件、目录、端口的访问,都是基于策略设定的。系统不再允许对象的拥有者随意修改或授权此对象,而是透过强制的方式为每个对象统一授予权限。
2、RBAC(Role Base Access Control)-对于用户只赋予最小权限。对于用户来说,被划分成一些role,即使是root用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。因为,哪些role可以执行哪些domain也是在策略里设定的。role也是可以迁移的,但是只能按策略规定的迁移。
3、TE (Type Enforcement)-对进程只赋予最小运行权限, TE概念在 SELinux中非常重要;其特点是对文件赋予一个叫type的文件类型标签,对于进程赋予一个叫 domain的 标签;Domain标签能够执行的操作也是由access vector(存取矢量)在策略里设定好的。
4、domain迁移-防止权限升级,A程序在A Domain内运行,B程序在B Domain内运行,在A Domain中执行B程序时,可以规范B程序使用A Domain的环境还是使用B Domain的环境。
如图2:
图2
主体:就是系统进程,如/usr/sbin/vsftpd等。
策略:就是selinux根据安全上下文决定是否可以执行某项操作的规则。
Av规则:按照客体类别的访问许可指定具体含义的规则。
对象:也可叫做客体,就是主题要求访问的实体。如:文件、目录等。
在SE Linux中的身份是安全上下文的一部分,它会影响哪个域可以进入,也就是本质上的可以被执行。
所有进程都在域中运行。域直接决定了进程的访问。域基本上是一个进程允许做的操作的列表, 或者说它决定了一个进程可以对哪些类型进行操作。
类型分配给一个对象并决定谁可以访问这个对象。它的定义和域基本相同, 不同就是域是对进程的应用而类型是分配给目录,文件,和套接字的。
角色决定了那些域可以使用。有关哪些与可以被哪些角色使用可以预先定义在策略的配置文件里。如果一个策略数据库中定义了一个角色不可以使用一个域, 它将被拒绝。
安全上下文包括了所有事情的属性的描述,包括文件, 目录, 进程, TCP sockets 何以上所有的东西。安全上下文包括了身份,角色和域或者类型。
策略就是可以设置的规则,决定了例如一个角色的用户可以访问什么; 哪个角色可以进入哪个域 and 哪个域可以访问哪个类型等这样的问题。
访问规则:allow passwd_t shadow_t:file {read write ..}
passwd_t类型代表密码程序使用的域类型,shadow_t类型代表shadow密码文件的类型。检查这个文件,我们将会看到:
在这个策略下运行密码程序passwd,不输入密码,切换终端发现:
这样当joe运行passwd程序的时候,获得root执行权限euid后,会受到规则限制,从而只能访问passwd_t所能访问的类型shadow_t,从而实现了每个进程只能在他自己的域范围运行。就像chroot一样,即使进程本身有漏洞,被攻破后也只能在进程所属的域范围内,而不会扩大使整个系统瘫痪。
allow规则确保passwd进程域类型(passwd_t)可以访问shadow密码文件,然而,我们仍然有前面已经提到的域转变问题,提供一个安全的域转变与setuid程序的原理非常类似,但强化了类型强制。域转变只有在同时满足下面的三个条件时才允许进行:
1、进程的新域类型对可执行文件类型有enTRypoint 访问权
allow passwd_t passwd_exec_t : file entrypoint;
2、进程的当前(或旧的)域类型对入口文件类型有execute 访问权。
allow user_t passwd_exec_t : file {getattr execute};
这条规则所做的事情是允许Joe的shell(user_t)在passwd可执行文件(passwd_exec_t)上启动execve()系统调用。
3、进程当前的域类型对新的域类型有transition 访问权
allow user_t passwd_t : process transition;
图4
可传入内核参数selinux=0|1(关闭|打开); enforcing=0|1(enforcing|permissive)
enforcing强制模式,只要SELinux不允许,就无法执行;
permissive警告模式,将该事件记录,依然允许执行;
disabled关闭SELinux;
停用、启用需要重启计算机;
使用setenforce切换enforcing与permissive模式不需要重启计算机;
getenforce及sestatus查看执行模式;
targeted,保护常见的网络服务,为SELinux默认值;
strict,提供符合Role-based-Access Control(RBAC)之policy,具备完整的保护功能,保护网络服务、一般指令及应用程序。默认为不安装的策略;
改变policy后,需要重启计算机;