触发 SELinux 政策违规的方法?

触发 SELinux 政策违规的方法?

我正在研究 SELinux 的基本工作原理,并发现触发拒绝很有用。我的测试机器运行的是 CentOS 7,这是一个没有任何额外服务的基本服务器安装,getenforce 状态为“强制执行”。所以我确信让 /root 可供所有人读取,并尝试以非特权用户身份从那里读取文件会成功。但没有运气!有人可以建议一些快速测试吗?尝试访问路径或打开端口等。

理想情况下,我正在寻找 DAC 不会限制但 MAC 会注意到并拒绝的简单 shell 命令。因此,我并不想编译定制程序或安装特定服务(如 Web 服务器)来实现这一点。这很有价值,因为它提供了一种通用且清晰的方式来查看 SELinux 的运行情况。

我可以毫无问题地修改 DAC(即文件系统权限),使它们的限制比测试中默认的限制更少。

答案1

为了演示 SELinux 的实用性错误检测对于第三方/您自己的开发人员的代码,这里有一个内存保护测试(修改第一个代码示例这里):

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>

int main (void) {
  // open file read-write, get a memory-mapped pointer with private access, write permission
  int fd = open ("file_to_test", O_RDWR);
  char *p = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

  p[0] = 'a';   // put something

  // Update protection mode; SELinux response depends on sebool: allow_execmod
  int r = mprotect (p, 42, PROT_READ | PROT_EXEC);

  // Display mprotect result
  printf ("mprotect = %d\n", r);

  close(fd);
  return 0;
}
编译并显示默认值(未捕获)
$ echo "test data" > file_to_test
$ gcc execmod.c 

$ ./a.out 
mprotect = 0

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
<no events of interest were found>

改变布尔值来捕获问题:

$ sudo getsebool allow_execmod
allow_execmod --> on

$ sudo setsebool allow_execmod 0
$ ./a.out 
mprotect = -1

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
1. 04/30/2015 12:26:41 a.out unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10 file execmod unconfined_u:object_r:user_home_t:s0 denied 3612

答案2

这清楚地表明了 MAC 策略,其中等效的 DAC 可以在 CentOS 7 的基本安装中被绕过。

  1. 默认情况下(在撰写本文时,在 CentOS 中),非特权的非系统用户以“unconfined_u”角色登录。但是,我们可以更改系统,以便将非特权用户“alice”放入“user_u”角色中。只需少量额外配置,即可制定默认策略来明确限制此角色。

    [root]# echo "alice:user_u:s0-s0:c0.c1023" >> /etc/selinux/targeted/seusers
    
  2. 现在关闭这些用户执行位于其主目录和 /tmp 中的文件的能力。再次重申,默认是允许此行为。此命令可能需要一点时间才能完成

    [root]# setsebool -P user_exec_content off
    
  3. 现在(以我们的非特权用户身份)我们可以登录并尝试在其中一个禁区执行某些操作。如您所见,我们被拒绝了。

    [alice]$ cp /bin/ls /tmp/
    [alice]$ /tmp/ls
    -bash: /tmp/ls: Permission denied
    
  4. 最后,我们可以查看 AVC 日志来查看我们的 SELinux 拒绝。

    [root]# aureport -a
    
    AVC Report
    ========================================================
    # date time comm subj syscall class permission obj event
    ========================================================
    1. 02/05/15 21:08:33 bash user_u:user_r:user_t:s0 59 file execute user_u:object_r:user_tmp_t:s0 denied 693
    

答案3

除非您已经在 system-config-selinux 的布尔选项卡中(或在 /etc/selinux/policy 中)更改了您的策略,否则默认应该响应以下内容(注意,您可能还需要安装 setroubleshoot 以进行更深入的了解):

mkdir -m 755 -p /安装/ks

cp /root/anaconda-ks.cfg /安装/ks

chmod 644 /install/ks/anaconda-ks.cfg

然后,重新启动 Web 服务器并尝试访问http://本地主机/ks使用您的网络浏览器。您应该会看到“禁止”消息。如果您正在跟踪/var/log/audit/audit.log或运行ausearch -m avc -ts recent,那么您应该能够看到以下消息:type=AVC msg=audit(1391277951.222:266): avc: denied { read } for pid=1731 comm="httpd" name="ks" dev=sda1 ino=22351 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined u:object r:default t:s0 tclass=dir

chcon -Rv --reference /var/www/html /install/ks如果您不想禁用 SELinux 但又能够访问资源,则可以使用更改 SELinux 上下文。

编辑:抱歉,没看到您说“不是网络服务器”。请尝试chcon -u fake_u <filename>在系统文件上使用非特权帐户。

答案4

安装两个小包 - 没有依赖项

  yum install -y vsftpd lftp

启动 FTP 服务器

  systemctl start vsftpd

在 root 的 home 中创建一个文件

  touch ~/tux.tch

从 root 的主目录移动到 FTP 目录。
注意:移动,不要复制,否则文件的 fcontext 将发生改变

  mv ~/tux.tch /var/ftp/pub

以 FTP 客户端用户身份登录到您的 FTP 服务器并尝试访问新文件。
注意:制表符自动完成功能在这里不起作用

  lftp localhost
    ls pub/tux.tch
    exit

查看原始日志中的拒绝信息

  grep AVC /var/log/audit/audit.log

或者如果你已经setroubleshoot*安装了

  grep sealert /var/log/messages

相关内容