Ограничение проверок агента
Обзор
Вы можете управлять тем, какие ключи элементов данных разрешено или запрещено использовать агенту 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 не регистрирует запрещенные удаленные команды.
- Параметр командной строки агента 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.sizevfs.file.contentsНе соответствует: vfs.file.contents[]vfs.file.size[/var/log/app.log] |
vfs.*.contents |
Ключ начинается с vfs.Ключ заканчивается на .contentsБез параметров |
Соответствует: vfs..contentsvfs.file.contentsvfs.mount.point.file.contentsНе соответствует: vfs.contentsvfs.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.sizevfs.file.contentsНе соответствует: vfs.file.contents[]vfs.file.size[/var/log/app.log] |
^vfs\..*\.contents$ |
Ключ начинается с vfs.Ключ заканчивается на .contentsБез параметров |
Соответствует: vfs..contentsvfs.mount.point.file.contentsНе соответствует: vfs.contentsvfs.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] |