我正在尝试设置一个自定义SELinux
策略,但是当应用程序二进制文件位于标准二进制目录(如/bin
、/usr/bin
等)之外时,我无法进行域转换。应用程序二进制文件必须位于这些目录之外。
为了测试目的,我有一个程序,它只是打印当前SELinux
域。我有一个域my_domain_t
和一个类型。当域中的进程执行具有上下文的文件时,将设置为发生my_domain_exec_t
转换。my_domain_t
unconfined_t
my_domain_exec_t
如果我将测试二进制文件复制到/data
目录,设置其上下文并执行它,则域不会改变。
$ cp getcontext /data/getcontext
$ chcon -t my_domain_exec_t /data/getcontext
$ /data/getcontext
unconfined_t:unconfined_r:unconfined_t:s0-s0:c0.c1023
如果我将测试二进制文件复制到/usr/bin
目录,设置其上下文,然后执行它,则域转换就会正确发生。
$ sudo cp getcontext /usr/bin/getcontext
$ sudo chcon -t my_domain_exec_t /usr/bin/getcontext
$ /usr/bin/getcontext
unconfined_t:unconfined_r:my_domain_t:s0-s0:c0.c1023
通过测试,我相信我已经排除了与运行文件的用户、文件的所有权或父目录的安全上下文相关的任何因素。还有什么可能导致这种差异?
编辑:
/data
未通过 NFS 安装。 的上下文/data
是system_u:object_r:default_t:s0
。在我测试的另一个系统上,我还看到/data
标记为system_u:object_r:etc_runtime_t:s0
。
policy_module(my_domain, 1.0.0)
require {
type unconfined_t;
}
type my_domain_t;
type my_domain_exec_t;
role unconfined_r types my_domain_t;
allow unconfined_t my_domain_exec_t:file *;
allow my_domain_t my_domain_exec_t:file { rx_file_perms() };
allow unconfined_t my_domain_t:process { transition siginh setexec };
type_transition unconfined_t my_domain_exec_t: process my_domain_t;
这是我创建的近 20 个策略版本中最简单的一个,它显示了所描述的行为。我还尝试了domain_trans
、domain_auto_trans
和domain_entry_file
宏,以及sepolgen
使用domtrans_pattern
宏的工具生成策略。
答案1
SElinux 实际上并不太关心文件路径。
我无法重现您的问题。我在 Fedora 20 上使用staff_r
角色和staff_t
类型,但这似乎有效地复制了您的问题。
我的程序:
#include <stdio.h>
#include <stdlib.h>
#include <selinux/selinux.h>
int main() {
security_context_t con;
if (getcon(&con) < 0) {
perror("Cannot getcon");
return 1;
}
printf("%s\n", con);
freecon(con);
return 0;
}
我的政策。
policy_module(getcon, 1.0.0)
require {
role staff_r;
type staff_t;
}
## Type defs
type getcon_exec_t;
type getcon_t;
application_domain(getcon_t, getcon_exec_t)
## Role permits
role staff_r types getcon_t;
## Transitions
domain_auto_transition_pattern(staff_t, getcon_exec_t, getcon_t);
## Access vectors
allow getcon_t staff_t:process sigchld;
userdom_use_inherited_user_ptys(getcon_t);
编译程序:
gcc -o getcon getcon.c -lselinux
编译并加载策略:
make -f /usr/share/selinux/devel/Makefile load
不改变上下文的情况下运行
$ ./getcon
staff_u:staff_r:staff_t:s0-s0:c0.c1023
改变上下文:
# chcon -t getcon_exec_t getcon
$ ./getcon
staff_u:staff_r:getcon_t:s0-s0:c0.c1023
将父目录更改为 default_t:
# chcon -t . default_t; chcon -t getcon_exec_t getcon
$ ./getcon
staff_u:staff_r:getcon_t:s0-s0:c0.c1023
如果你愿意,你可以尝试使用我的政策作为基础。但这似乎对我没有影响。