SELinux概述
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SELinux使用了分级的强制访问控制,是Linux核的重要安全措施。SELinux的安全策略工具可从oss.tresys./projects下载。本章分析了SELinux的安全机制,介绍了安全策略配置语言、核策略库的结构,简述了SELinux核模块的实现,还分析了用户空间的客体管理器。
3.1SELinux概述
SELinux是安全增强了的Linux,是Security-enhanced Linux的简写,SELinux改进了对核对象和服务的访问控制,改进了对进程初始化、继承和程序执行的访问控制,改进了对文件系统、目录、文件和打开文件描述的访问控制,还改进了对端口、信息和网络接口的访问控制。早期的Linux核只提供了经典的UNIX自主访问控制(root用户,用户ID,模式位安全机制),以及部分地支持了POSIX.1e标准草案中的capabilities安全机制,这对于Linux系统的安全性是不够的,NSA(the National Security Agency)和SCC(Secure Computing Corporation)共同开发了强大的基于类型加强(Type Enforcement)的强制访问控制(mandatory access control,简称MAC)机制,提供了动态的安全策略机制。
Linux核增加了一个通用的安全访问控制框架,它通过hook函数来控制程序的执行,这个框架就是Linux安全模块(LSM),在LSM上可使用各种安全控制机制(如:Flask机制)来实现对程序的控制。
SELinux应用了类型加强(Type Enforcement,TE)和基于角色访问控制(role-based access control,RBAC)技术。
TE给每个主体(进程)和系统中的客体定义了一个类型,这些类型定义在SELinux的安全策略文件中,以安全标签形式存放在文件本身的扩展属性(extended attributes,简称xattrs)里。
当一个类型与一个进程相关时,这个类型称为域(domain),例如:后台进程httpd的域为httpd_t。
主体(subject)对客体(object)的操作在SELinux中默认下是不允许的,而由策略定义允许的操作。TE使用主体的域和客体类型从策略文件中查找操作许可。例如:策略中的一条规则如下:
allow httpd_t net_conf_t:file { read getattr lock ioctl };
这条规则表示httpd_t域对net_conf_t类型客体的文件有“{}”中所表示的操作权限。SELinux的访问控制规则存放在安全策略文件中,策略文件分为二进制和源代码文件,源代码以策略配置语言的形式描述,由编程者创建和维护。源代码经策略配置工具编译后生成二进制文件。二进制策略被装载到核空间,形成在存中的策略库及缓存,核就可以使用访问控制规则了。
SELinux可以实现非常小颗粒的访问控制,这些细小颗粒的访问控制也造成了安全策略的复杂性。
Linux核的SELinux安全体系由Flask和LSM框架共同组成,LSM是由hook函数组成的安全控制框架,Flask框架将SElinux的策略规则转换成访问控制许可。
在安全策略配置语言中经常用到的名称术语说明如下。
subject 主体,常指一个进程
object 客体,常指一个文件
object class客体的类
permission 许可
context上下文
user用户
role角色
type 类型
Type Attributes 类型属性
Type Enforcement 类型增强
dormain 域,它是一个进程的类型
source type源类型
target type目标类型
labeling标识
access vector cache (AVC) 访问向量缓存
access decision 访问决策
3.1.1Linux与SELinux在安全管理上的区别
在传统的Linux自由访问控制(Discretionary Access Controls,DAC)之后,SELinux在核中使用强制访问控制机制(MAC)检查允许的操作。
在DAC下,文件客体的所有者提供了客体上的潜在风险控制。用户可以通过错误配置的chmod命令和一个非期望的访问权限传递,暴露一个文件或目录给一个恶意信任者。这个用户启动的进程,如:CGI脚本,可在这个用户拥有的文件做任何的操作。
DAC实际上仅有两个主要的用户分类:管理者和非管理者。为了解决权限分级,它使用了访问控制列表(access control lists,简称ACL),给非管理者用户提供不同的权限。而root 用户对文件系统有完全自由的控制权。
MAC访问控制框架可以定义所有的进程(称为主体)对系统的其他部分(如:文件、设备、socket、端口和其他进程,它们被称为客体或目标对象)进行操作的权限或许可。这些许可由进程和客体的安全策略来定义,通过核实现控制。这种方式可给一个进程仅授予操作所需要的权限,这遵循了最小权限原则。在MAC下,即使用户用chmod暴露了他们的数据,但进程还是无法修改在策略中没有许可的文件。
DAC和MAC分别使用自己的访问控制属性,两者独立,但都必须通过权限检查。它们的区别有以下二个:
1.在主体的访问控制上:
DAC:真实有效的用户和组ID
MAC:安全上下文(user:role:type)
DAC和MAC的UID是独立的。
2.在客体的访问控制上:
DAC:(文件)访问模式(rwx r-x r-x)和用户及组ID
MAC:安全上下文(user:role:type)
3.1.2Flask安全框架概述
1.Flask框架对操作许可的判定过程
图3-1描述了Flask框架,图中,一个主体进程对系统中的客体(如:设备文件)进行操作,如:读写文件。这个操作通过DAC权限检查之后,再进行SELinux的权限检查。在DAC检查中,主体通过基于ACL常规文件权限获得了对客体的操作许可。SELinux权限检查的过程如下:
策略强制服务器(policy enforcement server)从主体和客体收集安全上下文,并发送安全上下文标签对给安全服务器(security server),安全服务器负责产生策略的决策。
策略强制服务器首先检查AVC,如果AVC有高速缓存的策略决策,它返回决策给策略强制服务器。如果没有,它转向到安全服务器,安全服务器使用系统初始化期间装载到核的二进制策略作出决策,将决策放到AVC的cache中进行缓存,并将决策返回给策略强制服务器。如果决策为允许操作,则主体对客体进行操作,否则,操作被禁止,禁止操作信息被记录到log文件,log文件一般为/var/log/messages。