mozilla_t
我的目标是在域中而不是中执行 Firefox unconfined_t
。该机器以强制模式运行带有 SELinux 的 Fedora 20。
不幸的是,我似乎无法做到这一点。无论我做什么,该过程始终在域中执行unconfined_t
。
我知道需要满足三个条件:
- 目标文件上下文(
mozilla_exec_t
)对于源域必须是可执行的(unconfined_t
或bin_t
) - 目标文件上下文 (
mozilla_exec_t
) 必须标记为目标域的入口点 (mozilla_t
) - 必须允许源域(
unconfined_t
或)转换到目标域( )bin_t
mozilla_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