SELinux的全称是Security Enhanced Linux, 就是安全加强的Linux。在SELinux之前,root账号能够任意的访问所有文档和服务;如果某个文件设为777,那么任何用户都可以访问甚至删除;这种方式称为DAC(主动访问机制),很不安全。

    DAC 自主访问控制: 用户根据自己的文件权限来决定对文件的操作,也就是依据文件的own,group,other/r,w,x权限进行限制。Root有最高权限无法限制。r,w,x权限划分太粗糙。无法针对不同的进程实现限制。

    SELinux则是基于MAC(强制访问机制),简单的说,就是程序和访问对象上都有一个安全标签(即selinux上下文)进行区分,只有对应的标签才能允许访问。否则即使权限是777,也是不能访问的。

在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯通道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户(u)、角色(r)和类型(t)标识符。但我们最关注的是第三个部分,标识符。

    当程序访问资源时,主体程序必须要通过selinux策略内的规则放行后,就可以与目标资源进行安全上下文的比对,若比对失败则无法存取目标,若比对成功则可以开始存取目标,最终能否存取目标还要与文件系统的rwx权限的设定有关。


1、Selinux状态查看与配置:

Selinux的配置文件位置:/etc/selinux/config,它还有个链接在/etc/sysconfig/selinux

使用config文件来配置selinux(通过配置文件修改selinux的状态属于永久修改,要重启系统才生效)

wKiom1cUmxuzWyCOAABiDi_JTUI516.jpg

文件内容如下图:

wKioL1cUsAXARxlvAAD4KfgCUcs642.jpg

SELINUX=enforcing
#此项定义selinux状态。
#enforcing—是强制模式系统受selinux保护。
就是你违反了策略,你就无法继续操作下去
#permissive—是提示模式系统不会受到selinux保护,只是收到警告信息。
permissive就是Selinux有效,但是即使你违反了策略的话它让你继续操作,但是把你的违反的内容记录下来(警告信息)
#disabled—禁用selinux。

SELINUXTYPE=targeted
#此项定义selinux使用哪个策略模块保护系统。targeted只对apache ,sendmail, bind,postgresql,nfs,cifs等网络服务保护。

以上策略配置都放置在/etc/selinux目录中,目录和策略名称相同


使用selinux相关命令查看和修改状态:(属于立即生效但临时性的)

a、sestatus 查询selinux工作状态

wKioL1cUsKyR-LEbAACJzwpte-I217.jpg

b、selinuxenabled检查selinux是否开启,配合echo $?.传回值是0为开启,1为关闭

wKioL1cUsw3B8VSWAAAgoMCosss295.jpg

c、getenforce查看selinux的状态

wKioL1cUs1WxX55TAAAWMTyFChI117.jpg

d、setenforce设定selinux运行状态,1开启(Enforcing),0关闭(Permissive)

wKiom1cUsvfCIsDwAABDNfW8cCM559.jpg


2、查看安全上下文相关命令

查看文件上下文可以通过ls -ZwKiom1cUs4DziArHAAC-rlPvaTI844.jpg

查看进程上下文可以使用 ps Z

wKiom1cUtMbSKvH2AADQzMPIac8982.jpg

查看用户上下文可以用id –ZwKioL1cUtf-Dk4HlAAAsADZ-eSg563.jpg

安全上下文以用户:角色:类型(域)标识符的形式出现.(这里的用户指的是selinu用户)


3、以下是复制和移动文件时安全上下文的变化:

以httpd为例,这个httpd的进程可以访问/var/www/html下的文档对象

在/root目录下创建两个测试页文件(如test1.html、test2.html)wKiom1cUts-hg6slAACeuvliKHI110.jpg

复制test1.html文件到/var/www/html目录下,剪切test2.html文件到/var/www/html目录下wKioL1cUuAex0463AAAub7c6VHo776.jpg

查看html目录下文件的安全上下文

