本文完全凭个人理解,与其他SELinux教程可能会有巨大的不同,同时也会有不对的地方,还望指出。

本文基于CentOS8编写,如果使用的是不同的操作系统,会有不同,需注意!!!
我只学习到了SELinux的target模式, 还有mls和其他的工作模式,我并没有了解到,所以本文将不涉及该部分。

这里推荐一个网站和一本书,推荐各位阅读,有助于理解SELinux的工作原理等:selinuxprojectthe selinux notebook 4th。国内网速有点慢,推荐使用特殊方式访问。
这本书,我也直接提供了国内的下载地址,速度相对快一点The_SELinux_Notebook-4th_Edition.pdf,这里我把书中使用到的源码也贴出来了notebook-source-4.0.tar.gz

什么是SELinux

SELinux,全称Security-Enhanced Linux,安全强化Linux。就如同名字一样,用于强化Linux的安全性能。其主要通过强制访问控制(MAC,Mandatory Access Control)功能来完成。

看到这里你一定还无法理解SELinux的工作原理,那么我换个思路讲。

自主访问控制

在没有SELinux的主机上,用户权限的访问控制,完全是由自主访问控制(DAC,Discretionary Access Control)完成,也就是说,用户/进程 对该文件有无权限将完全通过其文件来定义的,例:
DAC 权限查询
1.txt 定义了 somata 用户对该文件有读写执行权限, somata 组内的用户对该文件有读写权限,其他用户具有读权限。

注:还有一个特殊的用户就是root,不管你如何配置DAC,root用户都有读写权限,以及修改文件的属主,属组和权限的能力。这一点是一定要注意到的。

如果没有正常配置文件权限,或有恶意用户或进程获得到了其他用户的权限,那么其也将获取到对应的文件权限。这一点对于系统而言是致命性的打击,特别时获取到root用户权限,其将获取到整个系统的所有权。

那么我们再来看看SELinux是如何实现访问控制的。

强制访问控制

在SELinux中,大致可以分为以下两类:

  1. 主体,也就是进程。(注:登入的用户其实也是进程,可以使用命令ps来查询,登入的进程名称为bash)
  2. 对象,也就是系统资源(例如:文件、socket等)

SELinux会主体和对象打上标签(也就是安全上下文),当主体访问对象时,SELinux会基于已定义好的规则来判断该是否有访问权限,当未查询到到允许的规则时,将直接拒绝角色对资源的访问,并返回权限不足(Permission denied)。
当然,自主访问控制还是照样生效的,当角色访问资源时,将先判断DAC是否允许,再判断RBAC是否允许访问。
换句话的意思就是,用户/进程 对该文件是否有权限是通过RDBC和DAC共同完成访问控制的。

注:SELinux 规则的定义是基于白名单模式的,也就是说,在规则列表中,SELinux仅定义了允许主体对对象的访问,而不是拒绝主体对对象的访问。从这一点来说,也能体现出SELinux的强大之处。

SELinux的内置规则定义是有操作系统厂商来定制专门定制的,也就是说,每个不同的操作系统中,都会有不同的SElinux规则。当然这些规则都是基于基础规则(erfpolicy)完成的,该基础规则可在github上查询到refpolicy

这样,当恶意用户或进程获取到其他用户的权限时,也只能访问已定义可以访问的文件,而还是不能访问其他文件,因为该进程已经被定义在了一个域中,它将无法访问其他文件。基此也就加强了Linux的整体安全性。
不过还是需要注意的是,当进程被控制时,该进程能执行的操作将是已定义的规则,如果进程发生缓冲区溢出或删除一些可以删除且十分重要的文件时,SELinux并不能做出阻止动作,因为,SELinux并不是万能的,如果想要提高系统的整体安全等级,还是需要从软件入手。

SELinux 如何运行的

如下图所示,大致可以分为以下几个部分:

  • 内核中的SELinux(图中,底部部分)
  • 管理工具(图中,中部靠右部分)
  • 支持 SELinux 的软件(图中,中部靠左部分)
  • SELinux规则(图中,最右侧部分)
  • 日志系统(图中,左下角部分)
  • 安全上下文(图中,左下角部分)
  • 规则编写工具(图中,顶部部分)

SELinux 工作图标

SELinux 在内核中发挥怎样的作用

SELinux 主要在内核中主要担任权限判断的作用,当主体对对象发起请求时,会进行系统调用,在内核态下,将完成DAC和RBAC的权限判断。具体流程如下:
SELinux 内核工作流程
其中LSM Hook为钩子,当前面几步都没有问题时,权限的判断将由钩子跳转到SELinux中进行权限判断。

