1.SElinux 就是 Security Enhanced Linux,用于加强系统的安全管理。
传统的文件系统依据进程的拥有者与文件资源的 rwx 权限来决定进程有无存取文件的能力,它又一定的缺陷,比如某人非法获得具有root权限的某进程,那他就能利用该进程存取任何文件资源,或者有人无意间把文件的属性改为777,而他自己并未认识到危害。
而SElinux则采取了特定程序读取特定文件的方式,即使你是 root ,那么在使用不同的程序时,你所能取得的权限并不一定是 root , 而得要看当时该程序的设定而定。只有程序的权限和文件的权限相对应,才能够读取。
2.SELinux 的运作模式
- 主体 (Subject): 主体即进程
- 目标 (Object): 目标即文件
- 政策 (Policy): 由于程序与档案数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 5.x 里面仅有提供两个主要的政策,分别是:
- targeted:针对网路服务限制较多,针对本机限制较少,是预设的政策;
- strict:完整的 SELinux 限制,限制方面较为严格。
- 安全性本文 (security context): 安全性本文 (security context) 有点类似文件系统的 rwx ,主体与目标的安全性文本必须一致才能够读取
3.安全性文本
通过ls -Z可以查看文件的安全性文本
- [root@www ~]# ls -Z
- drwxr-xr-x root root root:object_r:user_home_t Desktop
- -rw-r--r-- root root root:object_r:user_home_t install.log
- -rw-r--r-- root root root:object_r:user_home_t install.log.syslog
- # 上述特殊字体的部分,就是安全性本文的内容!
安全性本文是放置到文件系统的 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) 了!
以httpd为例:
- [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
- # 两者的角色栏位都是 object_r ,代表都是档案!而 httpd 属于 httpd_exec_t 类型,
- # /var/www/html 则属于 httpd_sys_content_t 这个类型!
- 首先,我们触发一个可执行的目标文件,那就是具有 httpd_exec_t 这个类型的 /usr/sbin/httpd 文件;
- 该文件的类型会让这个档案所造成的主体进程(Subject)具有 httpd 这个领域 (domain), 我们的政策针对这个领域已经制定了许多规则,其中包括这个领域可以读取的目标资源类型;
- 由于 httpd domain 被设定为可以读取 httpd_sys_content_t 这个类型的目标档案 (Object), 因此你的网页放置到 /var/www/html/ 目录下,就能够被 httpd 那支进程所读取了;
- 但最终能不能读到正确的资料,还得要看 rwx 是否符合 Linux 权限的规范!
4.SELinux 的启动、关闭与观察
目前 SELinux 支援三种模式,分别如下:
- enforcing:强制模式,代表 SELinux 运作中,且已经正确的开始限制 domain/type 了;
- permissive:宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
- disabled:关闭,SELinux 并没有实际运作。
getenforce命令可以查看SElinux处于什么模式
sestatus可以查看SElinux的状态,包括模式和政策
- [root@www ~]# sestatus [-vb]
- 选项与参数:
- -v :检查列于 /etc/sestatus.conf 内的档案与程序的安全性本文内容;
- -b :将目前政策的规则布林值列出,亦即某些规则 (rule) 是否要启动 (0/1) 之意;
SELinux 的设定档是 /etc/selinux/config
模式切换:
enforcing和permissive的切换不需要重启,但是他们和disable之间的切换需要重启
- [root@www ~]# setenforce [0|1]
- 选项与参数:
- 0 :转成 permissive 宽容模式;
- 1 :转成 Enforcing 强制模式
重设 SELinux 安全性本文:
- [root@www ~]# chcon [-R] [-t type] [-u user] [-r role] 档案
- [root@www ~]# chcon [-R] --reference=范例档 档案
- 选项与参数:
- -R :连同该目录下的次目录也同时修改;
- -t :后面接安全性本文的类型栏位!例如 httpd_sys_content_t ;
- -u :后面接身份识别,例如 system_u;
- -r :后面街角色,例如 system_r;
- --reference=范例档:拿某个档案当范例来修改后续接的档案的类型!
或者,利用上层目录的预设属性来还原:
- [root@www ~]# restorecon [-Rv] 档案或目录
- 选项与参数:
- -R :连同次目录一起修改;
- -v :将过程显示到萤幕上
5.SELinux 的政策与规则管理
一个主体进程能否读取到目标文件的重点在于 SELinux 的政策以及政策内的各项规则, 然后再透过该规则的定义去处理各目标文件的安全性本文,尤其是‘类型’的部分
政策查阅:
- [root@www ~]# seinfo [-Atrub]
- 选项与参数:
- -A :列出 SELinux 的状态、规则布林值、身份识别、角色、类别等所有资讯
- -t :列出 SELinux 的所有类别 (type) 种类
- -r :列出 SELinux 的所有角色 (role) 种类
- -u :列出 SELinux 的所有身份识别 (user) 种类
- -b :列出所有规则的种类 (布林值)
如果查询到相关的类别或者是布林值后,想要知道详细的规则时, 就得要使用 sesearch 这个指令:
- [root@www ~]# sesearch [-a] [-s 主体类别] [-t 目标类别] [-b 布林值]
- 选项与参数:
- -a :列出该类别或布林值的所有相关资讯
- -t :后面还要接类别,例如 -t httpd_t
- -b :后面还要接布林值的规则,例如 -b httpd_enable_ftp_server
- 范例一:找出目标档案资源类别为 httpd_sys_content_t 的有关资讯
- [root@www ~]# sesearch -a -t httpd_sys_content_t
- Found 74 av rules:
- allow readahead_t httpd_sys_content_t : file { ioctl read getattr lock };
- allow readahead_t httpd_sys_content_t : dir { ioctl read getattr lock search };
- ....(底下省略)....
- # ‘ allow 主体程序安全性本文类别 目标档案安全性本文类别 ’
- # 如上,说明这个类别可以被那个主题程序的类别所读取,以及目标档案资源的格式。
布林值的查询与修改:
透过 sesearch 知道了,其实 Subject 与 Object 能否有存取的权限,是与布林值有关的, 那么系统有多少布林值可以透过 seinfo -b 来查询,但,每个布林值是启动的还是关闭的呢?
查询:
- [root@www ~]# getsebool [-a] [布林值条款]
- 选项与参数:
- -a :列出目前系统上面的所有布林值条款设定为开启或关闭值
开启和关闭:
- [root@www ~]# setsebool [-P] 布林值=[0|1]
- 选项与参数:
- -P :直接将设定值写入设定档,该设定资料未来会生效的!
预设目录的安全性本文查询与修改:
在使用时谈到每个目录或档案都会有预设的安全性本文,
- [root@www ~]# semanage {login|user|port|interface|fcontext|translation} -l
- [root@www ~]# semanage fcontext -{a|d|m} [-frst] file_spec
- 选项与参数:
- fcontext :主要用在安全性本文方面的用途, -l 为查询的意思;
- -a :增加的意思,你可以增加一些目录的预设安全性本文类型设定;
- -m :修改的意思;
- -d :删除的意思。
这里我们主要用到fcontext属性