У меня есть несколько виртуальных машин в одной локальной сети, которые контролируются Icinga2 через NRPE.
[Машина А]
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
Группа owner: всего вышеперечисленного - mysql: mysql.
SELinux включен
/ usr / lib64 / nagios / плагины / 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
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.