12 限制agent检查

概述

可以通过创建监控项黑名单、白名单或白名单/黑名单的组合来限制agent的检查。

为此,请结合使用两个agent 配置 参数:

  • AllowKey=<pattern> - 允许哪些检查; <pattern> 使用通配符 (*)表达式指定
  • DenyKey=<pattern> - 拒绝哪些检查; <pattern> 使用通配符 (*) 表达式指定

请注意:

  • 缺省情况下,所有 system.run[*] 监控项 (远程命令,脚本) 是禁用的,即便没有指定拒绝健;
  • 从 Zabbix 5.0.2 开始,agent参数 EnableRemoteCommands :
    • Zabbix agent 已弃用
    • Zabbix agent2 不支持

因此,要允许所有远程命令,请指定AllowKey=system.run[<command>,*] ,其中* 代表等待模式和非等待模式。还可以指定AllowKey=system.run[*]参数来允许所有命令的等待和非等待模式。要禁止特定的远程命令,在AllowKey=system.run[*] 参数之前添加DenyKey参数,并使用system.run[]来指定命令。

重要规则

  • 没有拒绝规则的白名单只允许 system.run[*]监控项。对于所有其它监控项,如果没有DenyKey参数,则不允许使用AllowKey 参数; 这种只有AllowKey参数情况下, Zabbix agent 将不会启动。
  • 顺序很重要。指定参数在配置文件中按其出现顺序逐一检查:
    • 一旦监控项键值与允许/拒绝规则匹配,该项即被允许或拒绝;并且规则检查停止。因此,如果一个项同时满足允许规则和拒绝规则,那么结果取决于最先匹配到的那个规则。
    • 顺序还影响EnableRemoteCommands参数(如果使用的话)。
  • 支持无限数量的AllowKey/DenyKey参数。
    • AllowKey、DenyKey规则不影响HostnameItem、HostMetadataItem、HostInterfaceItem配置参数。
    • 键模式是一个通配符表达式,其中通配符 (*)与特定位置的任意数量的任意字符匹配。它可以用于关键字名称和参数。
  • 如果在agent配置中不允许某个特定的监控项,则该监控项将被报告为不受支持(没有给出有关原因的提示);
  • Zabbix agent命令行使用带--print(-p)选项将不显示配置为不允许的键值;
  • Zabbix agent命令行使用有--test(-t)选项将会显示配置不允许的键值为"Unsupported item key"状态;
  • 拒绝的远程命令不会记录在agent日志中(如果LogRemoteCommands=1)。

用例

拒绝特定检查
  • 使用 DenyKey 参数将特定检查列入黑名单。匹配到的键值将被禁止。所有未匹配到的键值都将被允许,除了system.run[] 监控项。

例如:

# 拒绝安全数据访问
       DenyKey=vfs.file.contents[/etc/passwd,*]

黑名单可能不是一个好的选择,因为新Zabbix 版本中,可能存在没有在当前配置中明确限制的键值,这可能会导致安全缺陷。

拒绝特定命令,允许其他的命令
  • 使用 DenyKey 参数将特定命令列入黑名单。使用 AllowKey 参数将其他命令全部列入白名单。
# 禁止特定命令
       DenyKey=system.run[ls -l /]
        
       # 允许其他脚本
       AllowKey=system.run[*]
允许特定检查,拒绝其他检查
  • 使用 AllowKey 参数将特定检查列入白名单,使用DenyKey=*拒绝其他检查 DenyKey=*

例如:

