A partir do RHEL6, os mapeamentos de usuários 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 política targeted
padrão (verifique /etc/selinux/config
ou execute sestatus
para descobrir), as chances são root
está usando o mapeamento de usuário unconfined_u
SELinux. id -Z
como root
dirá a você.
Se você verificar /etc/init.d/tomcat{6,7}
, você encontrará uma opção if
indicando que runuser
deve ser usado em vez de su
em sistemas habilitados para SELinux. Este comando, no entanto, não impede que o mapeamento de usuários do SELinux seja herdado pelo processo tomcat
java.
Isso é relevante, como tentarei mostrar:
Agarre o selinux-policy
SRPM, localize o código-fonte do módulo java
(contextos de arquivos, 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 é auto-explicativo. Ele contém os caminhos que, nesse caso, serão rotulados como java_exec_t
: binários e bibliotecas, tanto de locais padrão quanto de locais opcionais.
O segundo é possivelmente o mais difícil de entender. Ele define as transições de domínio permitidas dentro deste módulo de política. Um snippet é 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 a documentação nesse modelo afirma, "este modelo cria domínios derivados que são usados para aplicativos java ", onde "o prefixo do domínio do usuário (por exemplo, usuário é o prefixo para user_t) ", o" papel associado ao domínio do usuário "e" o tipo do domínio do usuário "são todos obtidos do usuário do SELinux que está executando o aplicativo Java.
Por fim, o terceiro arquivo contém as regras de imposição de tipos e as definições booleanas.
Agora, se sua intenção é executar aplicativos Java usando um usuário do SELinux confinado, você precisa escrever uma política customizada, já que na política de referência atual não existe tal coisa (não 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.