Назад | Перейти на главную страницу

RHEL6: Tomcat работает как неограниченный пользователь Java

Я начинаю настраивать RHEL6 как защищенный сервер Tomcat и применять политики SELinux для контроля доступа. После установки RHEL6 и Tomcat6 (автономно, без httpd) я заметил, что процесс Tomcat работает как unlimited_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

Если вы используете стандартный targeted политика (проверьте /etc/selinux/config или беги sestatus чтобы узнать), шансы root использует unconfined_u Отображение пользователей SELinux. id -Z так как root скажу тебе.

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

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

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

Наконец, третий файл содержит правила применения типов и логические определения.

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

Конечно, это непростая задача.