Linux系统上的SELinux究竟是个什么?

  

前言:   <人力资源/>   

SELinux是一个很深奥的东西,我问过身边好多运维技术人员,他们公司服务器的SELinux在生产环境中是开启状态还是关闭状态,得到一个统一的答案——直接关闭,无一例外。

  

网上也有一句话——一个资深的运维工程师,他系统的SELinux一定是关闭的。

  

所以说,想了解SELinux的,可以了解一下,为了以防以后自己所在的公司要求必须开启SELinux,但自己又不懂,那就尴尬了,不了解也无所谓,因为遇到强制开启SELinux的公司,也不是那么容易的事情。

  

上面说了那么一大堆,那么什么是SELinux呢?这篇文章就要聊一聊SELinux的一些概念及设置方法。

  

正文:   <人力资源/>   

SELinux它是安全强化的linux含义,我们都知道在linux中,一个文件能不能被当前用户所读取到,是由该用户对这个文件所具有的权限来决定的,熟知的一般权限有读、写,执行,特殊的一点的权限又有lsattr命令查看到的特殊权限,又或者是SUID, SGID, SBIT等特殊权限,这些权限基本都是针对用户来进行控制的,而SELinux类似这些权限,但又不是和这些权限一个种类的,前面说到的权限是针对用户进行权限控制的,而SELinux是针对某个进程进行控制的,那么,当用户对一个文件进行读取操作时,系统是如何执行的呢?下面附上鸟哥的私房菜中的一张图片一起来看一下:
 linux系统上的SELinux究竟是个什么?

  

上图的重点在于程序如何取得目标的资源访问权限!由上图可以看出来,程序想要读取一个文件,必须要先通过SELinux政策内的规则,然后再进行安全性文本的对比,若对比失败则无法进行下一步验证(验证针对用户设置的权限),这里的政策,安全性文本都是由SELinux来提供的,总结来说,用户要读取一个文件,该读取进程必须要通过SELinux的检测(当然,SELinux要在开启状态下),然后才有资格针对用户去进行权限验证,若SELinux是关闭状态,毫无疑问咯,直接验证用户的权限即可决定是否可以读取到该文件。

  

<强>结论:用户读取一个文件,必须该进程先通过SELinux验证,然后才是对用户的权限进行验证。

  

关于上面提到的政策及安全性文本,我也没搞的太明白,里面的东西过于深奥(这是我一个在国外工作的朋友对我说的,毕业两年,年薪30 w +,我挺佩服的一个人)。

  

我们不搞那么深奥的东西(主要是我也没怎么搞懂),我们就来一些简单的。

  

1,如何查看SELinux对一个文件的权限控制?

  
 <代码> [root@node1 ~] # ls - z #这就是查看SELinux相关权限的选项
  - - - - - - - -。根的根“system_u”:“object_r”:“admin_home_t”: s0 anaconda-ks.cfg
  #最后一列是文件名
  -rw-r - r -根的根?cpu.cfs_quota_us ~
  -rw-r——r。根的根system_u: object_r: admin_home_t: s0 initial-setup-ks.cfg
  #在上面字体颜色有些特殊的便是SELinux的特殊权限 
  

我刚看到这些东西的时候,内心的想法就是:我的天哪,这是什么鬼东西!哈哈! ! !

  

不要慌,问题不大,我这篇文章存在的意义就是将复杂的问题简单化,你需要了解的是”“system_u”:“object_r”: admin_home_t”每个文件的三个字段的意思,但也不需要全部了解,你只需要知道每一段后面”_u _r”的含义,以及最主要的一段“_t”这段是什么就行了,前面两段”“_u _r”选择性忽略就行了。

  

相关解释如下:
_u(用户):相当于账号方面的身份识别!
_r(作用):通过角色字段,我们可以知道这个资料是属于进程,文件资源还是代表使用者。一般的角色有:object_r:代表的是文件或目录等文件资源,这应该是最常见的;system_r:代表的就是进程啦!不过,一般使用者也会被指定成为system_r。
_t(类型):这个最重要,前面两个“用户”和“角色”基本不重要,重要的是在于这个类型(类型)字段!基本上一个主体进程能不能读取到这个文件资源,就与这个字段有关。

  

上述是SELinux对文件的权限控制,SELinux也是针对于进程来进行权限控制的,那么,如何查看进程所对应的SELinux权限呢?请看下面:

  
 <代码> [root@localhost ~] # ps ez #执行该命令,查看进程所对应的SELinux权限
  标签PID TTY CMD
  system_u: system_r: init_t: s0 1 ?00:00:01 systemd
  system_u: system_r: kernel_t: s0 2 ?就是kthreadd
  system_u: system_r: kernel_t: s0 3 ?就是ksoftirqd/0
  system_u: system_r: kernel_t: s0 4 ?就是kworker/0时
  system_u: system_r: kernel_t: s0 5 ?就是kworker/0:0H
  system_u: system_r: kernel_t: s0 6 ?就是kworker/u256:0
  system_u: system_r: kernel_t: s0 7 ?就是迁移/0
  ............... #省略部分内容
  #当然了,SELinux必须是开启状态下,才可查看这些信息,如果SELinux关闭,是查不到的。

Linux系统上的SELinux究竟是个什么?