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_uсопоставление пользователей SELinux. id -Zas rootвам это скажет.

Если вы отметите /etc/init.d/tomcat{6,7}, вы найдете ifпереключатель, который указывает, что он runuserдолжен использоваться вместо plain suв системах с поддержкой SELinux. Однако эта команда не предотвращает наследование сопоставления пользователей SELinux процессом tomcatjava.

Это актуально, и я попытаюсь это показать:

Хватай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)", "роль, связанная с доменом пользователя" и "тип домена пользователя" берутся у пользователя SELinux, выполняющего приложение Java.

Наконец, третий файл содержит правила применения типов и определения булевых значений.

Теперь, если вы намерены запускать приложения Java с использованием ограниченного пользователя SELinux, вам нужно написать собственную политику, так как в текущей справочной политике такого нет (ни в RHEL6, ни в upstream, я думаю). Вы можете начать с дублирования файлов и экспериментировать оттуда.

Конечно, это нелегкая задача.

Связанный контент