Não é possível impedir que o SELinux bloqueie o acesso do Apache /usr/local/nagios/var/rw/nagios.cmd

1

Eu tenho um servidor Centos 7 rodando o Nagios Core 4.3.4 com o Apache 2.4.6 em nosso ambiente UAT. Eu tenho um segundo servidor no PROD que foi configurado com o mesmo Playbook Ansible. Nagios foi construído a partir da fonte. O servidor UAT fornece a mensagem Error: Could not stat() command file '/usr/local/nagios/var/rw/nagios.cmd'! ao tentar usar os comandos do Nagios, mas o servidor PROD não. Todas as listagens de configuração fornecidas abaixo são idênticas entre os servidores UAT e PROD.

Confirmei que o erro é causado pelo SELinux: aqui está a saída do meu log de auditoria:

type=AVC msg=audit(1525250190.011:1114376): avc: denied { getattr } for pid=12182 comm="cmd.cgi" path="/usr/local/nagios/var/rw/nagios.cmd" dev="dm-0" ino=201456984 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_rw_content_t:s0 tclass=fifo_file

E aqui estão algumas listagens de diretórios relevantes:

$ ls -Z /usr/local/nagios/var
drwxrwxr-x. nagios nagios unconfined_u:object_r:usr_t:s0   archives
-rw-r--r--. nagios users  system_u:object_r:usr_t:s0       nagios.configtest
-rw-r--r--. nagios nagios system_u:object_r:usr_t:s0       nagios.log
-rw-r--r--. nagios nagios system_u:object_r:usr_t:s0       objects.cache
-rw-r--r--. nagios nagios system_u:object_r:usr_t:s0       objects.precache
-rw-------. nagios nagios system_u:object_r:usr_t:s0       retention.dat
drwxrwsr-x. nagios nagcmd unconfined_u:object_r:httpd_sys_rw_content_t:s0 rw
drwxr-xr-x. root   root   unconfined_u:object_r:usr_t:s0   spool
-rw-rw-r--. nagios nagios system_u:object_r:usr_t:s0       status.dat

$ ls -Z /usr/local/nagios/var/rw
prw-rw----. nagios nagcmd system_u:object_r:httpd_sys_rw_content_t:s0 nagios.cmd
srw-rw----. nagios nagcmd system_u:object_r:httpd_sys_rw_content_t:s0 nagios.qh

O conteúdo do diretório rw é excluído e recriado quando o serviço Nagios é interrompido e iniciado. Toda a informação que vi diz para aplicar o tipo httpd_sys_rw_content_t ao diretório e isso deve funcionar. Ele faz no servidor PROD, mas não no servidor UAT. Pelo que entendi, este próximo comando deve confirmar que ele deve funcionar:

$ sudo sesearch --allow --source httpd_t --target httpd_sys_rw_content_t --class file
Found 6 semantic av rules:
   allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ; 
   allow httpd_t httpd_sys_rw_content_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow httpd_t httpd_sys_rw_content_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow httpd_t httpdcontent : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow httpd_t httpdcontent : file { read getattr execute open } ; 
   allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ; 

Espero que seja algo fácil que eu perdi. Qualquer ajuda aqui seria muito apreciada.

    
por Doughnuts 02.05.2018 / 11:06

1 resposta

1

Eu consegui trabalhar, embora não esteja totalmente feliz com a minha solução. Usei audit2allow para criar uma política personalizada (tive que executá-la três vezes para permitir todas as permissões corretas).

$ sudo grep nagios.cmd /var/log/audit/audit.log | tail -3 | sudo audit2allow -M httpdnagioscmd
$ sudo semodule -i httpdnagioscmd.pp

Pode ter tido algo a ver com a classe dos arquivos sendo fifo_file em vez de file , mas eu não sei o suficiente sobre o SELinux para realmente descobrir a causa raiz.

    
por 03.05.2018 / 04:30