文件的安全上下文是如何定义

文件的安全上下文,有一套专门的规则定义,该规则使用正则匹配对应文件路径并赋予安全上下文。可以通过以下命令查看:

semanage fcontext -l

注:该规则列表多达6400多条规则,推荐使用grep等命令过滤后再次查看。
规则权限查询
如上图,当匹配到 /root/bin/ 下的文件是,将为文件打上 system_u:object_r:bin_t。
注:在 target 模式下,system_u:object_r 段并不会改变,主要改变的是 bin_t。

进程的安全上下文是如何定义

首先我们需要知道,Linux的启动流程。当Linux内核加载完成后,将从init进程开始启动,这里我找到了init进程的位置。
init 进程查询
如上图,我们可以看到 /lib/systemd/systemd 的安全上下文 type 段为 init_exec_t,这是一个特殊的安全上下文,当执行该程序时的时候,根据定义的规则,进程将自动跳转到 init_t 安全上下文中。
然后该进程将接管启动服务的任务,开始启动系统内的所有服务。注意,我们这里通过 ldd 命令可以看见,init进程是支持使用 libSELinux 的,所以当 init 进程启动其他服务的时候,他会判断服务类型,并使用对应的安全上下文。如果无法判断服务类型,那么将会使用 unconfined_service_t 作为默认安全上下文,注意此安全上下文不会限制进程的任何操作。
注:这些安全上下文并不是可以随意设置的,在规则编写的时候,会设置allow init_t kernel_t: process transition;,只有当设置了该规则,那么 init_t 进程才能在启动其他服务的时候,才能使用对应的安全上下文。当然,例如 init_exec_t 这类特殊的安全上下文一般会忽略。
现在我们可以使用 ps -auxZ 命令来查看 进程的安全上下文了:
系统进程查询
注意!!!这些进程都是由 init 进程启动的,所以才能由对应的标签,如果你直接使用当前登入的shell 来启动服务,那么它将会直接继承你当前使用的安全上下文,也就是最底下的一行的一个特殊的安全上下文,unconfined_u:unconfined_r:unconfined_t,这个安全上下文是参考规则(repolicy)里默认的一个安全上下文,该标签的定义是可以进行任何操作和访问,也就是无任何限制,所以在使用这一安全上下文的时候也是具有一定的危险性的,同时这已标签也是必不可缺的,否则管理系统时部分操作将无法完成。

安全策略的定义

这里我们已经了解到了主体和对象的安全上下文是如何定义了的,那么现在我们可以了解如何定义访问策略了。
例如,httpd_t 域内的进程想要打开 nfs_t 域内的文件是,就需要查询是否有 allow 规则了,默认情况下只要查到的规则都是可以直接允许访问的。
但是这里的查到的规则有点特殊,我们可以发现在后方跟有 httpd_use_nfs 这一布尔值,那么如果想要使此规则生效,就必须启用 httpd_use_nfs 值,否则将不允许访问。
MAC 权限查询
我们可以使用 getseboolsetsebool 命令来查看、设置相关的布尔值。例如,我们想要修改 httpd_use_nfs 的值,我们可以使用如下指令:
布尔值设置
这样,就能修改布尔值了。

访问向量缓存机制

访问向量缓存(AVC,Access Vector Cache)是为了加快策略判断的速度而添加的一个缓存,SELinux规则判断请求是先到缓存查询是否允许访问,如没有缓存记录,将到规则列表中查询,并缓存,然后返回结果。当下一次相同的请求发送时,将优先使用缓存中的结果。
执行过程如下图:
查询流程

SELinux 规则模块

SELinux为了方便规则设计人员开发规则,使用了模块化设计理念,将不同类的规则定义到不同的模块中,可以到 /var/lib/selinux/targeted/active/modules 目录下查找到这些模块了。并且可以选择禁用未使用到的模块,以达到轻量化的目的。
可以通过 semanage 来查询有那些模块,一般模块名称为服务名称:
SELinux 模块
如上图所示,该模块就是 httpd 服务使用的模块名称。
禁用模块的方法也很简单,这里就不演示了:

semanage module -d apache

注:除非十分了解这个模块在系统中发挥怎样的作用,否则不要轻易警用模块,以免照成系统无法使用!!!

本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【E5S6RBFO】获取授权信息。

最后修改:2020 年 05 月 04 日 03 : 28 PM
如果觉得我的文章对你有用,请随意赞赏