一种触发SELinux策略违规的方法?


12

我正在研究SELinux的基本工作原理,并且发现触发拒绝很有用。我的测试计算机正在运行CentOS 7,这是一个基本的服务器安装,没有任何额外的服务,并且getenforce声明为“ Enforcing”。因此,我确信使/ root可以被世界读取,并尝试以无特权的用户身份从那里读取文件会成功。但是没有运气!谁能建议一些快速测试?尝试访问路径或打开端口等

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

与修改DAC(即文件系统权限)相比,使它们的限制比在测试中默认情况下的限制少,我没有任何问题。


1
+1知道如何触发防护系统,以便您可以验证其是否正常运行,这是至关重要的一步,也是经常要错过的一步。
gowenfawr

我投票结束这个问题是因为题外,因为它属于Unix&Linux SE。
2015年

Answers:


3

为了演示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

尽管我不是程序员,也不真正理解代码,但这绝对有用,并且有据可查(+1)。理想情况下,我希望看到一个SELinux的明显例子,该例子拒绝使用简单的命令行工具(例如shell,netcat,telnet等)打开端口或访问路径的尝试。我将编辑问题以使其更清楚。
体贴的2015年

我必须自己查找代码部分。很高兴您在下面添加了bash测试。我在CentOS7上忽略了Snort和postfix(可能是鸽派)错误,因为它们是软件包,安装起来需要更多工作,以后可能会修复,并且它只是更多配置。如果您已经采用这种方式,则对策略生成实践很有用。
ǝɲǝɲbρɯͽ

3

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

  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
    

嘿,行得通!我特别喜欢您选择了这种“无执行内容”的方法,因为这肯定会引起注意。我倾向于偏爱经过审核的方法,以防止可执行文件的创建,但我也喜欢这样做。一个用例:我使用一种基于云的通用服务,该服务很难安装新软件(您必须使用其软件包管理器,并且没有sudo),但是没有什么意义。它们不会阻止创建或执行,它们是开发人员环境...所以我只是wget / scp需要的软件包并进行编译。+1
ǝɲǝɲbρɯͽ

1

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

mkdir -m 755 -p /安装/ ks

cp /root/anaconda-ks.cfg / install / ks

chmod 644 /安装/ks/anaconda-ks.cfg

然后,重新启动Web服务器,并尝试使用Web浏览器访问http:// localhost / 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>在系统文件上使用非特权帐户。


我无法收到您的第二条建议(使用新创建的用户)。另外,我宁愿进行更通用的测试,例如MAC在DAC允许的范围内提高的示例:而这测试了SELinux可以很好地保护SELinux标签免受管理更改的影响。
体贴的2015年

0

安装两个小软件包-没有依赖关系

  yum install -y vsftpd lftp

启动FTP服务器

  systemctl start vsftpd

在root的家中创建一个文件

  touch ~/tux.tch

从根目录目录移到FTP目录。
注意:移动,请勿复制,否则文件的上下文会更改

  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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.