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 の設定は、HostnameItemHostMetadataItemHostInterfaceItem のエージェントパラメータには影響しません。

  • 拒否されたアイテムは、ヒントやエラーメッセージなしで未サポートになります。例えば:

    • Zabbixエージェントの --print (-p) コマンドラインパラメータでは、拒否されたアイテムキーは表示されません。
    • Zabbixエージェントの --test (-t) コマンドラインパラメータでは、拒否されたアイテムキーに対して "Unsupported item key." が返されます。
    • ログ記録が有効な場合(LogRemoteCommands=1)、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]    # 評価が停止しているため、エージェントはこのルールを無視します。

以下の例は、AllowKeyDenyKey の一般的な設定パターンを示しています。

特定のチェックとコマンドを許可する

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.run Zabbixエージェントのアイテム。例:
    • 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.size
vfs.file.contents

不一致:
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
vfs.*.contents キーが vfs. で始まる
キーが .contents で終わる
パラメータなし
一致:
vfs..contents
vfs.mount.point.file.contents

不一致:
vfs.contents
vfs.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]