入门理解SELinux,创建SELinux策略

SELinux并不是象许多人想的那样难以管理。现代Linux发行版都装载了许许多多的安全特性和工具,大部分重要的特性都被添加到内核中去了,如SELinux。

SELinux在安全方面解决了许多具有挑战性的问题,如何控制信任用户或进程,信任用户,如在*nix域的root用户,可以无限制地访问系统,而这个账号应该只有系统管理员可用,但是,这会引起一个问题,如果root本身被黑会发生什么,让黑客可以完全控制整个系统,恶意用户不是唯一的问题,错误配置一个安全工具,如iptables,导致隐藏极深难以发现的问题,除此之外,假设在你服务器上运行的服务有一个安全漏洞被发现,而且补丁还没有发布出来,假如这样,你的系统就很脆弱,SELinux通过在内核中实施强制访问控制(MAC)来解决了这些安全问题,SELinux基于Flask安全框架,本文不打算讨论Flask框架,在互联网上可以找到有关它的优秀文档。

为了理解强制访问控制,我们必须讨论一下目前部署的叫做任意访问控制(DAC)的安全模块,在一个DAC系统上,对对象的访问受限于它们的类别,这 种类型的控制是任意的,一个主体拥有访问权限后它可以将这个权限指派给其它用户,例如:有相同访问权限的用户登陆后,都可以访问你运行的任何程序,而权限 又是另外一个用户设置的(如root)。

任何特殊的权限(读、写、执行等)都可以被看做一个二维图,用户在一个轴而对象在另外一个轴上,本质上,DAC系统检查存储的信息目前凭证的有效性。

如前面提到的,SELinux安全模块是强制访问控制或MAC,这是一个不同的访问控制方法,DAC安全模块是基于认证的,而MAC系统依赖授权,不仅针对用户而且系统载入的对象。

MAC系统单独控制对象并且决定基于安全策略的对象权限和/或许可,安全策略定义了对象应该授予的权限,以不同变量为基础来进行定义。

影响计算机操作的任意访问控制的一个例子是一个Python脚本,如果脚本允许一个外部的实体在DAC计算机系统上插入并执行恶意代码,恶意代码就具有与执行的代码相同的访问权限,即与那个Python脚本权限一样。

一个MAC系统能限制某个特定进程的权限,仅允许它对需要的资源进行正常操作,一个Python脚本可能会创建一个进程(也可能被禁止),但是这个进程不具有与创建它的进程相同的权限,因此,MAC更安全。

简述SELinux的本质

在SELinux下,安全策略配置是用m4语言在一个文本文件中定义的,在安全策略定稿后被编译,在系统启动时载入内存,只有安全服务器能决定一个对象的权限。

安全策略的执行是由一个叫做对象管理器的组件完成的,它从客户端对象接收请求,向安全服务器条件查询并强制实施查询结果。

安全服务器的SELinux实施使用了2个安全范例的组合,它们叫做类型增强(TE)和基于角色的访问控制(RBAC)。

类型增强

类型增强做出的安全决定基于对象请求的许可种类,例如:对象类型可能包括一个常规文件、一个目录、一个进程或一个套接字,类型增强是一个对象标记系统,与访问映射一起(对象请求许可的域和对象请求的类型),返回一个对象许可动作的定义。

基于角色的访问控制

基于角色的访问控制在一个基于角色的计算机系统上指出对对象的许可,在实践中,这意味着一个进程应该基于它父进程的许可。

进程、文件系统对象和套接字是如何与其他通讯的?这个在安全策略中有定义,特别地,安全策略与其他特定规则一起管理不同类型和角色之间是如何交互的。

目前,SELinux提供与已有应用程序二进制兼容性,与内核模块具有源代码兼容性,目前SELinux的实现是基于x86架构的。

获取并安装SELinux

如今SELinux已经包括在多数发行版中,即使在主发行版里没有,一般也会提供特殊的安装包,源代码可以在http://www.nsa.gov/selinux/code/download0.cfm找到。

安装seedit

seedit是一个基于webmin的用户界面友好的工具,它允许管理员从一个web浏览器来管理SELinux策略,seedit允许用户执行通 过用m4语言在一个点和点击环境中手动编写的脚本中指定的每一个操作。可以在http://seedit.sourceforge.net/找到它。

一旦安装好后,SELinux策略被定义在$SELINUX/(seedit-something)/policy/policy.conf文件中($SELINUX是你安装SELinux的根目录—通常是/etc/selinux/)。

让我们先来熟悉一下seedit的接口,打开一个浏览器,定位到http://localhost:10000,然后转到系统–>SELinux配置小节。

