[comment]: # ({5024b934-780b1aa2})
# 12 エージェントチェックの制限

[comment]: # ({/5024b934-780b1aa2})

[comment]: # ({40953ae4-9de656b2})
#### 概要

アイテムチェック、リモートコマンド、またはスクリプトの実行時に、Zabbix エージェントまたは agent 2 が使用を許可または拒否されるアイテムキーを制御できます。

これを行うには、これらの[エージェント設定](/manual/appendix/config/zabbix_agentd)パラメータを使用して、許可/拒否ルールを定義します。

-   `AllowKey=<pattern>`
-   `DenyKey=<pattern>`

`<pattern>` には単一のアイテムキーを含める必要があり、ワイルドカード（`*`）をサポートします。
ワイルドカードは、その位置にある任意の文字を任意の数だけ一致させることができ、アイテムキーまたはパラメータの一致に使用できます（例: `vfs.file.*[*]`）。

::: noteimportant
セキュリティを向上させるため、ワイルドカードではなく正確なアイテムキーを使用することを推奨します。
詳細は、[許可/拒否ルールの保護](#securing-allowdeny-rules)を参照してください。
:::

他のエージェント設定パラメータとは異なり、`AllowKey` または `DenyKey` パラメータは無制限に指定できます。

[comment]: # ({/40953ae4-9de656b2})

[comment]: # ({6fa61f9f-3145c750})
#### 重要な注意事項

-   すべての [`system.run`](/manual/config/items/itemtypes/zabbix_agent/#system.run) アイテムは、デフォルトで無効になっています（`DenyKey` が空の場合でも）。これは、[最後のルール](#allowdeny-rule-order)として `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)`](/manual/concepts/agent#options)コマンドラインパラメータでは、拒否されたアイテムキーは表示されません。
    -   Zabbixエージェントの[`--test (-t)`](/manual/concepts/agent#options)コマンドラインパラメータでは、拒否されたアイテムキーに対して "Unsupported item key." が返されます。
    -   ログ記録が有効な場合（`LogRemoteCommands=1`）、Zabbixエージェントのログファイルには、拒否された[リモートコマンド](/manual/config/notifications/action/operation/remote_command)は記録されません。

[comment]: # ({/6fa61f9f-3145c750})

[comment]: # ({071aae59-66ec4bb8})
#### Allow/denyルールの順序

`AllowKey` または `DenyKey` ルールは無制限に指定できますが、その順序は重要です。

-   ルールは上から下へ、1つずつ評価されます。
-   アイテムキーがルールに一致すると、許可または拒否され、ルールの評価は停止します。

例えば、`vfs.file.contents[/etc/passwd]` を評価する場合、ルールは次のように処理されます。

```default
AllowKey=vfs.file.contents[/tmp/app.log]    # アイテムキーパターンが一致しないため、エージェントは次のルールに進みます。
AllowKey=vfs.file.contents[/etc/passwd]     # アイテムキーパターンが一致するため、エージェントはアイテムのチェックを許可し、ルールの評価を停止します。
DenyKey=vfs.file.*[*]                       # 評価が停止しているため、エージェントはこのルールを無視します。
```

次のルール順序では、アイテムのチェックは拒否されます。

```default
DenyKey=vfs.file.*[*]                       # アイテムキーパターンが一致するため、エージェントはアイテムのチェックを拒否し、ルールの評価を停止します。
AllowKey=vfs.file.contents[/etc/passwd]     # 評価が停止しているため、エージェントはこのルールを無視します。
AllowKey=vfs.file.contents[/tmp/app.log]    # 評価が停止しているため、エージェントはこのルールを無視します。
```

[comment]: # ({/071aae59-66ec4bb8})

[comment]: # ({cb10c569-253ad144})
#### 例

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

[comment]: # ({/cb10c569-253ad144})

[comment]: # ({0fd42e58-19895d10})
##### 特定のチェックとコマンドを許可する

2つの[`vfs.file`](/manual/config/items/itemtypes/zabbix_agent#vfs.file.cksum)アイテムチェックと2つの[`system.run`](/manual/config/items/itemtypes/zabbix_agent#system.run)コマンドのみを許可します。

```default
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.*[*]
```

::: noteclassic
`DenyKey=system.run[*]` を設定する必要はありません。これは、他のすべての `system.run` コマンドがデフォルトで拒否されるためです。
:::

[comment]: # ({/0fd42e58-19895d10})

[comment]: # ({b0df3494-3cc5f239})
##### スクリプトの許可

利用可能なすべての方法で、Zabbixエージェントがホスト上でスクリプトを実行できるようにします。

-   WebインターフェースまたはAPI経由で実行できる[グローバルスクリプト](/manual/web_interface/frontend_sections/alerts/scripts)（この方法では常に `system.run[myscript.sh]` キーを使用します）
-   [アクションの実行内容](/manual/config/notifications/action/operation#operation-details)からのリモートコマンド（この方法では常に `system.run[myscript.sh,nowait]` キーを使用します）
-   スクリプトを指定した[`system.run`](/manual/config/items/itemtypes/zabbix_agent#system.run) Zabbixエージェントのアイテム。例:
    -   `system.run[myscript.sh]`
    -   `system.run[myscript.sh,wait]`
    -   `system.run[myscript.sh,nowait]`

```default
AllowKey=system.run[myscript.sh,*]
```

`wait`/`nowait` パラメータを制御するには、別のルールを設定する必要があります。  
たとえば、`system.run[myscript.sh,wait]` アイテムのみを許可し、他の方法を除外できます。

```default
AllowKey=system.run[myscript.sh,wait]
```

[comment]: # ({/b0df3494-3cc5f239})

[comment]: # ({abfd7422-1965a7d7})
##### Allow/Denyルールの保護

この例では、過度に許可範囲の広い `AllowKey` または `DenyKey` ルールを安全にする方法を示します。

次のルールを考えてみましょう。

```default
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]
DenyKey=vfs.file.*
DenyKey=system.cpu.load[*]
```

::: noteclassic
Windowsでは、パス内のスペースをキャレット (`^`) を使用してエスケープする必要があります。
:::

これらのルールにはワイルドカード (`*`) が含まれており、悪用される可能性があります。

-   `test.bat` スクリプトは、意図しない引数を含む任意の引数付きで実行できてしまいます。
-   `vfs.file.*` パターンは、パラメータのないアイテムキーにのみ一致します。しかし、すべての [`vfs.file`](/manual/config/items/itemtypes/zabbix_agent#vfs.file.cksum) アイテムにはパラメータが必要です。
-   `system.cpu.load[*]` パターンは、パラメータ付きのアイテムキーにのみ一致します。しかし、[`system.cpu.load`](/manual/config/items/itemtypes/zabbix_agent#system.cpu.load) アイテムではパラメータは必須ではありません。

これらのルールを安全にするには、`test.bat` の実行を特定の引数の場合にのみ明示的に許可し、正しいアイテムキーパターンを拒否します。例えば、次のようにします。

```default
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` を返します。

```bash
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]
```

[comment]: # ({/abfd7422-1965a7d7})

[comment]: # ({23f78b84-16bccaff})
##### パターンの例

次の表は、アイテムキーのパターンがどのように一致するかを示しています。

-   キーがパターンに一致するのは、*一致条件* 列の**すべて**の条件を満たす場合のみです。
-   パラメータは必ず角括弧で完全に囲む必要があります（例: `vfs.file.contents[*` および `vfs.file.contents*utf8]` は無効なパターンです）。

|パターン|一致条件|例|
|--|----|----|
|`*`|パラメータの有無を問わない任意のキー| |
|`vfs.file.*`|キーが `vfs.file.` で始まる<br>パラメータなし|一致:<br>`vfs.file.size`<br>`vfs.file.contents`<br><br>不一致:<br>`vfs.file.contents[]`<br>`vfs.file.size[/var/log/app.log]`|
|`vfs.*.contents`|キーが `vfs.` で始まる<br>キーが `.contents` で終わる<br>パラメータなし|一致: <br>`vfs..contents`<br>`vfs.mount.point.file.contents`<br><br>不一致:<br>`vfs.contents`<br>`vfs.file.contents[]`|
|`vfs.file.*[*]`|キーが `vfs.file.` で始まる<br>任意または空のパラメータ|一致<br>`vfs.file.get.custom[]`<br>`vfs.file.size[/var/log/app.log, utf8]`<br><br>不一致:<br>`vfs.file.get.custom`|
|`vfs.file.contents`|キーが `vfs.file.contents` である<br>パラメータなし|一致:<br>`vfs.file.contents`<br><br>不一致:<br>`vfs.file.contents[/etc/passwd]`|
|`vfs.file.contents[]`|キーが `vfs.file.contents[]` である<br>空のパラメータ|一致:<br>`vfs.file.contents[]`<br><br>不一致:<br>`vfs.file.contents`|
|`vfs.file.contents[*]`|キーが `vfs.file.contents` である<br>任意または空のパラメータ|一致:<br>`vfs.file.contents[/path/to/file]`<br><br>不一致:<br>`vfs.file.contents`|
|`vfs.file.contents[/etc/passwd,*]`|キーが `vfs.file.contents` である<br>1番目のパラメータが `/etc/passwd` である<br>2番目のパラメータは任意または空|一致:<br>`vfs.file.contents[/etc/passwd,]`<br>`vfs.file.contents[/etc/passwd,utf8]`<br><br>不一致:<br>`vfs.file.contents[]`<br>`vfs.file.contents[/etc/passwd]`|
|`vfs.file.contents[*passwd*]`|キーが `vfs.file.contents` である<br>1番目のパラメータに `passwd` が含まれる<br>2番目のパラメータなし|一致:<br>`vfs.file.contents[/etc/passwd]`<br><br>不一致:<br>`vfs.file.contents[/etc/passwd,]`<br>`vfs.file.contents[/etc/passwd,utf8]`|
|`vfs.file.contents[*passwd*,*]`|キーが `vfs.file.contents` である<br>1番目のパラメータに `passwd` が含まれる<br>2番目のパラメータは任意または空|一致:<br>`vfs.file.contents[/etc/passwd,]`<br>`vfs.file.contents[/etc/passwd,utf8]`<br><br>不一致:<br>`vfs.file.contents[/etc/passwd]`<br>`vfs.file.contents[/tmp/test]`|
|`vfs.file.contents[/etc/passwd,utf8]`|キーが `vfs.file.contents` である<br>1番目のパラメータが `/etc/passwd` である<br>2番目のパラメータが `utf8` である|一致:<br>`vfs.file.contents[/etc/passwd,utf8]`<br><br>不一致:<br>`vfs.file.contents[/etc/passwd,]`<br>`vfs.file.contents[/etc/passwd,utf16]`|

[comment]: # ({/23f78b84-16bccaff})