# 允许访问读日志:
       AllowKey=vfs.file.*[/var/log/*]
       
       # 允许本地时间检查
       AllowKey=system.localtime[*]
       
       # 拒绝所有其他键
       DenyKey=*

模式示例

模式 描述 匹配 不匹配
* 匹配所有可能的带或不带参数的键。 任何
vfs.file.contents 匹配不带参数的vfs.file.contents vfs.file.contents vfs.file.contents[/etc/passwd]
vfs.file.contents[] 匹配带有空参数的vfs.file.contents vfs.file.contents[] vfs.file.contents
vfs.file.contents[*] 匹配 vfs.file.contents 和任何参数;不匹配没有方括号的 vfs.file.contents vfs.file.contents[]
vfs.file.contents[/path/to/file]
vfs.file.contents
vfs.file.contents[/etc/passwd,*] 匹配 vfs.file.contents 与第一个参数匹配 /etc/passwd 和所有其他参数具有任何值(也可以为空)。 vfs .file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]
vfs.file.contents[/etc/passwd]
vfs. file.contents[/var/log/zabbix_server.log]
vfs.file.contents[]
vfs.file.contents[*passwd*] 匹配 vfs.file.contents,第一个参数匹配 *passwd* 而没有其他参数。 vfs.file.contents[/etc /passwd] vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd, utf8]
vfs.file.contents[*passwd*,*] 匹配 vfs.file.contents,只有第一个参数匹配 *passwd* 和所有后续参数具有任何值(也可以为空)。 vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd, utf8]
vfs.file.contents[/etc/passwd]<br >vfs.file.contents[/tmp/test]
vfs.file.contents[/var/log/zabbix_server.log,*,abc] 匹配 vfs.file.contents 与第一个参数匹配 /var/log/zabbix_server.log , 第三个参数匹配 'abc' 和任何(也可以为空)第二个参数。 vfs.file.contents[/var/log/zabbix_server.log,,abc]
vfs.file.contents[/ var/log/zabbix_server.log,utf8,abc]
vfs.file.contents[/var/log/zabbix_server.log,,abc,def]
vfs.file.contents[/etc/passwd,utf8] 匹配 vfs.file.contents,第一个参数匹配 /etc/passwd,第二个参数匹配 'utf8',没有其他参数。 vfs. file.contents[/etc/passwd,utf8] vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf16]
vfs.file.* 匹配任何以 vfs.file. 开头且不带任何参数的键。 vfs.file.contents
vfs.file.size
vfs.file.contents[]< br>vfs.file.size[/var/log/zabbix_server.log]
vfs.file.*[*] 匹配任何以 vfs.file. 开头的键和任何参数。 vfs.file.size.bytes[]
vfs.file.大小[/var/log/zabbix_server.log, utf8]
vfs.file.size.bytes
vfs.*.contents 匹配任何以 vfs. 开头并以 .contents 结尾且不带任何参数的键。 vfs.mount.point.file.contents
vfs..contents
vfs.contents

system.run 和 AllowKey

假设有一个“myscript.sh”这样脚本,它可以通过Zabbix agent以多种方式在主机上执行:

1.作为被动或主动检查中的项目键,例如:

  • system.run[myscript.sh]
  • system.run[myscript.sh,wait]
  • system.run[myscript.sh.nowait]

在这里,用户可以添加“wait”、“nowait”或省略第二个参数,使用system.run[]的默认值 。

2.作为全局脚本(由用户在前端或 API 中启动)。

用户在 AdministrationScripts 中配置此脚本,设置“在Zabbix agent上执行”并将“myscript.sh”放入脚本的“命令”输入字段。当从前端或 API 调用时,由Zabbix server发送到agent上:

  • system.run[myscript.sh,wait] - 最高到 Zabbix 5.0.4
  • system.run[myscript.sh] - 从 5.0.5 开始

这里用户不需要控制“wait”/“nowait”参数。

3.作为动作的远程命令。 Zabbix server发送到agent:

  • system.run[myscript.sh,nowait]

在这里,用户再次不控制“wait”/“nowait”参数。

这意味着如果我们将 AllowKey 设置为:

AllowKey=system.run[myscript.sh]

然后

  • system.run[myscript.sh] - 将被允许
  • system.run[myscript.sh,wait], system.run[myscript.sh,nowait]将不允许 - 如果作为行动步骤

要允许所有描述的变体,您可以添加:

AllowKey=system.run[myscript.sh,*]
       DenyKey=system.run[*]

到 agent/agent2 参数。