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