现在你应该知道,一个主体程序能否读取到目标文件资源的重点在於 SELinux 的政策以及政策内的各项守则,
然后再透过该守则的定义去处理各目标文件的安全性本文,尤其是『类型』的部分。现在我们也知道可以透过
sestatus 与 getenforce 去取得目前的 SELinux 状态。
但是,能不能知道更详细的政策说明与守则项目呢?底下我们就来了解了解!
政策查阅
CentOS 5.x 默认使使用 targeted 政策,那么这个政策提供多少相关的守则呢?此时可以透过 seinfo 来查询喔!
[root@www ~]# seinfo [-Atrub]
选项与参数:
-A :列出 SELinux 的状态、守则布林值、身份识别、角色、类别等所有资讯
-t :列出 SELinux 的所有类别 (type) 种类
-r :列出 SELinux 的所有角色 (role) 种类
-u :列出 SELinux 的所有身份识别 (user) 种类
-b :列出所有守则的种类 (布林值)
范例一:列出 SELinux 在此政策下的统计状态
[root@www ~]# seinfo
Statistics for policy file: /etc/selinux/targeted/policy/policy.21
Policy Version & Type: v.21 (binary, MLS) <==列出政策所在档与版本
Classes: 61 Permissions: 220
Types: 1521 Attributes: 155
Users: 3 Roles: 6
Booleans: 213 Cond. Expr.: 190
Sensitivities: 1 Categories: 1024
Allow: 86561 Neverallow: 0
Auditallow: 34 Dontaudit: 5460
Role allow: 5 Role trans: 0
....(底下省略)....
# 从上面我们可以看到这个政策是 targeted ,此政策的安全性本文类别有 1521 个;
# 而针对网络服务的守则 (Booleans) 共制订了 213 条守则!
范例二:列出与 httpd 有关的守则 (booleans) 有哪些?
[root@www ~]# seinfo -b | grep httpd
Rule loading disabled
allow_httpd_mod_auth_pam
allow_httpd_bugzilla_script_anon_write
httpd_enable_ftp_server
....(底下省略)....
# 你可以看到,有非常多的与 httpd 有关的守则订定呢!
从上面我们可以看到与 httpd 有关的布林值,同样的,如果你想要找到有 httpd 字样的安全性本文类别时,
就可以使用『 seinfo -t | grep httpd 』来查询了!如果查询到相关的类别或者是布林值后,想要知道详细的守则时,
就得要使用 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 主体程序安全性本文类别 目标文件安全性本文类别 』
# 如上,说明这个类别可以被那个主题程序的类别所读取,以及目标文件资源的格式。
范例二:找出主体程序为 httpd_t 且目标文件类别为 httpd 相关的所有资讯
[root@www ~]# sesearch -s httpd_t -t httpd_* -a
Found 163 av rules:
....(中间省略)....
allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock };
allow httpd_t httpd_sys_content_t : dir { ioctl read getattr lock search };
allow httpd_t httpd_sys_content_t : lnk_file { ioctl read getattr lock };
....(后面省略)....
# 从上面的数据就可以看出当程序为 httpd_t 这个类别,是可以读取
# httpd_sys_content_t 的!
你可以很轻易的查询到某个主体程序 (subject) 可以读取的目标文件资源 (Object) ,
从我们上面的练习,我们也可以很轻松的就知道,为何 httpd_t 可以读取 httpd_sys_content_t 罗!
那如果是布林值呢?里面又规范了什么?让我们来看看先:
范例三:我知道有个布林值为 httpd_enable_homedirs ,请问该布林值规范多少守则?
[root@www ~]# sesearch -b httpd_enable_homedirs -a
Found 21 av rules:
allow httpd_t user_home_dir_t : dir { getattr search };
allow httpd_t cifs_t : file { ioctl read getattr lock };
allow httpd_t cifs_t : dir { ioctl read getattr lock search };
....(后面省略)....
从这个布林值的配置我们可以看到里面规范了非常多的主体程序与目标文件资源的放行与否!
所以你知道了,实际规范这些守则的,就是布林值的项目啦!那也就是我们之前所说的一堆守则是也!
你的主体程序能否对某些目标文件进行存取,与这个布林值非常有关系喔!因为布林值可以将守则配置为启动 (1)
或者是关闭 (0) 啦!
由 seinfo 与 sesearch 的输出资讯,我们也会得到实际的政策数据都是放置到 /etc/selinux/targeted/policy/ 底下,
事实上,所有与 targetd 相关的资讯都是放置到 /etc/selinux/targeted 里面的呢!包括安全性本文相关的资讯。
这部分等一下谈到安全性本文的默认值修改时,我们再来讨论。
布林值的查询与修改
上面我们透过 sesearch 知道了,其实 Subject 与 Object 能否有存取的权限,是与布林值有关的,
那么系统有多少布林值可以透过 seinfo -b 来查询,但,每个布林值是启动的还是关闭的呢?这就来查询看看吧:
[root@www ~]# getsebool [-a] [布林值条款]
选项与参数:
-a :列出目前系统上面的所有布林值条款配置为开启或关闭值
范例一:查询本系统内所有的布林值配置状况
[root@www ~]# getsebool -a
NetworkManager_disable_trans --> off
allow_console_login --> off
allow_cvs_read_shadow --> off
allow_daemons_dump_core --> on
....(底下省略)....
# 您瞧!这就告诉你目前的布林值状态罗!
那么如果查询到某个布林值,并且以 sesearch 知道该布林值的用途后,想要关闭或启动他,又该如何处置?
[root@www ~]# setsebool [-P] 布林值=[0|1]
选项与参数:
-P :直接将配置值写入配置档,该配置数据未来会生效的!
范例一:查询 httpd_enable_homedirs 是否为关闭,若不为关闭,请关闭他!
[root@www ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> on <==结果是 on ,依题意给他关闭!
[root@www ~]# setsebool -P httpd_enable_homedirs=0
[root@www ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off
这个 setsebool 最好记得一定要加上 -P 的选项!因为这样才能将此配置写入配置档!
这是非常棒的工具组!你一定要知道如何使用 getsebool 与 setsebool 才行!
默认目录的安全性本文查询与修改
还记得我们在使用 restorecon 时谈到每个目录或文件都会有默认的安全性本文吗?
会制订目录的安全性本文,是因为系统的一些服务所放置文件的目录已经是确定的,当然有默认的安全性本文管理上较方便。
那你如何查询这些目录的默认安全性本文呢?就得要使用 semanage 罗!
[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 :删除的意思。
范例一:查询一下 /var/www/html 的默认安全性本文配置为何!
[root@www ~]# semanage fcontext -l
SELinux fcontext type Context
....(前面省略)....
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
....(后面省略)....
从上面的说明,我们知道其实 semanage 可以处理非常多的任务,不过,在这个小节我们主要想了解的是每个目录的默认安全性本文。
如上面范例一所示,我们可以查询的到每个目录的安全性本文啦!而目录的配置可以使用正规表示法去指定一个范围。那么如果我们想要添加某些自订的目录的安全性本文呢?
举例来说,我想要制订 /srv/samba 成为 public_content_t 的类型时,应该如何指定呢?
范例二:利用 semanage 配置 /srv/samba 目录的默认安全性本文为 public_content_t
[root@www ~]# mkdir /srv/samba
[root@www ~]# ll -Zd /srv/samba
drwxr-xr-x root root root:object_r:var_t /srv/samba
# 如上所示,默认的情况应该是 var_t 这个咚咚的!
[root@www ~]# semanage fcontext -l | grep '/srv'
/srv/.* all files system_u:object_r:var_t:s0
/srv/([^/]*/)?ftp(/.*)? all files system_u:object_r:public_content_t:s0
/srv/([^/]*/)?www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
/srv/([^/]*/)?rsync(/.*)? all files system_u:object_r:public_content_t:s0
/srv/gallery2(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
/srv directory system_u:object_r:var_t:s0 <==看这里!
# 上面则是默认的 /srv 底下的安全性本文数据,不过,并没有指定到 /srv/samba 啦
[root@www ~]# semanage fcontext -a -t public_content_t "/srv/samba(/.*)?"
[root@www ~]# semanage fcontext -l | grep '/srv/samba'
/srv/samba(/.*)? all files system_u:object_r:public_content_t:s0
[root@www ~]# cat /etc/selinux/targeted/contexts/files/file_contexts.local
# This file is auto-generated by libsemanage
# Please use the semanage command to make changes
/srv/samba(/.*)? system_u:object_r:public_content_t:s0
# 其实就是写入这个文件的罗! ^_^
[root@www ~]# restorecon -Rv /srv/samba* <==尝试恢复默认值
[root@www ~]# ll -Zd /srv/samba
drwxr-xr-x root root system_u:object_r:public_content_t /srv/samba/
# 有默认值,以后用 restorecon 来修改比较简单!
semanage 的功能很多,不过鸟哥主要用到的仅有 fcontext 这个项目的动作而已。如上所示,
你可以使用 semanage 来查询所有的目录默认值,也能够使用他来添加默认值的配置!如果您学会这些基础的工具,
那么 SELinux 对你来说,也不是什么太难的咚咚罗!