Назад | Перейти на главную страницу

SELinux блокирует доступ nrpe к MariaDB

У меня есть несколько виртуальных машин в одной локальной сети, которые контролируются Icinga2 через NRPE.

[Машина А]

[Машина B]

Настройки Datadir и сокета в my.cnf:

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

Также существует следующая символическая ссылка:

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

Группа owner: всего вышеперечисленного - mysql: mysql.

со следующим контекстом безопасности:

-rwxr-xr-x. root root system_u:object_r:nagios_services_plugin_exec_t:s0 /usr/lib64/nagios/plugins/check_mysql

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

Теперь проблема:

Icinga (с машины A) сообщает:

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

Если я вручную запустил следующую строку на машине B:

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

Результат в порядке (код выхода 0):

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

Только когда я отключу SELinux на машине B (echo 0 > /selinux/enforce) Icinga может подключиться к mysql и показать статус OK. Но я не хочу отключать SELinux. Я пытаюсь найти правильные настройки, чтобы и SELinux, и Icinga правильно подключались к mysql.

[редактировать]

Каждый раз, когда Icinga проверяет mysql на машине B, я вижу следующие две новые строки в audit.log на машине 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)

Попробуй это:

setsebool -P nagios_run_sudo 1

На хосте с НРПЭ. Эта опция по умолчанию отключена в политике SELinux.

В конце концов мне удалось это решить. Я делюсь приведенным ниже решением, так как оно может быть полезно и другим.

Я создал рабочий файл с именем audit.log, содержащий только следующие строки:

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)

Я побежал:

sealert -a audit.log > sealert.log

Полученный sealert.log содержал объяснение проблемы:

SELinux предотвращает / usr / lib64 / nagios / plugins / check_mysql доступ для чтения к lnk_file mysql.

а также предложения по ее устранению. Как было предложено там, я выполнил следующее:

grep check_mysql audit.log | audit2allow -M mypol

В результате были получены два файла: mypol.pp и mypol.te.

Наконец, я выполнил следующее, что полностью решило проблему:

semodule -i mypol.pp

Ваша проблема в том, что розетка обычно находится внутри /var/lib/mysql с файлами данных.

Поскольку вы используете другой каталог базы данных, SELinux блокирует запрос независимо от символической ссылки.

Вы можете попытаться получить доступ к MySQL через TCP-соединение (используйте 127.0.0.1 и не localhost)

Но это по-прежнему может вызвать проблемы с SELinux с самим демоном MySQL.