[comment]: # translation:outdated

[comment]: # ({5024b934-780b1aa2})
# 12. Ограничение проверок агента

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

[comment]: # ({40953ae4-9de656b2})
#### Обзор

Можно управлять тем, какие ключи элементов данных Zabbix агенту или Zabbix агенту 2 резрешено или запрещено использовать при выполнении проверок элементов данных, удалённых команд или скриптов.

Чтобы это сделать, используйте эти параметры [конфигурации агента](/manual/appendix/config/zabbix_agentd) для для задания разрешающих/запрещающих правил:

-   `AllowKey=<шаблон>`
-   `DenyKey=<шаблон>`

`<Шаблон>` должен содержать один ключ элемента данных и поддерживает подстановочный знак (`*`).
Подстановочный знак соответствует любому количеству любых символов в данной позиции, и может использоваться для сопоставления как ключа элемента данных, так и параметров (например, `vfs.file.*[*]`).

::: noteimportant
Для улучшения безопасности рекомендуется использовать точные ключи элементов данных, а не подстановочные символы.
Более подробную информацию смотрите в разделе [Обеспечение безопасности разрешающих/запрещающих правил](#обеспечение-безопасности-разрешающихзапрещающих-правил).
:::

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

[comment]: # ({6fa61f9f-3145c750})
#### Важные правила

-   Все элементы данных [`system.run`](/manual/config/items/itemtypes/zabbix_agent/#system.run) по умолчанию запрещены (даже когда `DenyKey` является пустым), как если бы [последним правилом](#порядок-правил-allowdeny) было добавлено `DenyKey=system.run[*]`.
    Благодаря этому, вы можете разрешить конкретные элементы данных `system.run` без явного запрета остальных элементов данных `system.run`.

-   Элемент данных, указанный в `AllowKey`, также должен быть указан в `DenyKey` (за исключением элементов данных `system.run`); в противном случае Zabbix агент **не запустится**.

-   По возможности, используйте `AllowKey` для разрешения только нужных элементов данных и запретите всё остальное.
    Некоторые ключи могут быть злонамеренно использованы для чтения непредназначенных для этого файлов через так называемые обходные пути (path traversal) (например, `vfs.file.contents["../../../../etc/passwd"]`), а новые версии Zabbix агента могут вводить ключи, не покрываемые вашими правилами `DenyKey`.

-   Настройки `AllowKey` и `DenyKey` не влияют на параметры агента `HostnameItem`, `HostMetadataItem` и `HostInterfaceItem`.

-   Запрещённые элементы данных становятся неподдерживаемыми без указания причины или какого-либо сообщения об ошибке; например:
    -   Zabbix агент с параметром командной строки [`--print (-p)`](/manual/concepts/agent#опции) не будет показывать запрещённые ключи элементов данных.
    -   Zabbix агент с параметром командной строки [`--test (-t)`](/manual/concepts/agent#опции) вернёт состояние «Unsupported item key.» (Неподдерживаемый ключ элемента данных) для запрещённых ключей  элементов данных.
    -   Когда журналирование активировано (`LogRemoteCommands=1`), Zabbix агент не будет записывать в журнал агента отклонённые [удалённые команды](/manual/config/notifications/action/operation/remote_command).

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

[comment]: # ({071aae59-66ec4bb8})
#### Порядок правил Allow/Deny

Можно указать неограниченное количество правил `AllowKey` или `DenyKey`, но их порядок имеет значение.

-   Правила проверяются по очереди, сверху вниз.
-   Как только ключ элемента данных соответствует правилу, элемент данных разрешается или запрещается; а проверка правил прекращается.

Например, при проверке ключа `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})
##### Разрешение конкретных проверок и команд

Разрешить проверку только двух элементов данных [`vfs.file`](/manual/config/items/itemtypes/zabbix_agent#vfs.file.cksum) и двух команд [`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 агенту выполнять скрипты на узле сети всеми доступными способами:

-   [Глобальные скрипты](/manual/web_interface/frontend_sections/alerts/scripts), которые могут быть выполнены через веб-интерфейс или посредством API (этот метод всегда использует ключ `system.run[myscript.sh]`)
-   Удалённые команды из [операций действия](/manual/config/notifications/action/operation#детали-операций) (этот метод всегда использует ключ `system.run[myscript.sh,nowait]`)
-   Элементы данных Zabbix агента [`system.run`](/manual/config/items/itemtypes/zabbix_agent#system.run) со скриптом, например:
    -   `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})
##### Обеспечение безопасности разрешающих/запрещающих правил

В этом примере показано, как обезопасить чрезмерно разрешительные правила `AllowKey` или `DenyKey`.

Consider the following rules:

```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>Первый параметр — строка `/etc/passwd`<br>Любой второй параметр (в том числе пустой)|Соответствует:<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>Первый параметр содержит строку `passwd`<br>Второго параметра нет|Соответствует:<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>Первый параметр содержит строку `passwd`<br>Любой второй параметр (в том числе пустой)|Соответствует:<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>Первый параметр — строка `/etc/passwd`<br>Второй параметр — строка  `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})
