在使用Zabbix提供的Template DB MySQL模板对MySQL进行监控时,总是失败。查看日志提示:
item "192.168.0.11:mysql.ping" became not supported: Value "mysqladmin: connect to server at 'localhost' failed
item "192.168.0.11:mysql.status[Bytes_received]" became not supported: Preprocessing failed for: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock...
首先检查相应的配置,配置无问题。然后在客户端(Zabbix-agent端)使用相应指令进行检查。
>>mysqladmin ping
mysqld is alive
说明配置和MYSQL服务均是正常,因为前面有本地SELinux安全限制导致访问异常的案例,所以将SELinux关闭进行访问尝试。
>>setenforce 0
然后在服务端进行测试,发现访问正常。
>>zabbix_get -s 192.168.0.11 -p10050 -k mysql.ping
1
现在可以定位问题原因在SELinux的安全策略上了。在网上有很多这样的案例,基本都通过关闭SELinux来解决问题,然后就到此为止了。然而,关闭SELinux毕竟有安全风险,有没有办法调整策略来规避这个安全风险呢?
我们尝试对Zabbix访问策略进行调整。
#打开访问端口,却提示该端口已打开
>>semanage port -a -t http_port_t -p tcp 3306
#查看Zabbix权限开启情况
>>getsebool -a | grep zabbix
#设置Zabbix访问权限
>>setsebool -P zabbix_can_network on
>>setsebool -P httpd_can_connect_zabbix on
>>setsebool -P zabbix_run_sudo on
#打开MySQL访问权限
>>getsebool -a | grep mysql
>>setsebool -P mysql_connect_any on
>>setsebool -P selinuxuser_mysql_connect_enabled on
然而,测试的结果是:以上操作都解决不了问题。
我们换了个思路,尝试开始从源头入手,既然提示mysql.sock问题,查看它的安全上下文。
>>ll -Z /var/lib/mysql/mysql.sock
srwxrwxrwx. mysql mysql system_u:object_r:mysqld_var_run_t:s0 /var/lib/mysql/mysql.sock
查看SELinux日志,获得Zabbix访问的安全上下文信息。
>>tail /var/log/audit/audit.log
通过上面的指令,我们获得zabbix-agent访问本地文件的安全上下文为:zabbix_agent_t。
尝试修改/var/lib/mysql/mysql.sock的安全上下文为zabbix_agent_t或var_lib_t,但是居然无法修改。。。束手无策啊!
通过Bing搜索异常提示信息也无所得,但是通过zabbix_agent_t作为关键字居然找到了解决方案。
第一步:打开zabbix_agent_t访问策略,现在通过zabbix_get已经可以正常访问数据了
>>semanage permissive -a zabbix_agent_t第二步:通过ausearch导出访问策略数据
>>ausearch -r -m avc -ts today | audit2allow -M zabbix_megacli第三步:将访问策略文件导入SELinux
>>semodule -i zabbix_megacli.pp第四步:关闭zabbix_agent_t临时访问策略
>>semanage permissive -d zabbix_agent_t
通过上面的操作,我们再在服务端查看日志,现在已可正常监控MySQL数据了。
以下为Zabbix在SELinux下的策略(可查看第二步输出的两个文件.pp和.te)。
***********************************************************
module zabbix_mysql 1.0;require {
type unconfined_t;
type mysqld_var_run_t;
type mysqld_etc_t;
type mysqld_t;
type zabbix_var_lib_t;
type zabbix_agent_t;
class sock_file write;
class unix_stream_socket connectto;
class file { read relabelto open };
class dir relabelto;
}#============= unconfined_t ==============
allow unconfined_t zabbix_agent_t:dir relabelto;
allow unconfined_t zabbix_agent_t:file relabelto;#============= zabbix_agent_t ==============
allow zabbix_agent_t mysqld_etc_t:file { read open };#!!!! This avc can be allowed using the boolean 'daemons_enable_cluster_mode'
allow zabbix_agent_t mysqld_t:unix_stream_socket connectto;
allow zabbix_agent_t mysqld_var_run_t:sock_file write;
allow zabbix_agent_t zabbix_var_lib_t:file { read open };
******************************************************************
参考:
https://serverfault.com/questions/617696/selinux-blocking-sudo-from-zabbix-agentd
https://support.zabbix.com/browse/ZBX-10782