[奧塔在線]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

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