1.SElinux 就是 Security Enhanced Linux,用于加强系统的安全管理。

传统的文件系统依据进程的拥有者与文件资源的 rwx 权限来决定进程有无存取文件的能力,它又一定的缺陷,比如某人非法获得具有root权限的某进程,那他就能利用该进程存取任何文件资源,或者有人无意间把文件的属性改为777,而他自己并未认识到危害。

而SElinux则采取了特定程序读取特定文件的方式,即使你是 root ,那么在使用不同的程序时,你所能取得的权限并不一定是 root , 而得要看当时该程序的设定而定。只有程序的权限和文件的权限相对应,才能够读取。

2.SELinux 的运作模式

 

 

  • 主体 (Subject):
    主体即进程
     
  • 目标 (Object):
    目标即文件
     
  • 政策 (Policy):
    由于程序与档案数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 5.x 里面仅有提供两个主要的政策,分别是:
    • targeted:针对网路服务限制较多,针对本机限制较少,是预设的政策;
    • strict:完整的 SELinux 限制,限制方面较为严格。
    建议使用预设的 targeted 政策即可。
     
  • 安全性本文 (security context):
    安全性本文 (security context) 有点类似文件系统的 rwx ,主体与目标的安全性文本必须一致才能够读取

 

 

 

3.安全性文本

通过ls -Z可以查看文件的安全性文本

 
  1. [root@www ~]# ls -Z 
  2. drwxr-xr-x  root root root:object_r:user_home_t   Desktop 
  3. -rw-r--r--  root root root:object_r:user_home_t   install.log 
  4. -rw-r--r--  root root root:object_r:user_home_t   install.log.syslog 
  5. # 上述特殊字体的部分,就是安全性本文的内容! 

安全性本文是放置到文件系统的 inode 内的,它有3个栏位:

 

Identify:role:type身份识别:角色:类型

 

 

  • 身份识别 (Identify):
    相当于帐号方面的身份识别!主要的身份识别则有底下三种常见的类型:
    • root:表示 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搭配,则该程序才能够顺利的读取档案资源啦!

以httpd为例:

 
  1. [root@www ~]# ll -Zd /usr/sbin/httpd /var/www/html 
  2. -rwxr-xr-x  root root system_u:object_r:httpd_exec_t   /usr/sbin/httpd 
  3. drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t /var/www/html 
  4. # 两者的角色栏位都是 object_r ,代表都是档案!而 httpd 属于 httpd_exec_t 类型, 
  5. # /var/www/html 则属于 httpd_sys_content_t 这个类型! 

 

  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 权限的规范!

 

4.SELinux 的启动、关闭与观察

 

目前 SELinux 支援三种模式,分别如下:

  • enforcing:强制模式,代表 SELinux 运作中,且已经正确的开始限制 domain/type 了;
  • permissive:宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
  • disabled:关闭,SELinux 并没有实际运作。

getenforce命令可以查看SElinux处于什么模式

 

sestatus可以查看SElinux的状态,包括模式和政策

 
  1. [root@www ~]# sestatus [-vb] 
  2. 选项与参数: 
  3. -v  :检查列于 /etc/sestatus.conf 内的档案与程序的安全性本文内容; 
  4. -b  :将目前政策的规则布林值列出,亦即某些规则 (rule) 是否要启动 (0/1) 之意; 

SELinux 的设定档是 /etc/selinux/config

 

模式切换:

enforcing和permissive的切换不需要重启,但是他们和disable之间的切换需要重启

 
  1. [root@www ~]# setenforce [0|1] 
  2. 选项与参数: 
  3. 0 :转成 permissive 宽容模式; 
  4. 1 :转成 Enforcing 强制模式 

 

