第 3 章 目标策略


targeted 策略是 Red Hat Enterprise Linux 中使用的默认 SELinux 策略。使用 targeted 策略时,目标在受限域中运行的进程以及不是目标的进程在未限制的域中运行。例如,默认情况下,登录的用户在 unconfined_t 域中运行,由 init 启动的系统进程在 unconfined_service_t 域中运行;这两个域都没有限制。
可执行和可写入的内存检查可能同时适用于受限制和不受限制的域。但是,默认情况下,在不受限制的域中运行的进程可以分配可写入内存并执行它。这些内存检查可以通过设置布尔值来启用,这将允许在运行时修改 SELinux 策略。稍后将探讨布尔值配置。

3.1. 受限制的进程

几乎在侦听网络(如 sshdhttpd )的每个服务都限制在 Red Hat Enterprise Linux 中。此外,以 root 用户身份运行并为用户执行任务的大多数进程(如 passwd 实用程序)都受限制。当进程受限制时,它会在其自己的域中运行,如 httpd _t 域中运行的 httpd 进程。如果一个受攻击者限制的进程受到 SELinux 策略配置的影响,攻击者对资源的访问权限和可能受到的破坏会受到限制。
完成这个步骤以确保启用 SELinux,并准备执行以下示例:

过程 3.1. 如何验证 SELinux 状态

  1. 确认 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 状态和模式中的永久性更改”
  2. 以 root 用户身份,在 /var/www/html/ 目录中创建一个文件:
    ~]# touch /var/www/html/testfile
  3. 输入以下命令查看新创建的文件的 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 文件使用 SELinux unconfined_u 用户标记的原因。RBAC 用于进程,而非文件。角色对文件没有意义; object_r 角色是用于文件的通用角色(持久性存储和网络文件系统)。在 /proc 目录下,与进程相关的文件可以使用 system_r 角色。httpd_sys_content_t 类型允许 httpd 进程访问此文件。
下面的例子演示了 SELinux 如何阻止 Apache HTTP 服务器(httpd)读取未正确标记的文件,如 Samba 要使用的文件。这是个示例,不应在生产环境中使用。它假定已安装了 httpdwget 软件包,使用了 SELinux 目标策略,并且 SELinux 处于强制模式。

过程 3.2. 受限进程示例

  1. 以 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
    
  2. 更改到 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]
    
  3. 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
    
  4. 请注意,当前的 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.
    
  5. 以 root 用户身份,删除 testfile
    ~]# rm -i /var/www/html/testfile
  6. 如果您不需要 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
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.