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 中启动)。
用户在 Administration → Scripts 中配置此脚本,设置“在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 参数。