redhat – RHEL6:Tomcat作为无限制的Java用户运行

我开始将RHEL6配置为强化的Tomcat服务器并应用SE Linux策略进行访问控制.在安装RHEL6和Tomcat6(独立,没有httpd)之后,我注意到Tomcat进程是以unconfined_java_t的形式运行的.我如何将Tomcat限制在一个选择的域中?

解决方法

从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

如果您使用的是标准目标策略(检查/ etc / selinux / config或运行sestatus以查找),则root用户正在使用unconfined_u SELinux用户映射. id -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_t的前缀)”,“与用户关联的角色” domain“和”用户域的类型“都取自执行Java应用程序的SELinux用户.

最后,第三个文件包含类型强制规则和布尔定义.

现在,如果您打算使用受限制的SELinux用户运行Java应用程序,则需要编写自定义策略,因为在当前的参考策略中没有这样的事情(我认为不在RHEL6中,也不在上游).您可以从复制文件开始,然后从那里进行实验.

当然,这不是一件容易的事.

相关文章

insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...
如何抑制stable_secret读取关键的“net.ipv6.conf.all.stabl...