• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Linux中安全增强系统SELinux

安全管理 彭东稳 8年前 (2015-12-17) 25006次浏览 已收录 0个评论

在大多数用户的眼里,每次登陆Linux系统都必须输入密码,而且除了root之外,一个普通用户不能随意读写其他用户的文件,也不能更改系统设置,应该足够安全了。当了解到PAM那样的用户认证机制之后,更加坚定了对Linux系统安全性的信心,似乎从此以后就可以高枕无忧了。但是遗憾地说,只因PAM是用户认证机制,而不是用户授权机制。真正的用户授权机制在Linux的内核,而且这套机制存在问题,下面一一道来。

我们知道,传统的 Linux 系统中,默认权限是对文件或目录的所有者、所属组和其他人的读、写和执行权限进行控制,这种控制方式称为自主访问控制(DAC)方式;而在 SELinux 中,采用的是强制访问控制(MAC)系统,也就是控制一个进程对具体文件系统上面的文件或目录是否拥有访问权限,而判断进程是否可以访问文件或目录的依据,取决于 SELinux 中设定的很多策略规则。

DAC(主动访问控制

Linux 内核的用户授权机制也叫访问控制机制,在前面已经说过用户身份问题和文件管理方式就是受控于这种机制。Linux 系统中的用户主要分为 root 和普通用户两种,并将它们划分到不同的群组中。这两种用户是否能够访问系统中的某个文件则与该文件的rwx权限属性有关。如果某个程序想要访问这个文件,Linux内核会根据该程序的拥有者的 UID 和所属组的 GID 与该文件 UID GID rwx 权限属性进行对比来决定是否允许操作。

Linux 这种控制文件访问的机制有一个非常好听的名字——主动访问控制,Discretionary Access Control,简称 DAC。其缺陷如下(有利有弊):

  • root拥有特权:rootDAC中不受任何限制,如果某个拥有root权限的程序被别有用心的人所控制,那么他就可以利用这个程序在你的系统上干人任何事情,而且你还不知道。
  • SUID程序的权限升级:Linux为了实现类似让用户能够修改自己密码的操作(shadow文件只能由root存取),只能给某些程序开启一个后门,这个后门就是SUID,这可是特权的直接产物,因为有特权就会有人通过特权走捷径。虽然设计良好的带有SUID的程序都会集成PAM,但是如果被人利用那么损失将会等同于root
  • 用户可以利用程序来更改文件的存取权限:如果某个用户为了自己的方便,将某个目录的权限设定为777,那么该目录就可以被所有人任意访问。

MAC(强制访问控制)

主动访问控制相对应的是强制访问控制,英文叫Mandatory Access Control,简称MACMAC可以规避DAC的所有问题,因为MAC针对特定的程序与特定的文件进行关联性地访问控制。即便你是root,在使用不同的程序的时候,你所能访问的文件也只是那个程序所能访问的文件。换句话说,MAC控制的主体是程序而不是使用者,MAC规定了一个程序能够访问哪些文件,而跟使用这个程序的用户无关。

但是,一个Linux系统中的程序数量比它的用户数量多个几十倍是一点都不奇怪的,那么每个程序都使用MAC来控制似乎不太现实。Linux系统采用了一个折中的方案—-DACMAC结合使用。对于大多数与安全无关的程序就使用DAC来控制好了。对于那些安全攸关的程序,比如passwdhttpd等则采用MAC来控制,只能让他们读取/etc/shadow文件或访问/var/www/目录,即便他们存在某些问题能够被那些别有用心的人所利用,又能掀起多大的风浪呢?而且即便是使用MAC控制的程序,也首先要进行一次DAC的控制。这样,这个系统的访问控制能力不但细腻得多,安全得多,也容易使用了。

那么Linux是怎么实现MAC的,就像DAC那样,MAC也是由Linux内核来实现的,比较经典的有SELinuxAppArmorGrsecurity,其中SELinux已经包含在Centos/RHEL/redora LinuxDebian/UbuntuSuseslackware等很多发行版中,下面我们就来说说SELinux是怎么实现MAC访问控制又是如何提供强健的安全保证和防御未知攻击的吧。

SELinux

首先,SELinux是一种基于策略的MAC安全系统,是以Linux内核可加载模块的形式提供的。

其次,SELinux的全称是Security enhanced linux,翻译过来就是安全强化Linux,是Linux上最杰出的新型安全子系统。

另外,SELinux的来头也不小,是由美国国家安全局开发,所以它的能力是不容小觑的。

最后,SELinux是在2.6版本的Linux内核中开始被引用。对于目前可用的各种Linux安全模块来说,SELinux是功能最全面,而且是测试最充分的,是在超过20年的MAC研究基础上建立起来的。自从Linux拥有了SELinux,大型企业和政府部门才真正地开始考虑采用Linux作为其主要的操作系统。

不过,系统中有这么多的进程,也有这么多的文件,如果手工来进行分配和指定,那么工作量过大。所以 SELinux 提供了很多的默认策略规则,这些策略规则已经设定得比较完善,我们稍后再来学习如何查看和管理这些策略规则。

为了使读者清楚地了解 SELinux 所扮演的角色,这里举一个例子,假设 apache 上发现了一个漏洞,使得某个远程用户可以访问系统的敏感文件(如 /etc/shadow)。如果我们的 Linux 中启用了 SELinux,那么,因为 apache 服务的进程并不具备访问 /etc/shadow 的权限,所以这个远程用户通过 apache 访问 /etc/shadow文件就会被 SELinux 所阻挡,起到保护 Linux 系统的作用。

Note

在 Linux 中,一个用户要能访问一个文件,既要求这个用户的权限符合 rwx 权限,也要求这个用户的进程符合 SELinux 的规定。

开启SELinux

初学者可以说大部分都是很讨厌SELinux,一因为不知道它到底是干嘛的,二在使用系统的或是搭建实验的时候总是要学会关闭SELinux。既然这样那我们就先来看看跟SELinux有关的指令及其含义。还有就是不同的发行版可能对应的指令会不同,下面就以CentOS 7.0为例说说。

打开/etc/sysconfig/selinux这个文件,应该是如下内容:

其含义SELINUX=disabled表示关闭了SELinux,当SELINUX=enforcing时表示一种工作模式,强制SELinux使用你所定义的所有安全策略。那么与enforcing模式相对应的是permissive模式。如果SELinux工作在permissive模式之下,则并不代表系统已经真正受到SELinux的保护了,因为它只要求显示一些相关的信息状态,余下的就什么都不做了。

开启和关闭SELinux都要重新启动系统,因为这个需要内核本身被重新加载。如果你确定SELinux是否已经成功开启了,可以使用sestatus命令来确认。虽然开启或关闭SELinux要重启系统,但是在enforcingpermissive模式之间进行切换就很方便了。只需要使用setenforce命令就可以,给它一个参数010就代表permissive模式,那么1就代表enforcing模式啦。如果要查看当期那SELinux工作在上面模式下,可以使用getenforce命令来获得。

需要注意的是,一旦你开启了SELinux,而且设置它工作在enforcing模式之下,很可能会有悲剧发生,你有一对服务无法顺利启动。最主要的提示信息时/lib目录下的某些文件没有读取权限而导致启动失败。一旦发生这种悲剧,可以将SELinux设置为permissive模式,然后使用“restorecon –Rv/”命令。如果有人处于好奇将SELINUXTYPE=targeted设置成了SELINUXTYPE=mls,那可能会是更大的悲剧,因为你都无法登陆系统也无法关机。如果尝试断电的话,就更加悲剧了,单用户模式你都进不去了。这个时候怎么办呢?动用内核启动参数吧,就是GRUB的交互界面中指定内核参数enforcing=0就行。就可以启动系统了。

安全上下文

在进一步讲述SELinux之前,我们先来了解一下它的最基本的概念———安全环境,或者是安全上下文。安全上下文实际上是一个标签,如果系统中开启了SELinux,那么系统中所有的文件、目录、进程、套接字、乃至用户本身就会带有这个标签。这个标签由:用户、角色、域/类型、敏感度和类别这五个部分构成,并使用冒号分割。这个五个部分并不总是全部出现,具体的要根据你选择了何种策略。使用“id –Z”命令可以查看当前用户的安全上下文,如下

unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

要查看进程的安全上下文可以使用“ps -Z”命令,至于文件或目录的安全上下文可以使用“ls -Z”命令。

安全上下文中的第一部分是用户。它与Linux本身的用户是完全不同的概念。它们可以共存,而且很多时候还会被人们弄混。因为一个SELinux的用户会与Linux本身的用户使用相同的文本表达(登录名)。但是不管怎样,都要记住它们两个完全不是一回事儿。使用su命令并不能改变SELinux的用户。

每一个Linux本身的用户可以和一个SELinux的用户相对应,也就是说当它通过和发途径登陆了一个Linux系统,那么同时就会分配给它一个SELinux用户。可以通过“semanage login -l”命令来查看这种对于关系。安全上下文中的第二个部分是角色,角色规定了用户能干什么,每一个SELinux用户都会有它对应的角色,而且还可以对应多个角色。

身份

selinux中,身份的概念与传统的Linux UID是完全不同的,它们可以共存。而且很多时候还会被人们弄混。因为一个selinux的身份会跟标准的linux登录名使用相同的文本表达,但是不管怎样都要记住,它们两个完全不是一回事儿。在selinux中身份是安全上下文的一部分,它会决定什么可以被执行。运行su命令是不会改变selinux的身份的。

SELinux的策略

一开始我们就说SELinux是一种基于策略的MAC安全系统,那么它都提供了什么策略呢?回答这个问题是很难的,因为SELinux的策略可以有千百种,但是对于SELINUXTYPE这个配置项留给我们的选择并不多,因为Linux发行商们已经为我们编制好了一些策略套件,拿来直接使用或做一些小幅度的改动就可以放心地使用了。而这个SELINUXTYPE配置项就是用于选择策略套件的。

对于centos6.x系统,它提供了三个策略套件,分别是targetedmlsminimum,也分别代表了不同的侧重点。targeted是最常用的策略套件,也是centos默认的。它侧重的是对网络服务的严格限制,用来在没有严重影响用户体验的情况下尽可能多的保护关键进程,在centos 4时只有15个已经定义好的targets存在,包括httpdnameddhcpdmysqld、而后来的centos版本受保护的对象越来越多,targets的数量猛增,现已超过了200个。在保护安全的同时targeted策略也期望能达到这么一种境界,大多数用户没有感觉到selinux在运行而它却在默默起着保护作用。SELinux还允许用户使用多策略,我们可以使用mls套件来实现。它能做到不需要对安全策略进行破坏性地改变就能使MLS生效,我们需要再文件/etc/sysconfig/selinux中把SELINUXTYPE=targeted这行改成SELINUXTYPE=mls,使用chconsemanage命令重新标签上下文,然后重启系统。如果有的用户只想使用一个SELinux在内存不多的虚拟机上运行,SELinux推出了和targeted策略一样的minimum软件包。

http://c.biancheng.net/linux_tutorial/18/


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!