第 3 章 目标策略
targeted 策略是 Red Hat Enterprise Linux 中使用的默认 SELinux 策略。使用 targeted 策略时,目标在受限域中运行的进程以及不是目标的进程在未限制的域中运行。例如,默认情况下,登录的用户在
unconfined_t
域中运行,由 init 启动的系统进程在 unconfined_service_t
域中运行;这两个域都没有限制。
可执行和可写入的内存检查可能同时适用于受限制和不受限制的域。但是,默认情况下,在不受限制的域中运行的进程可以分配可写入内存并执行它。这些内存检查可以通过设置布尔值来启用,这将允许在运行时修改 SELinux 策略。稍后将探讨布尔值配置。
3.1. 受限制的进程
几乎在侦听网络(如
sshd
或 httpd
)的每个服务都限制在 Red Hat Enterprise Linux 中。此外,以 root 用户身份运行并为用户执行任务的大多数进程(如 passwd
实用程序)都受限制。当进程受限制时,它会在其自己的域中运行,如 httpd
_t
域中运行的 httpd 进程。如果一个受攻击者限制的进程受到 SELinux 策略配置的影响,攻击者对资源的访问权限和可能受到的破坏会受到限制。
完成这个步骤以确保启用 SELinux,并准备执行以下示例:
过程 3.1. 如何验证 SELinux 状态
- 确认 SELinux 已启用,正在以强制模式运行,并且正在使用 targeted 策略。正确的输出应类似如下:
~]$
sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 30有关更改 SELinux 模式的详情,请查看 第 4.4 节 “SELinux 状态和模式中的永久性更改”。 - 以 root 用户身份,在
/var/www/html/
目录中创建一个文件:~]#
touch /var/www/html/testfile - 输入以下命令查看新创建的文件的 SELinux 上下文:
~]$
ls -Z /var/www/html/testfile -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile默认情况下,Linux 用户在 Red Hat Enterprise Linux 中运行 unconfined,这就是为什么testfile
文件使用 SELinuxunconfined_u
用户标记的原因。RBAC 用于进程,而非文件。角色对文件没有意义;object_r
角色是用于文件的通用角色(持久性存储和网络文件系统)。在/proc
目录下,与进程相关的文件可以使用system_r
角色。httpd_sys_content_t
类型允许httpd
进程访问此文件。
下面的例子演示了 SELinux 如何阻止 Apache HTTP 服务器(
httpd
)读取未正确标记的文件,如 Samba 要使用的文件。这是个示例,不应在生产环境中使用。它假定已安装了 httpd 和 wget 软件包,使用了 SELinux 目标策略,并且 SELinux 处于强制模式。
过程 3.2. 受限进程示例
- 以 root 用户身份,启动
httpd
守护进程:~]#
systemctl start httpd.service确认 服务正在运行。输出中应包括以下信息(只有时间戳有所不同):~]$
systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago - 更改到 Linux 用户对其具有写入权限的目录,并输入以下命令。除非对默认配置进行了更改,否则这个命令会成功:
~]$
wget http://localhost/testfile --2009-11-06 17:43:01-- http://localhost/testfile Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 0 [text/plain] Saving to: `testfile' [ <=> ] 0 --.-K/s in 0s 2009-11-06 17:43:01 (0.00 B/s) - `testfile' saved [0/0] - chcon 命令重新标记文件,当文件系统重新标记时,这些标签更改不会保留。对于文件系统重新标记生存的永久更改,请使用
semanage
实用程序,稍后会对此进行讨论。以 root 用户身份,输入以下命令将类型更改为 Samba 使用的类型:~]#
chcon -t samba_share_t /var/www/html/testfile输入以下命令查看更改:~]$
ls -Z /var/www/html/testfile -rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile - 请注意,当前的 DAC 权限允许
httpd
进程访问testfile
。更改到您的用户具有写入访问权限的目录,并输入以下命令。除非对默认配置进行了更改,否则这个命令会失败:~]$
wget http://localhost/testfile --2009-11-06 14:11:23-- http://localhost/testfile Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 403 Forbidden 2009-11-06 14:11:23 ERROR 403: Forbidden. - 以 root 用户身份,删除
testfile
:~]#
rm -i /var/www/html/testfile - 如果您不需要
httpd
运行,请以 root 用户身份输入以下命令,请输入以下命令来停止它:~]#
systemctl stop httpd.service
这个示例演示了 SELinux 增加的额外安全性。虽然 DAC 规则允许
httpd
进程访问第 2 步中的 testfile
,因为该文件使用了 httpd
进程无法访问的类型,SELinux 会拒绝访问。
如果
auditd
守护进程正在运行,类似于以下内容的错误会被记录到 /var/log/audit/audit.log
:
type=AVC msg=audit(1220706212.937:70): avc: denied { getattr } for pid=1904 comm="httpd" path="/var/www/html/testfile" dev=sda5 ino=247576 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file type=SYSCALL msg=audit(1220706212.937:70): arch=40000003 syscall=196 success=no exit=-13 a0=b9e21da0 a1=bf9581dc a2=555ff4 a3=2008171 items=0 ppid=1902 pid=1904 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
另外,类似以下内容的错误被记录到
/var/log/httpd/error_log
:
[Wed May 06 23:00:54 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied