SELinux:获得一个自定义的二进制文件切换到另一个上下文

我正在研究一个必须用SELinux保护的新项目。 我们有一个用C编写的自定义二进制文件(为了这个问题,它将被称为“testprog”),需要切换到它自己的上下文,以便我们可以限制它的操作,而不是让它运行在非限制域。

我已经创build了一个简单的示例策略文件,基于迄今为止所做的学习,但bash未能执行二进制文件。

以下是目前存在的策略文件:

policy_module(testprog, 0.1.6) require { type unconfined_t; class file { ioctl getattr setattr create read write unlink open relabelto }; class process transition; type fs_t; class filesystem getattr; } type testprog_t; type testprog_exec_t; allow testprog_t fs_t:filesystem getattr; allow testprog_t testprog_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ; type_transition unconfined_t testprog_exec_t : process testprog_t; allow unconfined_t testprog_t : process transition ; 

我已经设置了二进制文件的上下文,如下所示:

 -rwxr-xr-x. root root system_u:object_r:testprog_exec_t:s0 /usr/bin/testprog 

但是,如果我尝试从bash shell执行命令,我得到一个permission denied错误,并拒绝loginaudit.log:

 [root@selinux-dev ~]# testprog type=AVC msg=audit(1504546613.537:237): avc: denied { getattr } for pid=1300 comm="bash" path="/usr/bin/testprog" dev="dm-0" ino=34637336 scontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 tcontext=system_u:object_r:testprog_exec_t:s0 tclass=file type=SYSCALL msg=audit(1504546613.537:237): arch=c000003e syscall=4 success=no exit=-13 a0=2518ca0 a1=7ffd90223980 a2=7ffd90223980 a3=0 items=0 ppid=1296 pid=1300 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=2 comm="bash" exe="/usr/bin/bash" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null) type=PROCTITLE msg=audit(1504546613.537:237): proctitle="-bash" type=AVC msg=audit(1504546613.537:238): avc: denied { getattr } for pid=1300 comm="bash" path="/usr/bin/testprog" dev="dm-0" ino=34637336 scontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 tcontext=system_u:object_r:testprog_exec_t:s0 tclass=file type=SYSCALL msg=audit(1504546613.537:238): arch=c000003e syscall=4 success=no exit=-13 a0=2518ca0 a1=7ffd90223980 a2=7ffd90223980 a3=0 items=0 ppid=1296 pid=1300 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=2 comm="bash" exe="/usr/bin/bash" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null) type=PROCTITLE msg=audit(1504546613.537:238): proctitle="-bash" -bash: testprog: command not found 

显然,我的政策有点过分了。 最终,我希望能够从systemd(我的单元文件,非常简单,如下所示)运行二进制文件,但我想从bash shell和systemd转换到我创build的testprog_ttypes。

 [Unit] Description=SELinux Test Program [Service] #Type=forking # The PID file is optional, but recommended in the manpage # "so that systemd can identify the main process of the daemon" PIDFile=/var/run/testprog.pid ExecStart=/usr/bin/testprog /etc/testprog.conf /var/run/testprog.pid [Install] WantedBy=multi-user.target 

请谁能帮我看看我哪里出了错? 底层的操作系统是RHEL 7.4

谢谢!

最后我得到了很多参考文献的转换工作 – 事实certificate,这个过程非常简单,我想你可以说和一个好的编程基本规则相关。

在这个问题上发布的政策中,我定义了两种新的types:

 type testprog_t; type testprog_exec_t; 

然后继续让这些types发生各种各样的事情,还指定了一个types转换:

 allow testprog_t fs_t:filesystem getattr; allow testprog_t testprog_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ; type_transition unconfined_t testprog_exec_t : process testprog_t; allow unconfined_t testprog_t : process transition ; 

然而,我实际上并没有告诉SELinux这些types究竟是什么。 例如,我将/usr/bin/testprog文件的上下文设置为system_u:object_r:testprog_exec_t:s0但实际上我从来没有通过策略告诉SELinux testprog_exec_t是一个文件。 只要我通过添加types规范来改变策略,事情就会变得更加有希望。 我还需要使用angular色语句来允许testprog_tunconfined_rangular色下运行,shell命令通常在目标SELinux模式下在RHEL系统上运行。 与此相关的政策目前的片段如下所示:

 # Define our new types that testprog will use, and ensure that we tell the policy that testprog_exec_t is a file type testprog_t; domain_type(testprog_t); type testprog_exec_t; files_type(testprog_exec_t); type testprog_etc_t; files_type(testprog_etc_t); type testprog_var_run_t; files_type(testprog_var_run_t); type testprog_data_t; files_type(testprog_data_t); # Allow the testprog_t type under the unconfined_r role role unconfined_r types testprog_t; # Tell SELinux that testprog_exec_t is an entrypoint to the tetprog_t domain allow testprog_t testprog_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ; # Make the type transition from unconfined_t (ie user shell) to testprog_t type_transition unconfined_t testprog_exec_t : process testprog_t; # Explicitly allow the type transition we have just created allow unconfined_t testprog_t : process transition ; 

通过这样做,types转换完成,完成政策的工作已成为利用sealert来探索计划的行为,并制定正确的政策,使其能够按照要求工作。

我希望把一个非SELinux感知应用程序的完整工作示例放在一起,这个应用程序需要运行在它自己的有限的上下文中,而不是为了我的同事(以及任何需要它的人)而不受限制地运行 – 现在都是相当骨架的,但如果有人有兴趣跟踪它可以在这里find代码:

https://github.com/jamesfreeman959/selinux-testprog