O SELinux bloqueia o acesso nrpe ao MariaDB

1

Eu tenho algumas máquinas virtuais na mesma LAN monitorada por Icinga2 via NRPE.

[Máquina A]

  • CentOS 6

  • Icinga2.

[Máquina B]

  • CentOS 6

  • MariaDB v10.1.12 executando corretamente

Configurações do datadir e socket em my.cnf:

datadir=/database/mariadb
socket=/database/mariadb/mysql.sock

Existe também o seguinte link simbólico:

/var/lib/mysql -> /database/mariadb

O proprietário: grupo de todos os acima é mysql: mysql.

  • SELinux ativado

  • / usr / lib64 / nagios / plugins / check_mysql v2.0.3

com o seguinte contexto de segurança:

-rwxr-xr-x. root root system_u:object_r:nagios_services_plugin_exec_t:s0 /usr/lib64/nagios/plugins/check_mysql
  • nrpe.cfg contém a seguinte linha:

command[check_mysql]=/usr/lib64/nagios/plugins/check_mysql -H localhost -u xxx -p xxx -P 3306

Agora o problema:

Icinga (da máquina A) relata:

"Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)"

Se eu manualmente executar a seguinte linha na máquina B:

sudo -u nrpe /usr/lib64/nagios/plugins/check_mysql -H localhost -u xxx -p xxx -P 3306

O resultado é ok (código de saída 0):

Uptime: 2085  Threads: 1  Questions: 68204  Slow queries: 0  Opens: 37  Flush...

Somente quando desativo o SELinux na máquina B ( echo 0 > /selinux/enforce ), a Icinga é capaz de se conectar ao mysql e mostrar o status OK. Mas eu não quero desativar o SELinux. Eu tento encontrar as configurações adequadas para ter o SELinux ativado e o Icinga se conectando corretamente ao mysql.

[editar]

Toda vez que o Icinga verifica o mysql na máquina B, vejo as duas novas linhas seguintes no audit.log na máquina B:

type=AVC msg=audit(1460038526.265:69): avc:  denied  { read } for  pid=4858 comm="check_mysql" name="mysql" dev=dm-0 ino=130900 scontext=system_u:system_r:nagios_services_plugin_t:s0 tcontext=unconfined_u:object_r:var_lib_t:s0 tclass=lnk_file
type=SYSCALL msg=audit(1460038526.265:69): arch=c000003e syscall=42 success=no exit=-13 a0=3 a1=7fffe4d270f0 a2=6e a3=7fffe4d263e0 items=0 ppid=4857 pid=4858 auid=4294967295 uid=497 gid=498 euid=497 suid=497 fsuid=497 egid=498 sgid=498 fsgid=498 tty=(none) ses=4294967295 comm="check_mysql" exe="/usr/lib64/nagios/plugins/check_mysql" subj=system_u:system_r:nagios_services_plugin_t:s0 key=(null)
    
por Ciprian Stoica 07.04.2016 / 14:41

3 respostas

4

Tente isto:

setsebool -P nagios_run_sudo 1

No host com NRPE. Esta opção está desabilitada por padrão na política do SELinux.

    
por 08.04.2016 / 16:24
1

Eu consegui resolvê-lo finalmente. Eu compartilho a solução abaixo, pois pode ser útil para os outros também.

Eu criei um arquivo de trabalho chamado audit.log contendo apenas as linhas abaixo:

type=AVC msg=audit(1460038526.265:69): avc:  denied  { read } for  pid=4858 comm="check_mysql" name="mysql" dev=dm-0 ino=130900 scontext=system_u:system_r:nagios_services_plugin_t:s0 tcontext=unconfined_u:object_r:var_lib_t:s0 tclass=lnk_file
type=SYSCALL msg=audit(1460038526.265:69): arch=c000003e syscall=42 success=no exit=-13 a0=3 a1=7fffe4d270f0 a2=6e a3=7fffe4d263e0 items=0 ppid=4857 pid=4858 auid=4294967295 uid=497 gid=498 euid=497 suid=497 fsuid=497 egid=498 sgid=498 fsgid=498 tty=(none) ses=4294967295 comm="check_mysql" exe="/usr/lib64/nagios/plugins/check_mysql" subj=system_u:system_r:nagios_services_plugin_t:s0 key=(null)

eu corri:

sealert -a audit.log > sealert.log

O resultado sealert.log continha a explicação do problema:

SELinux is preventing /usr/lib64/nagios/plugins/check_mysql from read access on the lnk_file mysql.

e também sugestões para corrigi-lo. Como sugerido lá, eu corri o seguinte:

grep check_mysql audit.log | audit2allow -M mypol

Isso gerou dois arquivos: mypol.pp e mypol.te

Por fim, executei o seguinte, que resolveu completamente o problema:

semodule -i mypol.pp
    
por 11.04.2016 / 17:13
0

Seu problema é que o soquete geralmente reside dentro de /var/lib/mysql com os arquivos de dados.

Como você está usando um diretório de banco de dados diferente, o SELinux está bloqueando a solicitação, independentemente do symlink.

Você pode tentar acessar o MySQL através da conexão TCP (use 127.0.0.1 e não localhost )

Mas isso ainda pode causar problemas com o SELinux com o próprio daemon do MySQL.

    
por 07.04.2016 / 20:34