SELinux - Como evitar que um processo de acesso de gravação em arquivos recém-criados seja criado na pasta

1

Eu dificilmente estou tentando usar corretamente o selinux mantendo-o no modo imposto, mas muitas vezes eu encontro problemas com ele, fazendo com que nosso aplicativo funcione incorretamente.

Nossa aplicação web é java backend e angular front end, implementado em tomcat e apache httpd , o uso de backend lucene como um mecanismo de busca que cria um arquivo em uma pasta do sistema de arquivos toda vez que um re-index é desempenhado. Ah, sim, o servidor é o CentOS7 se isso for importante.

para o crescimento de outros, eu digo que ler o sub-humano SELinux log /var/log/audit/audit.log é inútil, e você deve antes transformá-lo em humano usando o comando:

sealert -a /var/log/audit/audit.log > /var/log/audit/audit_human_readable.log

No meu caso, o log estava dizendo o seguinte:

SELinux is preventing /whatever/jre/bin/java from write access on the file /opt/whatever/write.lock

e sugerindo que corrija o problema:

If you want to allow java to have write access on the write.lock file
Then you need to change the label on /opt/whatever/write.lock
Do
# semanage fcontext -a -t FILE_TYPE '/opt/whatever/write.lock'
where FILE_TYPE is one of the following: afs_cache_t, initrc_tmp_t, pki_common_t, pki_ra_log_t, pki_tomcat_cert_t, pki_tomcat_etc_rw_t, pki_tomcat_log_t, pki_tomcat_var_lib_t, pki_tps_log_t$
Then execute:
restorecon -v '/opt/whatever/write.lock'

O que parece ser uma sugestão muito boa e completa, exceto que no passado eu já executei essa sugestão, mas na pasta pai esperando que isso também fosse aplicado em childs, mas o problema ainda está lá.

Acredito que o problema ainda existe porque o Lucene através do processo java geralmente recria o arquivo write.lock, muitas vezes, toda vez que uma nova reindexação é executada, e isso significa que toda vez que um novo arquivo é carregado no webapplication que é parte do as principais funcionalidades do mesmo. E recriando este arquivo, o contexto do SElinux não é herdado corretamente.

Como posso configurar, que todo arquivo criado sob uma determinada pasta, herdará um contexto específico do SElinux de seu diretório pai?

EDIT: (audit.log)

type=AVC msg=audit(1528202320.971:33808): avc:  denied  { write } for  pid=31394 comm="java" name="index" dev="dm-0" ino=57073 scontext=system_u:system_r:tomcat_t:s0 tcontext=system_u:object_r:usr_t:s0 tclass=dir
type=AVC msg=audit(1528202320.971:33808): avc:  denied  { remove_name } for  pid=31394 comm="java" name="write.lock" dev="dm-0" ino=57076 scontext=system_u:system_r:tomcat_t:s0 tcontext=system_u:object_r:usr_t:s0 tclass=dir
type=AVC msg=audit(1528202320.971:33808): avc:  denied  { unlink } for  pid=31394 comm="java" name="write.lock" dev="dm-0" ino=57076 scontext=system_u:system_r:tomcat_t:s0 tcontext=system_u:object_r:usr_t:s0 tclass=file
type=SYSCALL msg=audit(1528202320.971:33808): arch=c000003e syscall=87 success=yes exit=0 a0=7f4a549d8db0 a1=7f4a8c92e1c8 a2=0 a3=3536353030303030 items=2 ppid=1 pid=31394 auid=4294967295 uid=91 gid=91 euid=91 suid=91 fsuid=91 egid=91 sgid=91 fsgid=91 tty=(none) ses=4294967295 comm="java" exe="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre/bin/java" subj=system_u:system_r:tomcat_t:s0 key=(null)

EDIT 2: (ps -auxZ)

# ps -auxZ | grep tomcat
system_u:system_r:tomcat_t:s0   tomcat    1026  1.2 30.7 9637644 7535952 ?     Ssl  May09 514:38 /usr/lib/jvm/jre/bin/java -(and so on)
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 31648 0.0  0.0 112712 976 pts/0 S+ 14:58   0:00 grep --color=auto tomcat
    
por lese 05.06.2018 / 11:16

2 respostas

2

Acredito que o principal problema é que a instalação do seu java não está devidamente rotulada.

A maneira mais fácil de corrigir isso é instalar o Oracle JRE / JDK RPM em vez de usar o arquivo tarball / zip ou, pelo menos, instalar o diretório java em /usr/java

Caso contrário, você provavelmente deve rotular o diretório /whatever/jre/bin e todo o conteúdo como bin_t para que você possa ver a resposta do michael neste tópico e fazer

# semanage fcontext -a -t bin_t "/whatever/jre/bin(/.*)?"
# restorecon -R -v /whatever/jre/bin

Editar, você pode querer fazer isso também:

# semanage fcontext -a -t lib_t "/whatever/jre/lib(/.*)?"
    
por 05.06.2018 / 15:27
1

Supondo que você deseje arquivos em / opt / whatever para obter o contexto whatever_t, os comandos serão:

# semanage fcontext -a -t whatever_t "/opt/whatever(/.*)?"
# restorecon -R -v /opt/whatever

Isso deve fazer o que você espera. Veja man semanage-fcontext

    
por 05.06.2018 / 13:19