重设 SELinux 安全性本文:

 
  1. [root@www ~]# chcon [-R] [-t type] [-u user] [-r role] 档案 
  2. [root@www ~]# chcon [-R] --reference=范例档 档案 
  3. 选项与参数: 
  4. -R  :连同该目录下的次目录也同时修改; 
  5. -t  :后面接安全性本文的类型栏位!例如 httpd_sys_content_t ; 
  6. -u  :后面接身份识别,例如 system_u; 
  7. -r  :后面街角色,例如 system_r; 
  8. --reference=范例档:拿某个档案当范例来修改后续接的档案的类型! 

或者,利用上层目录的预设属性来还原:

 
  1. [root@www ~]# restorecon [-Rv] 档案或目录 
  2. 选项与参数: 
  3. -R  :连同次目录一起修改; 
  4. -v  :将过程显示到萤幕上 

 

5.SELinux 的政策与规则管理

一个主体进程能否读取到目标文件的重点在于 SELinux 的政策以及政策内的各项规则, 然后再透过该规则的定义去处理各目标文件的安全性本文,尤其是‘类型’的部分

政策查阅:

 
  1. [root@www ~]# seinfo [-Atrub] 
  2. 选项与参数: 
  3. -A  :列出 SELinux 的状态、规则布林值、身份识别、角色、类别等所有资讯 
  4. -t  :列出 SELinux 的所有类别 (type) 种类 
  5. -r  :列出 SELinux 的所有角色 (role) 种类 
  6. -u  :列出 SELinux 的所有身份识别 (user) 种类 
  7. -b  :列出所有规则的种类 (布林值) 

如果查询到相关的类别或者是布林值后,想要知道详细的规则时, 就得要使用 sesearch 这个指令:

 
  1. [root@www ~]# sesearch [-a] [-s 主体类别] [-t 目标类别] [-b 布林值] 
  2. 选项与参数: 
  3. -a  :列出该类别或布林值的所有相关资讯 
  4. -t  :后面还要接类别,例如 -t httpd_t 
  5. -b  :后面还要接布林值的规则,例如 -b httpd_enable_ftp_server 
  6.  
  7. 范例一:找出目标档案资源类别为 httpd_sys_content_t 的有关资讯 
  8. [root@www ~]# sesearch -a -t httpd_sys_content_t 
  9. Found 74 av rules: 
  10.    allow readahead_t httpd_sys_content_t : file { ioctl read getattr lock }; 
  11.    allow readahead_t httpd_sys_content_t : dir { ioctl read getattr lock search }; 
  12. ....(底下省略).... 
  13. # ‘ allow  主体程序安全性本文类别  目标档案安全性本文类别 ’ 
  14. # 如上,说明这个类别可以被那个主题程序的类别所读取,以及目标档案资源的格式。 

布林值的查询与修改:

透过 sesearch 知道了,其实 Subject 与 Object 能否有存取的权限,是与布林值有关的, 那么系统有多少布林值可以透过 seinfo -b 来查询,但,每个布林值是启动的还是关闭的呢?

查询:

 
  1. [root@www ~]# getsebool [-a] [布林值条款] 
  2. 选项与参数: 
  3. -a  :列出目前系统上面的所有布林值条款设定为开启或关闭值 

开启和关闭:

 
  1. [root@www ~]# setsebool [-P] 布林值=[0|1] 
  2. 选项与参数: 
  3. -P  :直接将设定值写入设定档,该设定资料未来会生效的! 

预设目录的安全性本文查询与修改:

在使用时谈到每个目录或档案都会有预设的安全性本文,

 
  1. [root@www ~]# semanage {login|user|port|interface|fcontext|translation} -l 
  2. [root@www ~]# semanage fcontext -{a|d|m} [-frst] file_spec 
  3. 选项与参数: 
  4. fcontext :主要用在安全性本文方面的用途, -l 为查询的意思; 
  5. -a :增加的意思,你可以增加一些目录的预设安全性本文类型设定; 
  6. -m :修改的意思; 
  7. -d :删除的意思。 

这里我们主要用到fcontext属性