[奥塔在线]DEV&OPS系列从开发到运维之十一:Zabbix监控Mysql时提示ERROR 2002错误解决方案

在使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章