13 限制代理检查

概览

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

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

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

请注意:

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

因此,要允许所有远程命令,请指定AllowKey=system.run[*] 参数。 要允许部分远程命令,创建 system.run[] 命令指定的白名单。 要禁用指定的远程命令行,在AllowKey=system.run[*]参数前使用system.run[]命令增加 DenyKey 参数。

重要规则

  • 没有拒绝规则的白名单只允许 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[] 监控项。

例如:

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

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

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

例如:

  1. # 允许阅读日志:
  2. AllowKey=vfs.file.*[/var/log/*]
  3. # 允许本地时间检查
  4. AllowKey=system.localtime[*]
  5. # 拒绝所有其他键
  6. DenyKey=*

模式示例

模式描述匹配不匹配
匹配所有可能的带或不带参数的键。任何
vfs.file.contents匹配不带参数的vfs.file.contentsvfs.file.contentsvfs.file.contents[/etc/passwd]
vfs.file.contents[]匹配带有空参数的vfs.file.contentsvfs.file.contents[]vfs.file.contents
vfs.file.contents[]匹配 vfs.file.contents 和任何参数;不匹配没有方括号的 vfs.file.contentsvfs.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 代理以多种方式在主机上执行:

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发送到代理上:

  • 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 设置为:

  1. AllowKey=system.run[myscript.sh]

然后

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

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

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

到 agent/agent2 参数。