
Estou começando a configurar o RHEL6 para ser um servidor Tomcat reforçado e aplicando políticas SELinux para controle de acesso. Depois de instalar o RHEL6 e o Tomcat6 (autônomo, sem httpd), percebi que o processo do Tomcat estava sendo executado como unconfined_java_t. Como posso limitar o Tomcat a um domínio de sua escolha?
Responder1
A partir do RHEL6, os mapeamentos de usuário padrão do SELinux são os seguintes
# 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
Se você estiver usando uma targeted
política padrão (verifique /etc/selinux/config
ou execute sestatus
para descobrir), provavelmente root
está usando o unconfined_u
mapeamento de usuário SELinux. id -Z
como root
vou te dizer.
Se você marcar /etc/init.d/tomcat{6,7}
, encontrará uma if
opção que indica que runuser
deve ser usado em vez de simples su
em sistemas habilitados para SELinux. Este comando, entretanto, não impede que o mapeamento do usuário SELinux seja herdado pelo tomcat
processo java.
Isso é relevante, como tentarei mostrar:
Pegue oselinux-policy
SRPM, encontre o java
código-fonte do módulo (contextos de arquivo, interface e aplicação de tipo):
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
O primeiro é autoexplicativo. Ele contém os caminhos que, neste caso, serão rotulados java_exec_t
: binários e bibliotecas de locais padrão e opcionais.
O segundo é possivelmente o mais difícil de entender. Ele define as transições de domínio permitidas neste módulo de política. Um trecho é relevante para sua pergunta:
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 afirma a documentação desse modelo, "este modelo cria domínios derivadosque são usados para aplicativos java", onde "o prefixo do domínio do usuário (por exemplo, usuário é o prefixo para user_t)", a "função associada ao domínio do usuário" e "o tipo de domínio do usuário" são todos obtidos do usuário SELinux que executa o Aplicativo Java.
Finalmente, o terceiro arquivo contém as regras de aplicação de tipo e definições booleanas.
Agora, se sua intenção é executar aplicativos Java usando um usuário SELinux confinado, você precisa escrever uma política customizada, já que na política de referência atual não existe tal coisa (nem no RHEL6, nem no upstream, eu acho). Você pode começar duplicando os arquivos e experimentar a partir daí.
Certamente não é uma tarefa fácil.