12 エージェントチェックの制限
概要
Zabbixエージェントまたはエージェント2がアイテムのチェック、リモートコマンド、スクリプトを実行する際に、どのアイテムキーを許可または拒否するかを制御できます。
そのためには、これらのエージェントの設定パラメータを使用して許可/拒否ルールを定義します:
AllowKey=<pattern>DenyKey=<pattern>
<pattern>には単一のアイテムキーを指定し、ワイルドカード(*)をサポートします。
ワイルドカードはその位置の任意の文字列にマッチし、アイテムキーやパラメータ(例: vfs.file.*[*])に使用できます。
セキュリティを向上させるために、ワイルドカードではなく正確なアイテムキーを使用することを推奨します。 詳細は許可/拒否ルールのセキュリティ強化を参照してください。
他のエージェント設定パラメータとは異なり、AllowKeyやDenyKeyパラメータは無制限に指定できます。
重要な注意事項
-
すべての
system.runアイテムはデフォルトで無効になっています(DenyKeyが空でも)、最後のルールとしてDenyKey=system.run[*]が設定されているかのように動作します。 そのため、他のsystem.runアイテムを明示的に拒否しなくても、特定のsystem.runアイテムのみを許可できます。 -
AllowKeyで指定したアイテムは、DenyKeyにも指定する必要があります(system.runアイテムを除く)。そうしないと、Zabbixエージェントは起動しません。 -
可能であれば、
AllowKeyで必要なアイテムのみを許可し、それ以外はすべて拒否してください。 一部のキーはパストラバーサル(例:vfs.file.contents["../../../../etc/passwd"])によって意図しないファイルを読み取るために悪用される可能性があり、新しいZabbixエージェントのバージョンではDenyKeyルールでカバーされていないキーが導入される場合があります。 -
AllowKeyおよびDenyKeyの設定は、エージェントパラメータHostnameItem、HostMetadataItem、HostInterfaceItemには影響しません。 -
拒否されたアイテムは、ヒントやエラーメッセージなしで未サポートとなります。例:
- Zabbixエージェントの
--print (-p)コマンドラインパラメータでは、拒否されたアイテムキーは表示されません。 - Zabbixエージェントの
--test (-t)コマンドラインパラメータでは、拒否されたアイテムキーに対して「Unsupported item key.」と返します。 LogRemoteCommands=1の場合、Zabbixエージェントのログファイルには拒否されたリモートコマンドは記録されません。
- Zabbixエージェントの
許可/拒否ルールの順序
AllowKeyまたはDenyKeyルールは無制限に指定できますが、その順序が重要です。
- ルールは上から下へ1つずつ評価されます。
- アイテムキーがルールに一致した場合、許可または拒否され、ルールの評価は停止します。
たとえば、vfs.file.contents[/etc/passwd]を評価する場合、ルールは次のように処理されます。
AllowKey=vfs.file.contents[/tmp/app.log] # アイテムキーのパターンが一致しないため、エージェントは次のルールに進みます。
AllowKey=vfs.file.contents[/etc/passwd] # アイテムキーのパターンが一致したため、エージェントはアイテムチェックを許可し、ルールの評価を停止します。
DenyKey=vfs.file.*[*] # 評価が停止したため、エージェントはこのルールを無視します。
次のルール順序では、アイテムチェックが拒否されます。
DenyKey=vfs.file.*[*] # アイテムキーのパターンが一致したため、エージェントはアイテムチェックを拒否し、ルールの評価を停止します。
AllowKey=vfs.file.contents[/etc/passwd] # 評価が停止したため、エージェントはこのルールを無視します。
AllowKey=vfs.file.contents[/tmp/app.log] # 評価が停止したため、エージェントはこのルールを無視します。
例
以下の例は、AllowKeyとDenyKeyの一般的な設定パターンを示しています。
特定のチェックとコマンドの許可
2つのvfs.fileアイテムチェックと2つのsystem.runコマンドのみを許可します:
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.*[*]
DenyKey=system.run[*]の設定は不要です。他のすべてのsystem.runコマンドはデフォルトで拒否されます。
スクリプトの許可
Zabbixエージェントがすべての利用可能な方法でホスト上でスクリプトを実行できるようにします:
- WebインターフェースまたはAPIで実行できるグローバルスクリプト(この方法では常に
system.run[myscript.sh]キーが使用されます) - アクションオペレーションからのリモートコマンド(この方法では常に
system.run[myscript.sh,nowait]キーが使用されます) - スクリプトを含む
system.runZabbixエージェントアイテム、例:system.run[myscript.sh]system.run[myscript.sh,wait]system.run[myscript.sh,nowait]
AllowKey=system.run[myscript.sh,*]
wait/nowaitパラメータを制御するには、別のルールを設定する必要があります。
たとえば、system.run[myscript.sh,wait]アイテムのみを許可し、他の方法を除外することができます:
AllowKey=system.run[myscript.sh,wait]
allow/denyルールのセキュリティ強化
この例では、過度に許可されたAllowKeyまたはDenyKeyルールをセキュリティ強化する方法を示します。
次のルールを考えてみましょう。
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]
DenyKey=vfs.file.*
DenyKey=system.cpu.load[*]
Windowsでは、パス内のスペースをキャレット(^)でエスケープする必要があります。
これらのルールにはワイルドカード(*)が含まれており、悪用される可能性があります。
test.batスクリプトは、意図しない引数を含む任意の引数で実行できます。vfs.file.*パターンは、パラメータのないアイテムキーにのみ一致します。ただし、すべてのvfs.fileアイテムにはパラメータが必要です。system.cpu.load[*]パターンは、パラメータ付きのアイテムキーにのみ一致します。ただし、system.cpu.loadアイテムにはパラメータは必要ありません。
これらのルールをセキュリティ強化するには、特定の引数でのみtest.batの実行を明示的に許可し、正しいアイテムキーパターンを拒否します。例えば:
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[*]
次のコマンドを実行してルールをテストできます。これらは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]
パターン例
次の表は、アイテムキーのパターンがどのように一致するかを示しています。
- キーは、一致する列のすべての条件を満たす場合にのみパターンに一致します。
- パラメータは必ず角括弧で完全に囲む必要があります(例:
vfs.file.contents[*やvfs.file.contents*utf8]は無効なパターンです)。
| パターン | 一致する条件 | 例 |
|---|---|---|
* |
パラメータの有無にかかわらず任意のキー | |
vfs.file.* |
vfs.file.で始まるキーパラメータなし |
一致:vfs.file.sizevfs.file.contents一致しない: vfs.file.contents[]vfs.file.size[/var/log/app.log] |
vfs.*.contents |
vfs.で始まるキー.contentsで終わるキーパラメータなし |
一致:vfs..contentsvfs.mount.point.file.contents一致しない: vfs.contentsvfs.file.contents[] |
vfs.file.*[*] |
vfs.file.で始まるキー任意または空のパラメータ |
一致:vfs.file.get.custom[]vfs.file.size[/var/log/app.log, utf8]一致しない: vfs.file.get.custom |
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[/path/to/file]一致しない: vfs.file.contents |
vfs.file.contents[/etc/passwd,*] |
キーがvfs.file.contents最初のパラメータが /etc/passwd2番目のパラメータが任意または空 |
一致:vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]一致しない: vfs.file.contents[]vfs.file.contents[/etc/passwd] |
vfs.file.contents[*passwd*] |
キーがvfs.file.contents最初のパラメータに passwdを含む2番目のパラメータなし |
一致:vfs.file.contents[/etc/passwd]一致しない: vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8] |
vfs.file.contents[*passwd*,*] |
キーがvfs.file.contents最初のパラメータに passwdを含む2番目のパラメータが任意または空 |
一致:vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]一致しない: vfs.file.contents[/etc/passwd]vfs.file.contents[/tmp/test] |
vfs.file.contents[/etc/passwd,utf8] |
キーがvfs.file.contents最初のパラメータが /etc/passwd2番目のパラメータが utf8 |
一致:vfs.file.contents[/etc/passwd,utf8]一致しない: vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf16] |