SELinux:无法将 Firefox 进程限制在 mozilla_t 域中

SELinux:无法将 Firefox 进程限制在 mozilla_t 域中

mozilla_t我的目标是在域中而不是中执行 Firefox unconfined_t。该机器以强制模式运行带有 SELinux 的 Fedora 20。

不幸的是,我似乎无法做到这一点。无论我做什么,该过程始终在域中执行unconfined_t

我知道需要满足三个条件:

  1. 目标文件上下文(mozilla_exec_t)对于源域必须是可执行的(unconfined_tbin_t
  2. 目标文件上下文 ( mozilla_exec_t) 必须标记为目标域的入口点 ( mozilla_t)
  3. 必须允许源域(unconfined_t或)转换到目标域( )bin_tmozilla_t

目标文件是 Firefox 脚本,/usr/bin/firefox其中调用/usr/lib64/firefox/run-mozilla.run,后者再次运行二进制文件。这是这些文件/usr/lib64/firefox/firefox的输出:ls -Z

-rwxr-xr-x. root root system_u:object_r:bin_t:s0       /usr/bin/firefox
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       /usr/lib64/firefox/run-mozilla.sh
-rwxr-xr-x. root root system_u:object_r:mozilla_exec_t:s0 /usr/lib64/firefox/firefox

第一的条件满足,就unconfined_t允许执行目标文件上下文mozilla_exec_t

$ sesearch -s unconfined_t -t mozilla_exec_t -c file -p execute -Ad
Found 1 semantic av rules:
   allow unconfined_t mozilla_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ; 

第二条件得到满足,就mozilla_exec_t被定义为mozilla_t域的入口点。

$ sesearch -s mozilla_t -t mozilla_exec_t -c file -p entrypoint -Ad
Found 1 semantic av rules:
   allow mozilla_t mozilla_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ; 

根据 Fedora 20 中的默认配置,第三条件是不是由于unconfined_t无法过渡到而遇到mozilla_t

$ sesearch -s unconfined_t -t mozilla_t -c process -p transition -Ad
(no output)

为了解决这个问题,我编写了一个简短的策略模块,授予unconfined_t流程转换到的权限mozilla_t

module rekado 1.0;

require {
  type unconfined_t;
  type mozilla_t;
  class process transition;
}

allow unconfined_t mozilla_t : process transition ; 

现在我应该能够mozilla_t通过直接运行可执行文件在域中运行 Firefox 进程/usr/lib64/firefox/firefox,但该进程仍保留在域中unconfined_t

这是怎么回事?为什么没有进程上下文mozilla_t

答案1

你几乎做到了。问题是允许规则

允许 unconfined_t mozilla_t:进程转换;

允许过渡将会发生,但不会原因让它发生。为此你需要一个 type_transition 规则:

type_transition unconfined_t mozilla_exec_t:进程 mozilla_t;

这会导致在 unconfined_t 进程执行 mozilla_exec_t 文件时发生转换。

完成后,firefox 将无法运行。我使用 audit2allow 来追踪允许 firefox 管理临时文件和套接字所需的附加规则。

这是适用于我的基于 CentOS 6 的 VM 的策略。它需要启用 selinux 布尔值 mozilla_read_content (via: setsebool -P mozilla_read_content 1)。

module mozilla 1.0;

require {
  role unconfined_r;
  type unconfined_t;
  type mozilla_t;
  type mozilla_exec_t;
  type tmp_t;
  type user_tmp_t;
  type fs_t;
  class process transition;
  class file { ioctl getattr setattr create read write unlink open relabelto };
  class dir { ioctl getattr setattr create read write unlink add_name remove_name };
  class filesystem getattr;
  class sock_file { getattr setattr create read write unlink };
  class unix_stream_socket connectto;
}

role unconfined_r types mozilla_t;

allow unconfined_t self:file relabelto;
allow unconfined_t mozilla_t : process transition ; 

type_transition unconfined_t mozilla_exec_t : process mozilla_t;

allow mozilla_t fs_t:filesystem getattr;
allow mozilla_t tmp_t:file { ioctl getattr setattr create write unlink open };
allow mozilla_t tmp_t:dir  { ioctl getattr setattr create read write add_name remove_name };
allow mozilla_t user_tmp_t:dir { ioctl create write add_name setattr remove_name };
allow mozilla_t user_tmp_t:sock_file { getattr setattr create read write unlink };
allow mozilla_t unconfined_t:unix_stream_socket connectto;  

要编译并安装它:

# checkmodule -M -m -o mozilla.mod mozilla.te
checkmodule: 从 rekado.te 加载策略配置
checkmodule: 策略配置已加载
checkmodule: 将二进制表示形式(版本 10)写入 mozilla.mod
# semodule_package -o mozilla.pp -m mozilla.mod
# sudo semodule -i mozilla.pp

相关内容