Zabbix远程命令权限不足问题解决方法

在客户机上,当zabbix-server指示zabbix-agent执行命令的时候,不管是监控项里面的shell命令,还是报警之后执行的远程命令,往往都会执行不成功,主要原因就是被linux各种安全措施给拦截了。在redhat和centos中尤其明显。

一、程序,网络权限

比如下面是一个基于ncat(nc)命令的监控项,用来监控客户机能否连通某个TCP端口,探测远程端口是否开启。

该文件放置在/etc/zabbix/zabbix_agentd.d/ 下面

  1. UserParameter=custom.ncat[*],nc -w 1 -z $1 $2 < /dev/null && echo "success"  

然后当我使用zabbix-server远程执行这个命令的时候,就会被selinux拦住,报错如下

  1. zabbix_get -s 192.168.2.169 -k "custom.ncat[172.17.0.2,3306]"  
  2. Ncat: Permission denied.  

只有当我们在客户机上设置

  1. setenforce 0  

暂时停止掉selinux的拦截行为,才能得到正常的结果,但是关闭selinux会增加操作系统被入侵的风险,那么应该怎么办呢。

 

报错的意思说,zabbix-agent没有权限去调用ncat命令。但是注意,如果把上面的ncat命令删掉,只保留echo命令,是可以正常执行的,那么我们首先检查一下这几个文件的可执行权限

  1. [root@jdftp zabbix_agentd.d]# ls -Z /usr/bin/echo   
  2. -rwxr-xr-x. root root system_u:object_r:bin_t:s0       /usr/bin/echo  
  3. [root@jdftp zabbix_agentd.d]# ls -Z /usr/bin/nc  
  4. lrwxrwxrwx. root root system_u:object_r:bin_t:s0       /usr/bin/nc -> ncat  
  5. [root@jdftp zabbix_agentd.d]# ls -Z /usr/bin/ncat  
  6. -rwxr-xr-x. root root system_u:object_r:bin_t:s0       /usr/bin/ncat  

(注意:如果zabbix命令调用的是nc,那么会报Permission denied,nc没有执行权限,表示无权限,而调用ncat的话,不会报错,ncat会告诉你该端口不通,但实际是通的,此时ncat可执行但是ncat访问谁都不通)

发现这三个文件的可执行权限是一样的,那么既然echo能执行,ncat也可以才对。那么我们要想调查原因就需要去查看一下selinux的拦截日志了。

  1. tail /var/log/messages  
  2. ......  
  3. Jun  1 09:30:20 jdftp setroubleshoot: SELinux is preventing /usr/sbin/zabbix_agentd from name_connect access on the tcp_socket port 3306. For complete SELinux messages run: sealert -l 7d3b5686-8eb8-45ae-90f3-00f3b66bd827  
  4. Jun  1 09:30:20 jdftp python: SELinux is preventing /usr/sbin/zabbix_agentd from name_connect access on the tcp_socket port 3306.#012#012*****  Plugin catchall (100. confidence) suggests   **************************#012#012If you believe that zabbix_agentd should be allowed name_connect access on the port 3306 tcp_socket by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'zabbix_agentd' --raw | audit2allow -M my-zabbixagentd#012# semodule -i my-zabbixagentd.pp#012  

上面的意思大概是说,SELinux拦截了/usr/sbin/zabbix_agentd程序连接TCP端口的网络行为,而ncat与echo这类程序最大不同就在于他需要调用核心的网络接口,selinux拦截的话那么ncat就失去作用了。好在selinux的审计日志非常任性化,直接把放开权限的方法给你写到日志里去了,我们只需执行即可。

  1. # ausearch -c 'zabbix_agentd' --raw | audit2allow -M my-zabbixagentd  
  2. ******************** IMPORTANT ***********************  
  3. To make this policy package active, execute:  
  4.   
  5. semodule -i my-zabbixagentd.pp  
  6.   
  7. # semodule -i my-zabbixagentd.pp  

通过上面两行就可以把ncat的网络限制给去掉了,这样我们既保证了zabbix-agent的正常运行,也不妨碍selinux保护我们的系统。

二、root权限

第二种情况是当我们设置了触发器报警后的执行命令,比如检测到80端口不通之后自动重启nginx,也就是所谓的远程命令,这个在zabbix的官方手册上已经给出了解决方案,就是让zabbix执行sudo命令,提升权限到root。但是sudo不是谁想执行就能执行的,需要修改sudoers配置文件,指定zabbix-agent可以执行哪些命令,原文如下

访问权限

确保'zabbix'用户具有已配置命令的执行权限。可能有兴趣使用 sudo 来访问特权命令。 要配置访问,请以root身份执行:

# visudo

可以在 sudoers文件中使用的行:

# allows 'zabbix' user to run all commands without password.
zabbix ALL=NOPASSWD: ALL
# allows 'zabbix' user to restart apache without password.
zabbix ALL=NOPASSWD: /etc/init.d/apache restart

NOPASSWD代表zabbix-agent可以不凭借密码直接执行命令,因为是后台运行,所以不需要输入密码。后面的ALL最好换成具体执行的命令,因为ALL对系统来说非常危险,授权过大。比如要授予上面ncat的sudo权限就可以这样写

  1. #visudo  
  2.   
  3. ## Allow root to run any commands anywhere  
  4. root    ALL=(ALL)       ALL  
  5. zabbix  ALL=NOPASSWD: /usr/bin/nc  

注:root那一行是本来就有的,命令只需写到nc,不要写后面的-w -z等参数,不然保存时会报错。同理对于其他的后面有参数的命令,都只需要写到可执行文件本身即可。

 

posted @ 2018-06-04 16:56  Awakenedy  阅读(7504)  评论(0编辑  收藏  举报