12 エージェントチェックの制限
概要
アイテムチェック、リモートコマンド、またはスクリプトの実行時に、Zabbixエージェントまたはagent 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エージェントの
Allow/denyルールの順序
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]は無効なパターンです)。
| Pattern | Matches | Examples |
|---|---|---|
* |
パラメータの有無にかかわらず任意のキー | |
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 である1番目のパラメータが /etc/passwd である2番目のパラメータが任意または空である |
一致: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 である1番目のパラメータに 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 である1番目のパラメータに 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 である1番目のパラメータが /etc/passwd である2番目のパラメータが utf8 である |
一致:vfs.file.contents[/etc/passwd,utf8]不一致: vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf16] |