你将看到6个标记为配置ACL、定义域转换、定义用户角色之间的关系、创建新域/角色、删除域/角色和升级配置图标。

配置ACL

实际上你可以在这里定义几乎所有系统中对象的访问控制,包括对目录下的所有文件设置允许/不允许读、写或执行,或对单独的文件进行设置以及允许/不允许访问网络,在这一小节,你也可以定义应用程序工作要用的端口,我们给Apache指定80端口,图个它从81端口启动,SELinux将终结这个进程。

IPC访问控制也可以在这一小节定义,你可以定义这个特定应用程序使用哪种IPC机制,并定义哪个应用程序能与其进行通讯。

在这一小节还可以定义其他访问控制包括许多管理的访问控制,如内核通讯权限、SELinux操作、进程信息检索等等。

定义域转换

在域转换小节,你可以定义哪个进程能生成当前的应用程序,例如:默认情况下,seedit策略为MySQL定义域转换:kernel?init?mysqld,这意味着内核能启动init,init能启动MySQL后台进程,如果应用程序有一个后台进程,域转换应该被定义或者后台进程将永远不启动。因此在这一小节,用户可以定义域转换,修改已有的或移除它们。

定义用户和角色之间的关系

角色是指某个对象(如用户)在系统上拥有的权限,例如:可能有一个角色允许访问系统里的所有文件,因此,在这一小节,用户可以在系统上将角色与特定用户关联起来。

下面的两小节是不需要加以说明的,它们允许你定义一个新的域/角色和移除一个域/角色,定义一个域/角色是为一个新应用程序或用户添加访问控制的第一步。

最好一小节是升级配置,它允许用户升级策略、重新编译以及重新载入。

seedit附带了许多预设的策略,覆盖了Linux系统每一个流行的服务/后台进程—从内核到MySQL后台进程。

为一个后台应用程序定义一个新的策略

为一个后台应用程序定义一个SELinux策略是一个反复的过程,第一步是在SELinux中注册后台进程,在seedit webmin接口上申明一个域/角色,前面已经说过了,域约定用_t结束,角色定义用_r结束,因此,应该有一个角色如admin_r,一个域如 mysqld_t。

定义域转换是另外一个重要步骤,这里你必须允许后台进程的父进程生成相关的子进程,通常,如果后台进程在启动时激活,你需要定义一个从init到子进程的域转换。

给后台进程定义初始化访问控制列表, 目前,当后台进程初始化安装后,为用户定义一个详尽的ACL是不可能的,通常是通过初始化ACL列表定义完成的,但它有很大的局限,每当应用程序访问一个 对象时不被允许,产生一条访问违规的消息,存储在/var/log/messages中,当你使用这个后台进程时,SELinux将报告一些违规信息,我 们尝试为一个叫做foobar的后台进程编写规则,违规消息就象下面这样:

|avc: denied { write } for pid=7279 exe=/usr/bin/foobar comm=ifup
name=dhclient-eth0.conf dev=hda12 ino=57400
scontext=system_u:system_r:foobar_t tcontext=system_u:object_r:etc_t
tclass=file

从这个违规消息来看我们的应用程序尝试在dhclient-eth0.conf文件上进行写入操作,可以通过授予应用程序写入dhclient- eth0.conf文件的权限来消除这个违规信息,这个违规可以通过转到配置ACL小节被解决,在文件ACL小节下,浏览到这个文件放置的位置,给应用程 序foobar写入权限。

另一个违规看起来可能是这样的:

|avc: denied { create } for pid=7279 exe=/usr/bin/foobar
scontext=root:system_r:foobar_t tcontext=root:system_r:foobar_t
tclass=udp_socket

这个违规报告指出应用程序尝试创建一个UDP套接字,但是被拒绝了。要移除这个违规信息,我们只需要简单地将网络特征添加到foobar_t域的访问控制,通过转到配置ACL小节/网络ACL小节来完成,为域foobar_t选项允许网络。

所有访问违规都可以在seedit webmin接口下的配置ACL小节来得到处理。

在每个策略升级后,通过seedit webmin接口升级策略选项重新载入,然后重新启动后台进程,发生其他违规时,再次升级它,直到你几乎看到违规消息为止。

在audit2alow工具的帮助下有其他办法为一个应用程序产生访问规则,但是使用它能产生规则,也能产生安全问题,通常你还需要重新清理一篇这些规则。

当创建或升级策略时,确保你已经设置SELinux为许可模式,SELinux有3个模式:强制、禁止、许可。在强制模式下,所有访问控制严格按照 定义的策略执行的,在许可模式下,策略不是强制的,但是当任何违背策略的操作发生时都会生成一条违规消息,禁止模式完全禁用了SELinux。

发表评论?

0 条评论。

发表评论