12. Ограничение проверок агента

Обзор

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

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

  • AllowKey=<шаблон>
  • DenyKey=<шаблон>

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

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

Важные правила

  • Все элементы данных system.run по умолчанию запрещены (даже когда DenyKey является пустым), как если бы последним правилом было добавлено 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) не будет показывать запрещённые ключи элементов данных.
    • Zabbix агент с параметром командной строки --test (-t) вернёт состояние «Unsupported item key.» (Неподдерживаемый ключ элемента данных) для запрещённых ключей элементов данных.
    • Zabbix агент не будет записывать в журнал агента отклонённые удалённые команды, если задано LogRemoteCommands=1.

Порядок правил Allow/Deny

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

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

Например, при проверке ключа 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.

Разрешение конкретных проверок и команд

Разрешить проверку только двух элементов данных vfs.file и двух команд 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 агенту выполнять скрипты на узле сети всеми доступными способами:

  • Глобальные скрипты, которые могут быть выполнены через веб-интерфейс или посредством API (этот метод всегда использует ключ system.run[myscript.sh])
  • Удалённые команды из операций действия (этот метод всегда использует ключ system.run[myscript.sh,nowait])
  • Элементы данных Zabbix агента system.run со скриптом, например:
    • 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]
Обеспечение безопасности разрешающих/запрещающих правил

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

Consider the following rules:

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] являются некорректными шаблонами).
Шаблон Соответствует Примеры
* Любой ключ с параметрами или без них.
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
Первый параметр — строка /etc/passwd
Любой второй параметр (в том числе пустой)
Соответствует:
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
Первый параметр содержит строку passwd
Второго параметра нет
Соответствует:
vfs.file.contents[/etc/passwd]

Не соответствует:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]
vfs.file.contents[*passwd*,*] Ключ — строка vfs.file.contents
Первый параметр содержит строку passwd
Любой второй параметр (в том числе пустой)
Соответствует:
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
Первый параметр — строка /etc/passwd
Второй параметр — строка utf8
Соответствует:
vfs.file.contents[/etc/passwd,utf8]

Не соответствует:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf16]