我开始将RHEL6configuration为一个强化的Tomcat服务器,并将SELinux策略应用于访问控制。 在安装RHEL6和Tomcat6(独立的,没有httpd)之后,我注意到Tomcat进程是作为unconfined_java_t运行的。 我如何将Tomcat限制在一个select的域名?
从RHEL6开始,默认的SELinux用户映射如下
# semanage user -l Labeling MLS/ MLS/ SELinux User Prefix MCS Level MCS Range SELinux Roles git_shell_u user s0 s0 git_shell_r guest_u user s0 s0 guest_r root user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r staff_u user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r sysadm_u user s0 s0-s0:c0.c1023 sysadm_r system_u user s0 s0-s0:c0.c1023 system_r unconfined_r unconfined_u user s0 s0-s0:c0.c1023 system_r unconfined_r user_u user s0 s0 user_r xguest_u user s0 s0 xguest_r
如果您使用标准的targeted策略(检查/etc/selinux/config或运行sestatus查找),则root正在使用unconfined_u SELinux用户映射。 id -Z作为root会告诉你。
如果您检查/etc/init.d/tomcat{6,7} ,您会发现一个if开关,指出在启用SELinux的系统中必须使用runuser而不是su 。 但是,这个命令并不妨碍SELinux用户映射被tomcat java进程inheritance。
这是相关的,我会试着展示:
抓住selinux-policy SRPM,findjava模块源代码(文件上下文,接口和types执行):
selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.fc selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.if selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.te
第一个是自我解释。 它包含在这种情况下将标记为java_exec_t :来自标准位置和可选位置的二进制文件和库。
第二个可能是最难理解的。 它在此策略模块中定义允许的域转换。 一个片段与您的问题有关:
template(`java_role_template',` gen_require(` type java_exec_t; ') type $1_java_t; domain_type($1_java_t) domain_entry_file($1_java_t, java_exec_t) role $2 types $1_java_t; domain_interactive_fd($1_java_t) userdom_manage_tmpfs_role($2, $1_java_t) allow $1_java_t self:process { ptrace signal getsched execmem execstack }; dontaudit $1_java_t $3:tcp_socket { read write }; allow $3 $1_java_t:process { getattr ptrace noatsecure signal_perms }; domtrans_pattern($3, java_exec_t, $1_java_t) corecmd_bin_domtrans($1_java_t, $3) dev_dontaudit_append_rand($1_java_t) files_execmod_all_files($1_java_t) fs_dontaudit_rw_tmpfs_files($1_java_t) optional_policy(` xserver_role($2, $1_java_t) ') ')
正如该模板上的文档所述,“该模板创build用于Java应用程序的派生域”,其中“用户域的前缀(例如,用户是user_t的前缀)”,“与用户相关联的angular色域“和”用户域的types“全部来自执行Java应用程序的SELinux用户。
最后,第三个文件包含types执行规则和布尔定义。
现在,如果你的意图是使用一个受限制的SELinux用户来运行Java应用程序,那么你需要编写一个自定义策略,就像在当前的引用策略中一样,没有这样的事情(不是在RHEL6中,也不在上游)。 您可以从复制文件开始,并从那里进行实验。
当然,这不是一件容易的事情。