12 エージェントチェックの制限
概要
アイテムチェック、リモートコマンド、またはスクリプトの実行時に、Zabbix エージェントまたはエージェント 2 が使用を許可または禁止されるアイテムキーを制御できます。
そのためには、許可/拒否ルールを定義するために、次の agent configuration パラメータを使用します。
AllowKey=<pattern>DenyKey=<pattern>AllowKeyRegexp=<pattern>DenyKeyRegexp=<pattern>
<pattern> には単一のアイテムキーを含める必要があります。
AllowKey と DenyKey では、<pattern> はワイルドカード (*) をサポートします。
ワイルドカードは、その位置にある任意の数の任意の文字に一致し、アイテムキーまたはパラメータの一致に使用できます(例: vfs.file.*[*])。
AllowKeyRegexp と DenyKeyRegexp では、<pattern> は 正規表現 をサポートします。
正規表現パターンは、アイテムキーおよびそのパラメータ文字列の一致に使用できます。
正しいエスケープ の例も参照してください。
Zabbix エージェントと Zabbix エージェント 2 では、サポートされる正規表現の構文が異なる場合があることに注意してください。
セキュリティを向上させるため、AllowKey と DenyKey ではワイルドカードではなく正確なアイテムキーを使用することを推奨します。
また、AllowKeyRegexp と DenyKeyRegexp では、できるだけ具体的な正規表現パターンを使用することを推奨します。
詳細は、許可/拒否ルールの保護 を参照してください。
他のエージェント設定パラメータとは異なり、AllowKey、DenyKey、AllowKeyRegexp、DenyKeyRegexp パラメータは無制限に指定できます。
重要な注意事項
-
すべての
system.runアイテムはデフォルトで無効です(DenyKeyとDenyKeyRegexpが空の場合でも)。これは、DenyKey=system.run[*]またはDenyKeyRegexp=^system\.run\[.*\]$が 最後のルールとして設定されている場合と同じです。 そのため、他のsystem.runアイテムを明示的に拒否しなくても、特定のsystem.runアイテムのみを許可できます。 -
可能であれば、
AllowKey/AllowKeyRegexpを使用して必要なアイテムのみを許可し、それ以外はすべて拒否してください。 一部のキーは、パストラバーサルを通じて意図しないファイルを読み取るために悪用される可能性があります(例:vfs.file.contents["../../../../etc/passwd"])。また、新しい Zabbix エージェントのバージョンでは、DenyKey/DenyKeyRegexpルールでカバーされていないキーが追加される場合があります。 -
AllowKey、DenyKey、AllowKeyRegexp、およびDenyKeyRegexpの設定は、HostnameItem、HostMetadataItem、またはHostInterfaceItemのエージェントパラメータには影響しません。 -
拒否されたアイテムは、何のヒントやエラーメッセージもなくサポート対象外になります。たとえば、次のとおりです。
- Zabbix エージェントの
--print (-p)コマンドラインパラメータでは、拒否されたアイテムキーは表示されません。 - Zabbix エージェントの
--test (-t)コマンドラインパラメータでは、拒否されたアイテムキーに対して "Unsupported item key." が返されます。 - ログ記録が有効化されている場合(
LogRemoteCommands=1)、Zabbix エージェントのログファイルには拒否されたリモートコマンドは記録されません。
- Zabbix エージェントの
許可/拒否ルールの順序
AllowKey、DenyKey、AllowKeyRegexp、または DenyKeyRegexp のルールは無制限に指定できますが、順序が重要です。
- ルールは上から下へ、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、AllowKeyRegexp、DenyKeyRegexp の一般的な設定パターンを示します。
特定のチェックとコマンドを許可する
2つの vfs.file アイテムチェックと2つの system.run コマンドのみを許可します。
AllowKey と DenyKey を使用する場合:
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.*[*]
AllowKeyRegexp と DenyKeyRegexp を使用する場合:
AllowKeyRegexp=^vfs\.file\.(contents|size)\[/tmp/app\.log\]$
AllowKeyRegexp=^system\.run\[/usr/bin/(uptime|df -h /)\]$
DenyKeyRegexp=^vfs\.file\..*\[.*\]$
DenyKey=system.run[*] または DenyKeyRegexp=^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,*]
または
AllowKeyRegexp=^system\.run\[myscript\.sh,.*\]$
wait/nowait パラメーターを制御するには、別のルールを設定する必要があります。
たとえば、system.run[myscript.sh,wait] アイテムのみを許可し、他の方法を除外できます。
AllowKey=system.run[myscript.sh,wait]
または
AllowKeyRegexp=^system\.run\[myscript\.sh,wait\]$
Allow/deny ルールの保護
これらの例では、過度に許可範囲の広い AllowKey/AllowKeyRegexp または DenyKey/DenyKeyRegexp ルールを安全にする方法を示します。
次のルールを考えます。
AllowKey と DenyKey を使用する場合:
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]
DenyKey=vfs.file.*
DenyKey=system.cpu.load[*]
AllowKeyRegexp と DenyKeyRegexp を使用する場合:
AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat.*"\]$
DenyKeyRegexp=^vfs\.file\..*$
DenyKeyRegexp=^system\.cpu\.load\[.*\]$
Windows では、AllowKey または DenyKey ではパス内のスペースをキャレット (^) で、AllowKeyRegexp または DenyKeyRegexp では \s でエスケープする必要があります。
これらのルールにはワイルドカード (*)(正規表現ベースのパターンでは .*)が含まれており、悪用される可能性があります。
test.batスクリプトは、意図しないものを含む任意の引数で実行できます。vfs.file.*(^vfs\.file\..*$) パターンは、パラメータの有無にかかわらずアイテムキーに一致します。ただし、すべてのvfs.fileアイテムにはパラメータが必要です。system.cpu.load[*](^system\.cpu\.load\[.*\]$) パターンは、パラメータ付きのアイテムキーにのみ一致します。ただし、system.cpu.loadアイテムにはパラメータは不要です。
これらのルールを安全にするには、test.bat の実行を特定の引数に対してのみ明示的に許可し、正しいアイテムキーのパターンを拒否します。例えば、次のようにします。
AllowKey と DenyKey を使用する場合:
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[*]
AllowKeyRegexp と DenyKeyRegexp を使用する場合:
AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat (status|version)"\]$
DenyKeyRegexp=^vfs\.file\..+\[.*\]$
DenyKeyRegexp=^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]
パターンの例
以下の表は、アイテムキーのパターンがどのように一致するかを示しています。
- キーがパターンに一致するのは、Matches 列の すべて の条件を満たす場合のみです。
- パラメータは必ず角括弧で完全に囲む必要があります(例:
vfs.file.contents[*やvfs.file.contents*utf8]は無効なパターンです)。 - これらの例はパターン一致のみを示しており、実際のアイテムにはパラメータが必要です。
AllowKey と DenyKey の場合:
| Pattern | Matches | Examples |
|---|---|---|
* |
パラメータの有無にかかわらず、任意のキー | |
vfs.file.* |
キーが vfs.file. で始まるパラメータの有無にかかわらず |
Matches:vfs.file.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
vfs.*.contents |
キーが vfs. で始まるキーが .contents で終わるパラメータなし |
Matches: vfs..contentsvfs.mount.point.file.contentsDoes not match: vfs.contentsvfs.file.contents[] |
vfs.file.*[*] |
キーが vfs.file. で始まる任意のパラメータ、または空のパラメータ |
Matchesvfs.file.get.custom[]vfs.file.size[/var/log/app.log, utf8]Does not match: vfs.file.get.custom |
vfs.file.contents |
キーが vfs.file.contents であるパラメータなし |
Matches:vfs.file.contentsDoes not match: vfs.file.contents[/etc/passwd] |
vfs.file.contents[] |
キーが vfs.file.contents[] である空のパラメータ |
Matches:vfs.file.contents[]Does not match: vfs.file.contents |
vfs.file.contents[*] |
キーが vfs.file.contents である任意のパラメータ、または空のパラメータ |
Matches:vfs.file.contents[/path/to/file]Does not match: vfs.file.contents |
vfs.file.contents[/etc/passwd,*] |
キーが vfs.file.contents である1つ目のパラメータが /etc/passwd2つ目のパラメータは任意、または空 |
Matches:vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]Does not match: vfs.file.contents[]vfs.file.contents[/etc/passwd] |
vfs.file.contents[*passwd*] |
キーが vfs.file.contents である任意のパラメータで、少なくとも1つに passwd を含む |
Matches: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つ目のパラメータは任意、または空 |
Matches:vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]Does not match: vfs.file.contents[/etc/passwd]vfs.file.contents[/tmp/test] |
vfs.file.contents[/etc/passwd,utf8] |
キーが vfs.file.contents である1つ目のパラメータが /etc/passwd2つ目のパラメータが utf8 |
Matches:vfs.file.contents[/etc/passwd,utf8]Does not match: vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf16] |
AllowKeyRegexp と DenyKeyRegexp の場合:
| Pattern | Matches | Examples |
|---|---|---|
^.*$ |
パラメータの有無にかかわらず、任意のキー | |
^vfs\.file\..*$ |
キーが vfs.file. で始まるパラメータの有無にかかわらず |
Matches:vfs.file.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
^vfs\..*\.contents$ |
キーが vfs. で始まるキーが .contents で終わるパラメータなし |
Matches: vfs..contentsvfs.mount.point.file.contentsDoes not match: vfs.contentsvfs.file.contents[] |
^vfs\.file\..*\[.*\]$ |
キーが vfs.file. で始まる任意のパラメータ、または空のパラメータ |
Matchesvfs.file.get.custom[]vfs.file.size[/var/log/app.log, utf8]Does not match: vfs.file.get.custom |
^vfs\.file\.contents$ |
キーが vfs.file.contents であるパラメータなし |
Matches:vfs.file.contentsDoes not match: vfs.file.contents[/etc/passwd] |
^vfs\.file\.contents\[\]$ |
キーが vfs.file.contents[] である空のパラメータ |
Matches:vfs.file.contents[]Does not match: vfs.file.contents |
^vfs\.file\.contents\[.*\]$ |
キーが vfs.file.contents である任意のパラメータ、または空のパラメータ |
Matches:vfs.file.contents[/path/to/file]Does not match: vfs.file.contents |
^vfs\.file\.contents\[/etc/passwd,.*\]$ |
キーが vfs.file.contents である1つ目のパラメータが /etc/passwd2つ目のパラメータは任意、または空 |
Matches:vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]Does not match: vfs.file.contents[]vfs.file.contents[/etc/passwd] |
^vfs\.file\.contents\[.*passwd.*\]$ |
キーが vfs.file.contents である任意のパラメータで、少なくとも1つに passwd を含む |
Matches: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つ目のパラメータは任意、または空 |
Matches:vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]Does not match: vfs.file.contents[/etc/passwd]vfs.file.contents[/tmp/test] |
^vfs\.file\.contents\[/etc/passwd,(utf8|windows-1252)\]$ |
キーが vfs.file.contents である1つ目のパラメータが /etc/passwd2つ目のパラメータが utf8 または windows-1252 |
Matches:vfs.file.contents[/etc/passwd,utf8]vfs.file.contents[/etc/passwd,windows-1252]Does not match: vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf16] |