我在同一个局域网中有几个虚拟机,由 Icinga2 通过 NRPE 监控。
[机器A]
CentOS 6
糖霜2。
[机器B]
CentOS 6
MariaDB v10.1.12 正常运行
my.cnf 中的 Datadir 和 socket 设置:
datadir=/database/mariadb
socket=/database/mariadb/mysql.sock
还有以下符号链接:
/var/lib/mysql -> /database/mariadb
以上所有内容的所有者:组都是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
- nrpe.cfg包含以下行:
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...
仅当我在机器 B 上禁用 SELinux 时(echo 0 > /selinux/enforce
),Icinga 才能够连接到 mysql 并显示状态 OK。但我不想禁用 SELinux。我尝试找到适当的设置,以启用 SELinux 并让 Icinga 正确连接到 mysql。
[编辑]
每次 Icinga 检查机器 BI 上的 mysql 时,都会在机器 B 上的 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)
答案1
尝试这个:
setsebool -P nagios_run_sudo 1
在具有 NRPE 的主机上。此选项在 SELinux 策略中默认禁用。
答案2
我终于解决了这个问题。我在下面分享了解决方案,因为它可能对其他人也有用。
我创建了一个名为 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
答案3
您的问题是套接字通常位于/var/lib/mysql
数据文件内部。
由于您使用不同的数据库目录,因此 SELinux 会阻止请求,无论符号链接如何。
您可以尝试通过 TCP 连接访问 MySQL(使用127.0.0.1
和不是 localhost
)
但这仍可能导致 SELinux 和 MySQL 守护进程本身出现问题。