RHEL6: Tomcat se ejecuta como usuario de Java ilimitado

RHEL6: Tomcat se ejecuta como usuario de Java ilimitado

Estoy empezando a configurar RHEL6 para que sea un servidor Tomcat reforzado y estoy aplicando políticas de SELinux para el control de acceso. Después de instalar RHEL6 y Tomcat6 (independiente, sin httpd), noté que el proceso de Tomcat se ejecutaba como unconfined_java_t. ¿Cómo puedo limitar Tomcat a un dominio de elección?

Respuesta1

A partir de RHEL6, las asignaciones de usuarios predeterminadas de SELinux son las siguientes

# 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

Si está utilizando una targetedpolítica estándar (verifique /etc/selinux/configo ejecute sestatuspara averiguarlo), lo más probable es rootque esté utilizando la unconfined_uasignación de usuarios de SELinux. id -Zcomo rootte diré.

Si marca /etc/init.d/tomcat{6,7}, encontrará un ifinterruptor que indica que runuserdebe usarse en lugar de simple suen sistemas habilitados para SELinux. Este comando, sin embargo, no evita que el proceso java herede la asignación de usuarios de SELinux tomcat.

Esto es relevante, como intentaré mostrar:

Toma elselinux-policySRPM, busque el javacódigo fuente del módulo (contextos de archivos, interfaz y aplicación de tipos):

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

El primero se explica por sí mismo. Contiene las rutas que, en este caso, estarán etiquetadas java_exec_t: binarios y bibliotecas tanto de ubicaciones estándar como opcionales.

El segundo es posiblemente el más difícil de entender. Define las transiciones de dominio permitidas dentro de este módulo de política. Un fragmento es relevante para su pregunta:

 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)
   ')
 ')

Como indica la documentación de esa plantilla, "esta plantilla crea dominios derivadosque se utilizan para aplicaciones java", donde "el prefijo del dominio de usuario (por ejemplo, usuario es el prefijo de usuario_t)", "la función asociada con el dominio de usuario" y "el tipo de dominio de usuario" se toman del usuario de SELinux que ejecuta el Aplicación Java.

Finalmente, el tercer archivo contiene las reglas de aplicación de tipos y definiciones booleanas.

Ahora, si su intención es ejecutar aplicaciones Java utilizando un usuario SELinux confinado, necesita escribir una política personalizada, ya que en la política de referencia actual no existe tal cosa (creo que no en RHEL6, ni en sentido ascendente). Puedes empezar duplicando los archivos y experimentar desde allí.

Seguramente no es una tarea fácil.

información relacionada