
Я начинаю настраивать 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 -Z
as root
вам это скажет.
Если вы отметите /etc/init.d/tomcat{6,7}
, вы найдете if
переключатель, который указывает, что он runuser
должен использоваться вместо plain 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 — это префикс для user_t)", "роль, связанная с доменом пользователя" и "тип домена пользователя" берутся у пользователя SELinux, выполняющего приложение Java.
Наконец, третий файл содержит правила применения типов и определения булевых значений.
Теперь, если вы намерены запускать приложения Java с использованием ограниченного пользователя SELinux, вам нужно написать собственную политику, так как в текущей справочной политике такого нет (ни в RHEL6, ни в upstream, я думаю). Вы можете начать с дублирования файлов и экспериментировать оттуда.
Конечно, это нелегкая задача.