RHEL6:Tomcat 以不受限制的 Java 用户身份运行

RHEL6:Tomcat 以不受限制的 Java 用户身份运行

我开始将 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_uSELinux 用户映射。asid -Zroot告诉您。

如果您检查/etc/init.d/tomcat{6,7},您会发现一个if开关,指出在启用 SELinux 的系统中runuser必须使用 而不是 plain su。但是,此命令不会阻止tomcatjava 进程继承 SELinux 用户映射。

这很有意义,我将尽力展示这一点:

抓住selinux-policySRPM,找到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 中没有,上游也没有)。您可以先复制文件,然后从那里开始进行实验。

这当然不是一件容易的事。

相关内容