当应用程序二进制文件位于标准二进制目录之外时,为什么我的域转换不会发生?

当应用程序二进制文件位于标准二进制目录之外时,为什么我的域转换不会发生?

我正在尝试设置一个自定义SELinux策略,但是当应用程序二进制文件位于标准二进制目录(如/bin/usr/bin等)之外时,我无法进行域转换。应用程序二进制文件必须位于这些目录之外。

为了测试目的,我有一个程序,它只是打印当前SELinux域。我有一个域my_domain_t和一个类型。当域中的进程执行具有上下文的文件时,将设置为发生my_domain_exec_t转换。my_domain_tunconfined_tmy_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 安装。 的上下文/datasystem_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_transdomain_auto_transdomain_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

如果你愿意,你可以尝试使用我的政策作为基础。但这似乎对我没有影响。

相关内容