SELinux 阻止 nrpe 访问 MariaDB

SELinux 阻止 nrpe 访问 MariaDB

我在同一个局域网中有几个虚拟机,由 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 守护进程本身出现问题。

相关内容