![RHEL6:Tomcat 以不受限制的 Java 用户身份运行](https://linux22.com/image/617199/RHEL6%EF%BC%9ATomcat%20%E4%BB%A5%E4%B8%8D%E5%8F%97%E9%99%90%E5%88%B6%E7%9A%84%20Java%20%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E8%BF%90%E8%A1%8C.png)
我开始将 RHEL6 配置为强化的 Tomcat 服务器,并应用 SELinux 策略进行访问控制。安装 RHEL6 和 Tomcat6(独立,无 httpd)后,我注意到 Tomcat 进程以 unconfined_java_t 身份运行。如何将 Tomcat 限制在所选域中?
答案1
从 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 用户映射。asid -Z
会root
告诉您。
如果您检查/etc/init.d/tomcat{6,7}
,您会发现一个if
开关,指出在启用 SELinux 的系统中runuser
必须使用 而不是 plain su
。但是,此命令不会阻止tomcat
java 进程继承 SELinux 用户映射。
这很有意义,我将尽力展示这一点:
抓住selinux-policy
SRPM,找到java
模块源代码(文件上下文,接口和类型强制):
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)
')
')
正如该模板上的文档所述,“此模板创建派生域用于 Java 应用程序",其中“用户域的前缀(例如,user 是 user_t 的前缀)”、“与用户域关联的角色”和“用户域的类型”均取自执行 Java 应用程序的 SELinux 用户。
最后,第三个文件包含类型强制规则和布尔定义。
现在,如果您打算使用受限的 SELinux 用户运行 Java 应用程序,则需要编写自定义策略,因为在当前参考策略中没有这样的事情(我认为 RHEL6 中没有,上游也没有)。您可以先复制文件,然后从那里开始进行实验。
这当然不是一件容易的事。