SELinux блокирует доступ nrpe к MariaDB
У меня есть несколько виртуальных машин в одной локальной сети, которые контролируются Icinga2 через NRPE.
[Машина A]
CentOS 6
Icinga2.
[Машина B]
CentOS 6
MariaDB v10.1.12 работает правильно
Datadir и настройки сокетов в my.cnf:
datadir=/database/mariadb
socket=/database/mariadb/mysql.sock
Существует также следующая символическая ссылка:
/var/lib/mysql -> /database/mariadb
Владелец: группа всего вышеперечисленного - mysql: mysql.
SELinux включен
/usr/lib64/nagios/plugins/check_mysql v2.0.3
со следующим контекстом безопасности:
-rwxr-xr-x. root root system_u:object_r:nagios_services_plugin_exec_t:s0 /usr/lib64/nagios/plugins/check_mysql
- nrpe.cfg содержит следующую строку:
command[check_mysql]=/usr/lib64/nagios/plugins/check_mysql -H localhost -u xxx -p xxx -P 3306
Теперь проблема:
Исинга (с машины А) сообщает:
"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 и показать состояние ОК. Но я не хочу отключать SELinux. Я пытаюсь найти правильные настройки, чтобы и SELinux был включен, и Icinga правильно подключался к mysql.
[редактировать]
Каждый раз, когда Icinga проверяет mysql на компьютере B I, смотрите следующие две новые строки в файле aud.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)
3 ответа
Попробуй это:
setsebool -P nagios_run_sudo 1
На хосте с NRPE. Эта опция по умолчанию отключена в политике 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 доступ к чтению в mysql lnk_file.
а также предложения по его устранению. Как и предполагалось, я запустил следующее:
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.