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

Обзор

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

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

  • 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 или AllowKeyRegexp, чтобы разрешить только необходимые элементы данных, а DenyKey или DenyKeyRegexp — в качестве последнего правила, запрещающего все остальные. Это безопаснее, чем полагаться только на правила запрета, поскольку в новых версиях агента Zabbix могут появиться ключи элементов данных, на которые не распространяются ваши правила DenyKey или DenyKeyRegexp.

  • Делайте правила разрешения максимально конкретными: в правилах AllowKey используйте точные ключи элементов данных вместо подстановочных знаков (*), а в правилах AllowKeyRegexp — наиболее специфичные шаблоны регулярных выражений.

  • Если вы используете DenyKey или DenyKeyRegexp, запрещайте целые ключи элементов данных, а не отдельные файлы или команды. Правила, нацеленные на определенные параметры, можно обойти; например, обход пути (vfs.file.contents["../../../../etc/passwd"]) позволяет прочитать файл, доступ к которому должно было блокировать правило для его прямого пути. Подробнее см. в разделе Защита правил разрешения и запрета.

  • Все элементы данных system.run по умолчанию запрещены (даже если DenyKey и DenyKeyRegexp пусты), как если бы DenyKey=system.run[*] было задано в качестве последнего правила. Поэтому можно разрешить определенные элементы данных system.run, не запрещая явно остальные элементы данных system.run. Этот неявный запрет применяется только к system.run; для всех остальных ключей правила разрешения не действуют, если после них не следует правило запрета.

  • Конфигурация AllowKey, DenyKey, AllowKeyRegexp и DenyKeyRegexp не влияет на параметры агента HostnameItem, HostMetadataItem или HostInterfaceItem.

  • Запрещенные элементы данных становятся неподдерживаемыми без каких-либо указаний на то, что они были запрещены; они выглядят так же, как несуществующие ключи элементов данных. Например:

    • Параметр командной строки агента Zabbix --print (-p) не отображает запрещенные ключи элементов данных.
    • Параметр командной строки агента Zabbix --test (-t) возвращает Unsupported item key. для запрещенных ключей элементов данных.
    • При включенном журналировании (LogRemoteCommands=1) файл журнала агента Zabbix не регистрирует запрещенные удаленные команды.

Порядок правил allow/deny

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

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

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

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

Разрешите только две проверки vfs.file элементов данных и две команды 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\..*\[[\s\S]*\]$

Указывать 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,*]

или

AllowKeyRegexp=(?s)^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 и с помощью \s для AllowKeyRegexp или DenyKeyRegexp.

Эти правила содержат подстановочный символ (*), которым можно злоупотребить:

  • Скрипт test.bat можно выполнить с любыми аргументами, включая непредусмотренные.
  • Шаблон vfs.file.* соответствует ключам элементов данных без параметров, однако все элементы данных vfs.file требуют параметров.
  • Шаблон 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\..+\[[\s\S]*\]$
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]
Примеры шаблонов

В следующих таблицах показано, как сопоставляются шаблоны ключей элементов данных:

  • Ключ соответствует шаблону только в том случае, если он удовлетворяет всем условиям в столбце Соответствует.
  • Параметры должны быть полностью заключены в квадратные скобки (например, vfs.file.contents[* и vfs.file.contents*utf8] являются недопустимыми шаблонами).
  • Примеры иллюстрируют только сопоставление шаблонов; для фактических элементов данных требуются параметры.

Рекомендуется использовать AllowKey или AllowKeyRegexp, чтобы явно разрешить доступ только к необходимым файлам и командам, а DenyKey или DenyKeyRegexp — чтобы запретить целые ключи элементов данных (см. Важные примечания).

Использование правил на основе подстановочных знаков:

Шаблон Соответствует Примеры
* Любому ключу с параметрами или без них
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.file.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[/etc/passwd]

Не соответствует:
vfs.file.contents[]
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]

Использование правил на основе регулярных выражений:

Шаблон Соответствует Примеры
^[\s\S]*$ Любому ключу с параметрами или без них
^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\..*\[[\s\S]*\]$ Ключ начинается с 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\[[\s\S]*\]$ Ключ — vfs.file.contents
Любые или пустые параметры
Соответствует:
vfs.file.contents[/path/to/file]

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

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