wKiom1cUuBezMu4uAACoWSvvPIg549.jpg

通过上图可以看到剪切操作时文件的上下文没有发生改变,仍然是原上下文,而复制操作时文件的上下文继承了目标目录的上下文。

通过浏览器访问这两个网页文件

wKioL1cUudHiA3UqAACNqGfzpyw904.jpgwKioL1cUuhfCjafMAACo-sDsAN0895.jpg

可以看到test1.html页面能访问而test2.html却被拒绝访问

查看权限发现apache用户对这两个文件都具有r权限,但test2.html文件却拒绝访问

wKioL1cUuqWyiqw2AAA791sos7M216.jpg

原因就是因为httpd进程不能访问域类型标签是admin_home_t的资源,被selinux将访问拒绝了。

通过日志记录也能看到test2.html文件拒绝httpd进程访问

wKiom1cVf5TS779CAAAeJcpFlNk784.jpg

wKioL1cU3zjQYp_tAABt7CERH8I471.jpg

由于此文件记录的信息很多不宜直接查看,可以借助audit2whyaudit2allow

wKiom1cVgOnzCcJoAADHM0hYLQM406.jpg


找出目标资源类别为httpd_sys_content_t的相关信息

可以用sesearch [--allow] [-s 主体类别] [-t 目标类别] [-b]查询详细规则

sesearch命令由下列软件包提供

wKiom1cVgh3hAoiHAAAnGwybjQM516.jpg

wKiom1cVg5HT4InwAAAdaT1yFa4767.jpg

wKioL1cVhFCiElpoAAEVAgz39l8826.jpg

从上图显示信息表示[ allow 主体程序安全上下文类别 目标资源安全上下文类别 ],说明这个资源类别可以被哪个主体程序类别所读取。

找出主体程序为httpd_t相关的所有信息

wKioL1cVhbmiXufUAAAXi-1n2vA799.jpg

wKiom1cVhPrD1byMAADocfj2_x0234.jpg

从上面的数据就可以看出程序httpd_t可以访问的哪些资源类别,当然还有很多,这里只是截取了一点点而已。


安全上下文也了解了一点,那么如何解决刚才的问题呢?

解决方法就是更改test2.html文件的上下文。有两种方式,一种是通过restorerecon(restore context) 修复继承当前目录默认的上下文;一种是通过chcon (change context) 修改当前的上下文。

semanage和restorecon命令是由下列软件包提供的

wKioL1cViBui3O0kAABN_b_T13E093.jpg

a.使用restorerecon(restore context)修复继承当前目录默认的上下文

分两步实现:

首先为 /var/www/html 这个目录下的所有文件添加默认标签类型:

semanage fcontext  -a  -t httpd_sys_content_t  '/var/www/html(/.*)?'

因为html目录的默认标签类型就是httpd_sys_content_t,所以此步可以省略

然后用新的标签类型标注已有文件:

restorecon -Rv /var/www/html/, 之后 httpd就可以访问该目录下的文件了。

wKiom1cVh-2Cxq-DAACmGf4CkdY791.jpg

可以发现test2的上下文已经继承了目录的上下文,我们再来访问试试看

wKioL1cViQbhiwajAACOqfesHLg012.jpg

b.使用chcon (change context) 修改当前文件的上下文

wKioL1cVijmB1X5aAADMOgiiS-E902.jpg

注:chcon 意思是change context
    -t type 类型
    -R recursive 递归(特别适用于改变某个目录下所有文件的context)
    -u user
    -r role

或着这样修改也可以

wKioL1cVi2KACfFSAAApa04J754496.jpg

--reference表示用test1.html文件的上下文修改test2.html文件的上下文。

修改好以后,我们同样试试能不能访问test2

wKiom1cVivLQyC5aAACOqfesHLg832.jpg


对于linux服务器安全来说,在生产环境下,如果是面向互联网的服务器,建议开启selinux;如果是局域网的服务器,selinux可以关闭