15 限制agent检查
概述
可以通过创建项目黑名单、白名单或白名单/黑名单的组合来限制agent的检查。
为此,请结合使用两个agent配置参数:
*''AllowKey=<pattern>''-允许哪些检查;<pattern>使用通配符(*)表达式指定
*''DenyKey=<pattern>''-拒绝哪些检查;<pattern>使用通配符(*)表达式指定
请注意:
- 在默认情况下,全部
system.run[*]项(远程命令、脚本)是禁用的,即使没有指定拒绝键; - 从Zabbix 5.0.2 agent参数EnableRemoteCommands:
<!-- -->
* deprecated Zabbix agent已经弃用
* unsupported Zabbix agent2不支持
因此,要允许所有远程命令,请指定AllowKey=system.run[*]参数。(在Zabbix 5.0.2版本前,agent配置中还需要EnableRemoteCommands=1。)
要仅允许某些远程命令,请创建更具体的AllowKey[]参数的白名单。要禁止特定的远程命令,请在AllowKey=system.run[*]之前添加DenyKey参数。
重要规则
- 没有拒绝规则的白名单只允许system.run[*]项。对于所有其它项,如果没有DenyKey参数,则不允许使用AllowKey参数;在这种情况下,Zabbix agent将不会仅使用AllowKey参数启动。
- 顺序很重要。指定参数在配置文件中按其出现顺序逐一检查:
- 一旦项键与允许/拒绝规则匹配,该项即被允许或拒绝;并且规则检查停止。因此,如果一个项同时匹配允许规则和拒绝规则,那么结果将取决于哪个规则排在第一位。
- 顺序还影响EnableRemoteCommands参数(如果使用)。
- 支持无限数量的AllowKey/DenyKey参数。
- AllowKey、DenyKey规则不影响HostnameItem、HostMetadataItem、HostInterfaceItem配置参数。
- 键模式是一个通配符表达式,其中通配符(*)与特定位置的任意数量的任意字符匹配。它可以用于关键字名称和参数。
- 如果在agent配置中不允许某个特定的项密钥,则该项将被报告为不受支持(没有给出有关原因的提示);
- 带有--print(-p)命令行选项的Zabbix agent将不显示配置不允许的密钥;
- 带有--test(-t)命令行选项的Zabbix agent将返回"Unsupported item key."配置不允许的键的状态;
- 拒绝的远程命令不会记录在agent日志中(如果LogRemoteCommands=1)。
用例
拒绝特定检查
*黑名单一个特定的检查与DenyKey参数。不允许匹配密钥。除system.run[]项外,允许使用所有不匹配的密钥。
例如:
# 拒绝安全数据访问
DenyKey=vfs.file.contents[/etc/passwd,*]
<note important>黑名单可能不是一个好的选择,因为新的Zabbix版本可能具有不受现有配置明确限制的新密钥。这可能会导致安全漏洞。 :::
拒绝特定命令,允许其它命令
- 使用DenyKey参数将特定命令列入黑名单。使用AllowKey参数白名单所有其它命令。
<!-- -->
# 不允许特定命令
DenyKey=system.run[ls -l /]
# 允许其它脚本
AllowKey=system.run[*]
允许特定检查,拒绝其它检查
- 使用AllowKey参数的白名单特定检查,使用
DenyKey=*拒绝其它检查
例如:
# 允许读取日志:
AllowKey=vfs.file.*[/var/log/*]
# 允许本地时间检查
AllowKey=system.localtime[*]
# 拒绝所有其它密钥
DenyKey=*
模式示例
| 模式 描 | 匹配 | 不匹配 | |
|---|---|---|---|
| * | 匹配所有可能的带参数或不带参数的键。 Any | None | |
| vfs.file.contents | 匹配vfs.file.contents没有参数。 vfs.fi |
e.contents vfs.fi | e.contents[/etc/passwd] |
| vfs.file.contents[] | 匹配vfs.file.contents具有空参数。 vfs.fil |
.contents[] vfs.fil | .contents |
| vfs.file.contents[*] | 匹配vfs.file.contents具有任何参数;将不匹配vfs.file.contents没有方括号。 vfs.file.contents |
]\ vfs.file.contentsvfs.file.contents[/path/to/file] | |
| vfs.file.contents[/etc/passwd,*] | 匹配vfs.file.contents的第一个参数与/etc/passwd匹配,所有其它参数都有任何值(也为空)。 vfs.file.contents[/etc/pass |
d,]\ vfs.file.contents[/etc/passvfs.file.contents[/etc/passwd,utf8] | d] 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]vfs.file.contents[/etc/passwd, utf8] | <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/zabbi |
_server.log,,abc]\ vfs.file.contents[/var/log/zabbivfs.file.contents[/var/log/zabbix_server.log,utf8,abc] | _server.log,,abc,def] |
| vfs.file.contents[/etc/passwd,utf8] | 匹配vfs.file.contents的第一个参数匹配/etc/passwd,第二个参数匹配“utf8”,没有其它参数。 vfs.file.contents[/etc/p |
sswd,utf8] vfs.file.contents[/etc/p | sswd,] vfs.file.contents[/etc/passwd,utf16] |
| vfs.file.* | 匹配以vfs.file.开头没有任何参数。 vfs.file.co |
tents\ vfs.file.covfs.file.size | tents[] vfs.file.size[/var/log/zabbix_server.log] |
| vfs.file.*[*] | 匹配以vfs.file.开头的任何键vfs.file文件任何参数。 vfs.file.size.b |
tes[]\ vfs.file.size.bvfs.file.size[/var/log/zabbix_server.log, utf8] | tes |
| vfs.*.contents | 匹配以vfs.开始并以.contents 结束不带任何参数的任何键。 vfs.mount.point.fil |
.contents\ vfs.contentsvfs..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/中配置此脚本,设置“Execute on:Zabbix agent”并放置myscript.sh文件输入到脚本的“Commands”输入字段。从前端或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参数。