SELinux 『 Security Enhanced Linux 』的缩写,字面上的意义就是安全强化的 Linux 之意


传统的文件权限与账号关系--》自主式存取控制(Discretionary Access Control, DAC)

    是依据程序的拥有者与文件资源的 rwx 权限来决定有无存取的能力


以政策守则制订特定程序读取特定文件--》委任式存取控制 (Mandatory Access Control, MAC)

    主体不再是使用者 而变成了程序 目标是该程序能否读取的文件资源


先要大概明白几个概念

  • 主体 (Subject):
    SELinux 主要想要管理的就是程序,因此你可以将『主体』可以同 process 划上等号;

  • 目标 (Object):
    主体程序能否存取的『目标资源』一般就是文件系统。因此这个目标可以同文件系统划上等号;

  • 政策 (Policy):
    由于程序与文件数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的守则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 5.x 里面仅有提供两个主要的政策,分别是:

    • targeted:针对网络服务限制较多,针对本机限制较少,是默认的政策;

    • strict:完整的 SELinux 限制,限制方面较为严格。

          建议使用默认的 targeted 政策即可。

          守则:只要知道如何开启和关闭某项守则的放行与否即可

  • 安全性本文 (security context):
    我们刚刚谈到了主体、目标与政策面,但是主体能不能存取目标除了政策指定之外,主体与目标的安全性本文(有点类似文件系统的 rwx )必须一致才能够顺利存取。

          安全性文本需要自行配置

             程序在内存中 所以安全性本文可以存入

             文件的安全性本文放置在文件的inode中

             在inode中就可以进行安全性本文的比对以及rwx权限的确认

查看文件的安全性本文

     [root@www ~]# ll -Z /usr/local/nginx/html/index.html

     -rw-r--r--. root root unconfined_u:object_r:usr_t:s0   /usr/local/nginx/html/index.html

                                        身份识别       :  角色      :类型

  • 身份识别 (Identify):
    相当于帐号方面的身份识别!主要的身份识别则有底下三种常见的类型:


    • root:表示 root 的帐号身份

    • system_u:表示系统程序方面的识别,通常就是程序;

    • user_u:代表的是一般使用者帐号相关的身份。

  • 角色 (Role):
    透过角色栏位,我们可以知道这个数据是属于程序、文件资源还是代表使用者。一般的角色有:


    • object_r:代表的是文件或目录等文件资源,这应该是最常见的;

    • system_r:代表的就是程序!不过,一般使用者也会被指定成为 system_r 

  • 类型 (Type) :(最重要!)
    在默认的 targeted 政策中, Identify 与 Role 栏位基本上是不重要的!重要的在于这个类型 (type) 栏位! 基本上,一个主体程序能不能读取到这个文件资源,与类型栏位有关!而类型栏位在文件与程序的定义不太相同,分别是:


    • type:在文件资源 (Object) 上面称为类型 (Type);

    • domain:在主体程序 (Subject) 则称为领域 (domain) !

    • domain 需要与 type 搭配,则该程序才能够顺利的读取文件资源!

主体程序与 文件type栏位的相关性

[root@www ~]# ll -Zd /usr/sbin/httpd /var/www/html

-rwxr-xr-x  root root system_u:object_r:httpd_exec_t   /usr/sbin/httpd

drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t /var/www/html

wKiom1gusVDTpMJPAAAmkf_APLE787.gif-wh_50

  1. 首先,我们触发一个可运行的目标文件,那就是具有 httpd_exec_t 这个类型的 /usr/sbin/httpd 文件;

  2. 该文件的类型会让这个文件所造成的主体程序 (Subject) 具有 httpd 这个领域 (domain), 我们的政策针对这个领域已经制定了许多守则,其中包括这个领域可以读取的目标资源类型;

  3. 由于 httpd domain 被配置为可以读取 httpd_sys_content_t 这个类型的目标文件 (Object), 因此你的网页放置到 /var/www/html/ 目录下,就能够被 httpd 那支程序所读取了;

  4. 但最终能不能读到正确的数据,还得要看 rwx 是否符合 Linux 权限的规范!


第一个是政策内需要制订详细的 domain/type 相关性;

第二个是若文件的 type 配置错误, 那么即使权限配置为 rwx 全开的 777 ,该主体程序也无法读取目标文件资源


查看SELinux的模式

    [root@www ~]# getenforce

    Enforcing

    以前两种为启动模式后一种为关闭

  • enforcing:强制模式,代表 SELinux 运行中,且已经正确的开始限制 domain/type 了;

  • permissive:宽容模式:代表 SELinux 运行中,不过仅会有警告信息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;

  • disabled:关闭,SELinux 并没有实际运行

查看SELinux的政策

     targeted     主要是管理网络服务

     strict          本机端的程序

    [root@www ~]# sestatus

    SELinux status:                 enabled

    SELinuxfs mount:                /selinux

    Current mode:                   enforcing

    Mode from config file:          enforcing

    Policy version:                 24

    Policy from config file:        targeted


SELinux配置文件

    [root@www ~]# vim /etc/selinux/config

    SELINUX=enforcing                启动模式

    SELINUXTYPE=targeted        政策


SELinux的启动与关闭

     改变政策需要reboot

     模式的开启(enforcing或permissive)转为关闭(disabled)  或相反 需要reboot

     模式的开启之间转换不需要rebbot

     reboot之前需要观察开机时核心是否启动SELinux

     [root@www wanjiadi]# vim /boot/grub/menu.lst

     观察kernel’ 行 不包含 selinux=0 则 reboot之后就会启动


启动模式之间的切换

     [root@www ~]# setenforce 0     切换成宽松模式

     [root@www ~]# setenforce 1     切换成强制模式


操作安全性本文

查看程序的安全性本文

    [root@www wanjiadi]# ps aux -Z | grep httpd

           

查看文件安全性本文

    [root@www ~]# ll -Z /var/www/html/1.html

    -rw-r--r--. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 1.html

    -rw-r--r--. root   root   unconfined_u:object_r:admin_home_t:s0 2.html   root目录下创建mv过来的2.html 

    -rw-r--r--. root   root   unconfined_u:object_r:httpd_sys_content_t:s0 4.html   root在/var/www/html下创建的


修改文件的安全性本文

这里有一点又一点需要声明:软件安装后比如apache 在安装完产生/var/www之后type httpd_sys_content_t就已经确定

    [root@www ~]# chcon -t httpd_sys_content_t /var/www/html/index.html

    -R  :递归修改;

    -t  :后面接安全性本文的类型栏位!例如 httpd_sys_content_t ;

    -u  :后面接身份识别,例如 system_u;

    -r  :后面街角色,例如 system_r;

    --reference=范例文件:拿某个文件当范例来修改后续接的文件的类型!


还原文件的默认安全性本文(根据当前目录设置)

    [root@www ~]# restorecon -v /var/www/html/index.html

    restorecon reset /var/www/html/5.html context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0