13 エージェントチェックの制限
概要
item のブラックリスト、ホワイトリスト、またはホワイトリストとブラックリストの組み合わせを作成することで、agent 側で
チェックを制限することができます。
そのためには、2 つの agent configuration パラメータを組み合わせて使用します。
AllowKey=<pattern>- どの検査を許可するか、<pattern> はワイルドカード (*) 式を使用して指定します。DenyKey=<pattern>- どの検査を拒否するか、<pattern> はワイルドカード (*) 式を使用して指定します。
なお:
- denyキーが指定されていない場合でも、すべてのsystem.run[*]`アイテム(リモートコマンド、スクリプト)はデフォルトで 無効化されます。
- Zabbix 5.0.2以降、EnableRemoteCommands agent パラメータは:
<!-- -->
* Zabbix agent では非推奨
* Zabbix agent 2ではサポートされていません
そのため、リモートコマンドを許可するには、許可するコマンドごとに AllowKey=system.run[<command>,*] を指定します
( * は wait および nowait モードを表します)。AllowKey=system.run[*] パラメータを指定すると、wait および nowait
モードを持つすべてのコマンドを許可することも可能です。特定のリモートコマンドを許可しないようにするには、
AllowKey=system.run[ *] パラメータの前に system.run[] コマンドを含む DenyKey パラメータを追加してください。
重要ルール
- deny ルールのないホワイトリストは、system.run[ *] アイテムに対してのみ許可されます。その他のアイテムでは、 DenyKey パラメータがない場合、AllowKey パラメータを使用することはできません。
- 順番は重要です。指定されたパラメータは、設定ファイル内の表示順に従って1つずつチェックされます:
- item キーが allow / deny ルールに一致すると、item は許可または拒否され、ルールチェックは停止されます。 したがって、ある item が allow ルールと deny ルールの両方にマッチした場合、どちらのルールが先に来るかによって 結果が異なります。
- この順序は、EnableRemoteCommands パラメータにも影響します。(使用する場合)
- AllowKey / DenyKey パラメータは無制限に使用できます。
- AllowKey、DenyKeyルールは、HostnameItem、HostMetadataItem、HostInterfaceItem 構成パラメータには影響しません。
- キーパターンは、ワイルドカード (*) 文字が特定の位置にある任意の数の文字と一致するワイルドカード式です。 キー名とパラメーターの両方で使用することができます。
- 特定の item キーが agent 構成で許可されていない場合、その item はサポートされていないと報告されます。 (理由のヒントは与えられません)。
- Zabbix agent に --print (-p) コマンドラインオプションを指定すると、設定により許可されていないキーは表示されません。
- Zabbix agent の--test(-t)コマンドラインオプションを使用すると、設定で許可されていないキーに対して "Unsupported item key."というステータスが返されます。
- 拒否されたリモートコマンドは agent ログに記録されません。(LogRemoteCommands=1 の場合)
Allow/deny rule order
You can specify an unlimited number of AllowKey or DenyKey rules, though their order matters.
- Rules are evaluated one by one, from top to bottom.
- When an item key matches a rule, it is either allowed or denied, and rule evaluation stops.
For example, when evaluating vfs.file.contents[/etc/passwd], the rules are processed as follows:
AllowKey=vfs.file.contents[/tmp/app.log] # Item key pattern does not match, agent proceeds to the next rule.
AllowKey=vfs.file.contents[/etc/passwd] # Item key pattern matches; agent allows the item check and stops rule evaluation.
DenyKey=vfs.file.*[*] # Agent ignores the rule, as the evaluation has stopped.
The following rule order will deny the item check:
DenyKey=vfs.file.*[*] # Item key pattern matches; agent denies the item check and stops rule evaluation.
AllowKey=vfs.file.contents[/etc/passwd] # Agent ignores the rule, as the evaluation has stopped.
AllowKey=vfs.file.contents[/tmp/app.log] # Agent ignores the rule, as the evaluation has stopped.
使用例
Allowing specific checks and commands
Allow only two vfs.file item checks and two system.run commands:
AllowKey=vfs.file.contents[/tmp/app.log]
AllowKey=vfs.file.size[/tmp/app.log]
AllowKey=system.run[/usr/bin/uptime]
AllowKey=system.run[/usr/bin/df -h /]
DenyKey=vfs.file.*[*]
Setting DenyKey=system.run[*] is unnecessary, because all other system.run commands are denied by default.
Allowing scripts
Allow Zabbix agent to execute scripts on hosts via all available methods:
- Global scripts that can be executed in the frontend or via API (this method always uses the
system.run[myscript.sh]key) - Remote commands from action operations (this method always uses the
system.run[myscript.sh,nowait]key) system.runZabbix agent items with the script, for example:system.run[myscript.sh]system.run[myscript.sh,wait]system.run[myscript.sh,nowait]
AllowKey=system.run[myscript.sh,*]
To control the wait/nowait parameter, you must set a different rule.
For example, you can allow only system.run[myscript.sh,wait] items, thus excluding other methods:
AllowKey=system.run[myscript.sh,wait]
Securing allow/deny rules
This example shows how to secure overly permissive AllowKey or DenyKey rules.
Consider the following rules:
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]
DenyKey=vfs.file.*
DenyKey=system.cpu.load[*]
On Windows, you must escape spaces in the path using a caret (^).
These rules contain a wildcard (*), which can be misused:
- The
test.batscript can be executed with any arguments, including unintended ones. - The
vfs.file.*pattern matches only item keys without parameters; however, allvfs.fileitems require parameters. - The
system.cpu.load[*]pattern matches only item keys with parameters; howeversystem.cpu.loaditems do not require parameters.
To secure these rules, explicitly allow executing test.bat only with specific arguments, and deny correct item key patterns; for example:
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat status"]
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat version"]
DenyKey=vfs.file.*[*]
DenyKey=system.cpu.load
DenyKey=system.cpu.load[*]
You can test the rules by running the following commands, which will return ZBX_NOTSUPPORTED.
cd "C:\Program Files\Zabbix Agent 2"
zabbix_agent2.exe -t system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat debug"]
zabbix_agent2.exe -t vfs.file.size["C:\ProgramData\MyApp\config.ini"]
zabbix_agent2.exe -t vfs.file.contents["C:\Windows\System32\drivers\etc\hosts"]
zabbix_agent2.exe -t system.cpu.load
zabbix_agent2.exe -t system.cpu.load[all,avg1]
パターンの例
| パターン | 説明 | 一致 | 非一致 |
|---|---|---|---|
| * | Matches all possible keys with or without parameters. | Any | None |
| vfs.file.contents | Matches vfs.file.contents without parameters. |
vfs.file.contents | vfs.file.contents[/etc/passwd] |
| vfs.file.contents[] | Matches vfs.file.contents with empty parameters. |
vfs.file.contents[] | vfs.file.contents |
| vfs.file.contents[*] | Matches vfs.file.contents with any parameters; will not match vfs.file.contents without square brackets. |
vfs.file.contents[] vfs.file.contents[/path/to/file] |
vfs.file.contents |
| vfs.file.contents[/etc/passwd,*] | Matches vfs.file.contents with first parameters matching /etc/passwd and all other parameters having any value (also empty). |
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*] | Matches vfs.file.contents with first parameter matching *passwd* and no other parameters. |
vfs.file.contents[/etc/passwd] | vfs.file.contents[/etc/passwd,] vfs.file.contents[/etc/passwd, utf8] |
| vfs.file.contents[*passwd*,*] | Matches vfs.file.contents with only first parameter matching *passwd* and all following parameters having any value (also empty). |
vfs.file.contents[/etc/passwd,] vfs.file.contents[/etc/passwd, utf8] |
vfs.file.contents[/etc/passwd] vfs.file.contents[/tmp/test] |
| vfs.file.contents[/var/log/zabbix_server.log,*,abc] | Matches vfs.file.contents with first parameter matching /var/log/zabbix_server.log, third parameter matching 'abc' and any (also empty) second parameter. |
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] | Matches vfs.file.contents with first parameter matching /etc/passwd, second parameter matching 'utf8' and no other arguments. |
vfs.file.contents[/etc/passwd,utf8] | vfs.file.contents[/etc/passwd,] vfs.file.contents[/etc/passwd,utf16] |
| vfs.file.* | Matches any keys starting with vfs.file. without any parameters. |
vfs.file.contents vfs.file.size |
vfs.file.contents[] vfs.file.size[/var/log/zabbix_server.log] |
| vfs.file.*[*] | Matches any keys starting with vfs.file. with any parameters. |
vfs.file.size.bytes[] vfs.file.size[/var/log/zabbix_server.log, utf8] |
vfs.file.size.bytes |
| vfs.*.contents | Matches any key starting with vfs. and ending with .contents without any parameters. |
vfs.mount.point.file.contents vfs..contents |
vfs.contents |