Я начинаю настраивать 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, ни в восходящем направлении). Вы можете начать с дублирования файлов и поэкспериментировать.
Конечно, это непростая задача.