曲径通幽论坛

标题: 被约束的进程(Confined Processes) [打印本页]

作者: beyes    时间: 2013-6-20 23:44
标题: 被约束的进程(Confined Processes)
在下面的描述中,Targeted Policy 会被称为“定向策略”,一个进程如果是 Targetd 的,那么称之为“定向的进程”。使用的是 CentOS6.4 操作系统。

在 RHEL/Fedora/CentOS 中 Targeted 策略是默认的 SELinux 策略。在使用 targeted 策略时,定向的进程运行在一个约束域中(confined domain);非定向进程运行在一个非约束域中(unconfined domain)。比如,在默认情况下,登录用户是运行在 unconfined_t 域中的;由 init 启动的系统进程是运行在 initrc_t 域中的;这两个域都是未约束域。

约束和未约束域都会经受内存的写与执行的检查。默认情况下,运行在未约束域的程序不会被分配可写内存及执行它,这样就会减少缓冲区溢出攻击的危险。这些内存检查可以通过设置相应的布尔值来禁止(
getsebool/setsebool) ,这个修改可以在运行时进行。


被约束的进程
几乎所有在网络上监听的服务都会被约束。大部分以 root 用户来运行的进程在为其它的用户执行任务时(如 passwd 为其它用户设置密码) 也是被约束的。当一个进程被约束时,它运行在自己的域中,比如 httpd 进程运行于 httpd_t 域。如果一个被约束的进程被黑客所攻击,那么在 SELinux 策略配置的保护下,攻击者所要访问的资源以及带来的损害都会在很大的程度上被约束。


下面的例子描述了 SELinux 是如何阻止 Apache HTTP 服务器 (httpd) 读取没有被正确标记的文件,比如一个原被 Samba 服务所用的文件。当然,这个例子不会用在生产环境中。这里假设 httpd, setroubleshoot-server, dbus 和 audit 软件包已经装上,并且 SELinux 定向策略也已经启用,以及 SELinux 运行在 enforcing 模式。


1. 可以先运行 sestatus 来查看一下 SELinux 是否已经开启,是否已经处于 enforcing 模式,是否采用了定向策略:
[root@groad.net ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted
从输出知道,上面的几点要求都已经满足。

2. 现在,我们以 root 用户身份在 /vaw/www/html 这个目录新建一个文件:
[root@groad.net ~]# echo "hello groad.net" > /var/www/html/index.html

3. 查看一下上面新建文件的 SELinux 上下文:
[root@groad.net ~]# ls -Z /var/www/html/index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
由上可见,在默认情况下,CentOS 里,Linux 用户是处于“无约束”状态的,也就是 index.html 文件在 SELinux 里的用户是 unconfined_u 用户。

需要注意的是,RBAC (基于角色控制的访问机制) 是用在进程身上的,而不是普通文件

角色(role) 的概念对文件来说没什么意义 。 object_r 这个角色通常都用在文件身上(磁盘上的和网络文件系统里的文件)。在 /proc 目录下与进程相关的文件(如在以数字形式命名的目录下的文件)通常使用的是 system_r 这个角色。

httpd_sys_content_t 类型表明它允许 httpd 这个进程访问该文件。

4. 现在可以使用下面的命令来启动 httpd 服务了:
# service httpd start

5. 接着在浏览器里浏览刚才所建立的网页,可以看到正常输出。

6. 接下来,用 chcon 命令来更改上面的 index.html 这个文件的标记,但是 chcon 修改的结果在服务器下次重启时不会被保存。永久改变应该使用 semanage 命令。运行下面命令进行更改:
[root@groad.net ~]# chcon -t samba_share_t /var/www/html/index.html
观察修改的结果:
[root@groad.net ~]# ls -Z /var/www/html/index.html
-rw-r--r--. root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/index.html
修改成功。现在再用浏览器浏览一下这个页面,看看会发生情况:
[attach]1625[/attach]

由上可见,访问被拒绝了。

在上面的例子中可以看到,尽管 DAC 机制允许 httpd 进程访问 index.html 文件,然而在修改了该文件的类型标记后,httpd 就没有权限访问了,这是因为 SElinux 的保护产生了作用。拒绝访问的错误会被记录在 /var/logmessages 文件中:
Jun 20 23:34:02 groad kernel: type=1400 audit(1371742442.556:79398): avc:  denied  { getattr } for  pid=21702 comm="httpd" path="/var/www/html/index.html" dev=dm-0 i
no=6162577 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
Jun 20 23:34:02 groad kernel: type=1400 audit(1371742442.557:79399): avc:  denied  { getattr } for  pid=21702 comm="httpd" path="/var/www/html/index.html" dev=dm-0 i
no=6162577 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file

类似的错误信息还会被记录在 /var/log/httpd/error_log 中:
[Thu Jun 20 23:34:02 2013] [error] [client 192.168.1.110] (13)Permission denied: access to /index.html denied





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2