Limitation des vérifications de l'agent
Vue d’ensemble
Vous pouvez contrôler les clés d’élément que l’agent Zabbix ou l’agent 2 est autorisé ou non à utiliser lors de l’exécution de vérifications d’éléments, de commandes à distance ou de scripts.
Pour ce faire, utilisez ces paramètres de configuration de l’agent afin de définir des règles d’autorisation ou de refus :
AllowKey=<pattern>DenyKey=<pattern>AllowKeyRegexp=<pattern>DenyKeyRegexp=<pattern>
Le <pattern> doit contenir une seule clé d’élément.
Pour AllowKey et DenyKey, le <pattern> prend en charge les caractères génériques (*).
Le caractère générique correspond à un nombre quelconque de caractères, quels qu’ils soient, à sa position, et peut être utilisé pour faire correspondre des clés d’élément ou des paramètres (par exemple, vfs.file.*[*]).
Pour AllowKeyRegexp et DenyKeyRegexp, le <pattern> prend en charge les expressions régulières.
Le modèle d’expression régulière peut être utilisé pour faire correspondre les clés d’élément et leurs chaînes de paramètres.
Consultez également les exemples d’échappement correct.
Notez que l’agent Zabbix et l’agent Zabbix 2 peuvent prendre en charge une syntaxe d’expression régulière différente.
Contrairement aux autres paramètres de configuration de l’agent, vous pouvez spécifier un nombre illimité de paramètres AllowKey, DenyKey, AllowKeyRegexp ou DenyKeyRegexp.
Remarques importantes
-
Utilisez
AllowKeyouAllowKeyRegexppour autoriser uniquement les éléments requis, etDenyKeyouDenyKeyRegexpcomme dernière règle pour refuser tous les autres. Cette approche est plus sûre que de s'appuyer uniquement sur des règles de refus, car les nouvelles versions de l'agent Zabbix peuvent introduire des clés d'élément qui ne sont pas couvertes par vos règlesDenyKeyouDenyKeyRegexp. -
Rendez les règles d'autorisation aussi spécifiques que possible : utilisez des clés d'élément exactes plutôt que des caractères génériques (
*) dans les règlesAllowKey, et utilisez les modèles d'expressions régulières les plus spécifiques dans les règlesAllowKeyRegexp. -
Si vous utilisez
DenyKeyouDenyKeyRegexp, refusez des clés d'élément entières plutôt que des fichiers ou des commandes spécifiques. Les règles qui ciblent des paramètres spécifiques peuvent être contournées ; par exemple, la traversée de chemin (vfs.file.contents["../../../../etc/passwd"]) peut lire un fichier qu'une règle destinée à bloquer son chemin direct devait empêcher. Pour plus de détails, consultez Sécurisation des règles d'autorisation et de refus. -
Tous les éléments
system.runsont refusés par défaut (même lorsqueDenyKeyetDenyKeyRegexpsont vides), comme siDenyKey=system.run[*]était défini comme dernière règle. Ainsi, vous pouvez autoriser des élémentssystem.runspécifiques sans refuser explicitement les autres élémentssystem.run. Ce refus implicite s'applique uniquement àsystem.run; pour toutes les autres clés, les règles d'autorisation n'ont aucun effet si aucune règle de refus ne les suit. -
La configuration de
AllowKey,DenyKey,AllowKeyRegexpetDenyKeyRegexpn'affecte pas les paramètres de l'agentHostnameItem,HostMetadataItemouHostInterfaceItem. -
Les éléments refusés deviennent non pris en charge sans indication qu'ils ont été refusés ; ils se comportent comme des clés d'élément inexistantes. Par exemple :
- Le paramètre de ligne de commande
--print (-p)de l'agent Zabbix n'affichera pas les clés d'élément refusées. - Le paramètre de ligne de commande
--test (-t)de l'agent Zabbix renverraUnsupported item key.pour les clés d'élément refusées. - Lorsque la journalisation est activée (
LogRemoteCommands=1), le fichier journal de l'agent Zabbix n'enregistrera pas les commandes distantes refusées.
- Le paramètre de ligne de commande
Ordre des règles allow/deny
Vous pouvez spécifier un nombre illimité de règles AllowKey, DenyKey, AllowKeyRegexp ou DenyKeyRegexp, bien que leur ordre soit important.
- Les règles sont évaluées une par une, de haut en bas.
- Lorsqu'une clé d'élément correspond à une règle, elle est soit autorisée, soit refusée, et l'évaluation des règles s'arrête.
Par exemple, lors de l'évaluation de vfs.file.contents[/etc/passwd], les règles sont traitées comme suit :
AllowKey=vfs.file.contents[/tmp/app.log] # Le modèle de clé d'élément ne correspond pas ; l'agent passe à la règle suivante.
AllowKey=vfs.file.contents[/etc/passwd] # Le modèle de clé d'élément correspond ; l'agent autorise la vérification de l'élément et arrête l'évaluation des règles.
DenyKey=vfs.file.*[*] # L'agent ignore la règle, car l'évaluation s'est arrêtée.
L'ordre de règles suivant refusera la vérification de l'élément :
DenyKey=vfs.file.*[*] # Le modèle de clé d'élément correspond ; l'agent refuse la vérification de l'élément et arrête l'évaluation des règles.
AllowKey=vfs.file.contents[/etc/passwd] # L'agent ignore la règle, car l'évaluation s'est arrêtée.
AllowKey=vfs.file.contents[/tmp/app.log] # L'agent ignore la règle, car l'évaluation s'est arrêtée.
Exemples
Les exemples suivants montrent des modèles de configuration courants pour AllowKey, DenyKey, AllowKeyRegexp et DenyKeyRegexp.
Autoriser des vérifications et des commandes spécifiques
Autoriser uniquement deux vérifications d’éléments vfs.file et deux commandes system.run :
avec AllowKey et 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.*[*]
avec AllowKeyRegexp et DenyKeyRegexp :
AllowKeyRegexp=^vfs\.file\.(contents|size)\[/tmp/app\.log\]$
AllowKeyRegexp=^system\.run\[/usr/bin/(uptime|df -h /)\]$
DenyKeyRegexp=^vfs\.file\..*\[[\s\S]*\]$
Il n’est pas nécessaire de définir DenyKey=system.run[*], car toutes les autres commandes system.run sont refusées par défaut (voir Remarques importantes).
Autoriser les scripts
Autorisez l’agent Zabbix à exécuter des scripts sur les hôtes via toutes les méthodes disponibles :
- Scripts globaux pouvant être exécutés dans l’interface ou via l’API (cette méthode utilise toujours la clé
system.run[myscript.sh]) - Commandes à distance provenant des opérations d’action (cette méthode utilise toujours la clé
system.run[myscript.sh,nowait]) - Éléments de l’agent Zabbix
system.runcontenant le script, par exemple :system.run[myscript.sh]system.run[myscript.sh,wait]system.run[myscript.sh,nowait]
AllowKey=system.run[myscript.sh,*]
ou
AllowKeyRegexp=(?s)^system\.run\[myscript\.sh,.*\]$
Pour contrôler le paramètre wait/nowait, vous devez définir une règle différente.
Par exemple, vous pouvez autoriser uniquement les éléments system.run[myscript.sh,wait], excluant ainsi les autres méthodes :
AllowKey=system.run[myscript.sh,wait]
ou
AllowKeyRegexp=^system\.run\[myscript\.sh,wait\]$
Sécurisation des règles allow/deny
Ces exemples montrent comment sécuriser des règles AllowKey/AllowKeyRegexp ou DenyKey/DenyKeyRegexp trop permissives.
Considérons les règles suivantes :
avec AllowKey et DenyKey :
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]
DenyKey=vfs.file.*
DenyKey=system.cpu.load[*]
avec AllowKeyRegexp et DenyKeyRegexp :
AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat.*"\]$
DenyKeyRegexp=^vfs\.file\..*$
DenyKeyRegexp=^system\.cpu\.load\[.*\]$
Sous Windows, vous devez échapper les espaces dans le chemin à l'aide d'un accent circonflexe (^) pour AllowKey ou DenyKey, et de \s pour AllowKeyRegexp ou DenyKeyRegexp.
Ces règles contiennent un caractère générique (*), qui peut être utilisé de manière abusive :
- Le script
test.batpeut être exécuté avec n'importe quels arguments, y compris des arguments indésirables. - Le modèle
vfs.file.*correspond aux clés d'élément sans paramètres ; cependant, tous les élémentsvfs.filenécessitent des paramètres. - Le modèle
system.cpu.load[*]correspond uniquement aux clés d'élément avec paramètres ; cependant, les élémentssystem.cpu.loadne nécessitent pas de paramètres.
Pour sécuriser ces règles, autorisez explicitement l'exécution de test.bat uniquement avec des arguments spécifiques et refusez les modèles de clés d'élément corrects ; par exemple :
avec AllowKey et 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[*]
avec AllowKeyRegexp et DenyKeyRegexp :
AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat (status|version)"\]$
DenyKeyRegexp=^vfs\.file\..+\[[\s\S]*\]$
DenyKeyRegexp=^system\.cpu\.load(\[.*\])?$
Vous pouvez tester les règles en exécutant les commandes suivantes, qui renverront 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]
Exemples de modèles
Les tableaux suivants montrent comment les modèles de clés d’élément sont mis en correspondance :
- Une clé correspond au modèle uniquement si elle respecte toutes les conditions de la colonne Correspondance.
- Les paramètres doivent être entièrement entourés de crochets (par exemple,
vfs.file.contents[*etvfs.file.contents*utf8]sont des modèles non valides). - Les exemples illustrent uniquement la mise en correspondance des modèles ; les éléments réels nécessitent des paramètres.
Il est recommandé d’utiliser AllowKey ou AllowKeyRegexp pour autoriser explicitement l’accès uniquement aux fichiers et commandes requis, et DenyKey ou DenyKeyRegexp pour refuser des clés d’élément entières (voir Remarques importantes).
Utilisation de règles basées sur des caractères génériques :
| Modèle | Correspondance | Exemples |
|---|---|---|
* |
Toute clé avec ou sans paramètres | |
vfs.file.* |
La clé commence par vfs.file.Sans paramètres |
Correspond :vfs.file.sizevfs.file.contentsNe correspond pas : vfs.file.contents[]vfs.file.size[/var/log/app.log] |
vfs.*.contents |
La clé commence par vfs.La clé se termine par .contentsSans paramètres |
Correspond : vfs..contentsvfs.file.contentsvfs.mount.point.file.contentsNe correspond pas : vfs.contentsvfs.file.contents[] |
vfs.file.*[*] |
La clé commence par vfs.file.Paramètres quelconques ou vides |
Correspondvfs.file.get.custom[]vfs.file.size[/var/log/app.log, utf8]Ne correspond pas : vfs.file.get.custom |
vfs.file.contents |
La clé est vfs.file.contentsSans paramètres |
Correspond :vfs.file.contentsNe correspond pas : vfs.file.contents[/etc/passwd] |
vfs.file.contents[] |
La clé est vfs.file.contents[]Paramètres vides |
Correspond :vfs.file.contents[]Ne correspond pas : vfs.file.contents |
vfs.file.contents[*] |
La clé est vfs.file.contentsParamètres quelconques ou vides |
Correspond :vfs.file.contents[/path/to/file]Ne correspond pas : vfs.file.contents |
vfs.file.contents[/etc/passwd,*] |
La clé est vfs.file.contentsLe premier paramètre est /etc/passwdParamètres supplémentaires quelconques, vides ou absents |
Correspond :vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]vfs.file.contents[/etc/passwd]Ne correspond pas : vfs.file.contents[] |
vfs.file.contents[*passwd*] |
La clé est vfs.file.contentsExactement un paramètre contenant passwd |
Correspond :vfs.file.contents[/etc/passwd]Ne correspond pas : vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8] |
vfs.file.contents[*passwd*,*] |
La clé est vfs.file.contentsLe premier paramètre contient passwdLe deuxième paramètre est quelconque ou vide |
Correspond :vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]vfs.file.contents[/etc/passwd]Ne correspond pas : vfs.file.contents[/tmp/test] |
vfs.file.contents[/etc/passwd,utf8] |
La clé est vfs.file.contentsLe premier paramètre est /etc/passwdLe deuxième paramètre est utf8 |
Correspond :vfs.file.contents[/etc/passwd,utf8]Ne correspond pas : vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf16] |
Utilisation de règles basées sur des expressions régulières :
| Modèle | Correspondance | Exemples |
|---|---|---|
^[\s\S]*$ |
Toute clé avec ou sans paramètres | |
^vfs\.file\.[^\[]*$ |
La clé commence par vfs.file.Sans paramètres |
Correspond :vfs.file.sizevfs.file.contentsNe correspond pas : vfs.file.contents[]vfs.file.size[/var/log/app.log] |
^vfs\..*\.contents$ |
La clé commence par vfs.La clé se termine par .contentsSans paramètres |
Correspond : vfs..contentsvfs.mount.point.file.contentsNe correspond pas : vfs.contentsvfs.file.contents[] |
^vfs\.file\..*\[[\s\S]*\]$ |
La clé commence par vfs.file.Paramètres quelconques ou vides |
Correspondvfs.file.get.custom[]vfs.file.size[/var/log/app.log, utf8]Ne correspond pas : vfs.file.get.custom |
^vfs\.file\.contents$ |
La clé est vfs.file.contentsSans paramètres |
Correspond :vfs.file.contentsNe correspond pas : vfs.file.contents[/etc/passwd] |
^vfs\.file\.contents\[\]$ |
La clé est vfs.file.contents[]Paramètres vides |
Correspond :vfs.file.contents[]Ne correspond pas : vfs.file.contents |
^vfs\.file\.contents\[[\s\S]*\]$ |
La clé est vfs.file.contentsParamètres quelconques ou vides |
Correspond :vfs.file.contents[/path/to/file]Ne correspond pas : vfs.file.contents |
^vfs\.file\.contents\[/etc/passwd,[\s\S]*\]$ |
La clé est vfs.file.contentsLe premier paramètre est /etc/passwdLe deuxième paramètre est quelconque ou vide |
Correspond :vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]Ne correspond pas : vfs.file.contents[]vfs.file.contents[/etc/passwd] |
^vfs\.file\.contents\[[\s\S]*passwd[\s\S]*\]$ |
La clé est vfs.file.contentsParamètres quelconques, dont au moins un contient passwd |
Correspond :vfs.file.contents[/etc/passwd]vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8] |
^vfs\.file\.contents\[[^,]*passwd[^,]*,[\s\S]*\]$ |
La clé est vfs.file.contentsLe premier paramètre contient passwdLe deuxième paramètre est quelconque ou vide |
Correspond :vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]Ne correspond pas : vfs.file.contents[/etc/passwd]vfs.file.contents[/tmp/test] |
^vfs\.file\.contents\[/etc/passwd,(utf8|windows-1252)\]$ |
La clé est vfs.file.contentsLe premier paramètre est /etc/passwdLe deuxième paramètre est utf8 ou windows-1252 |
Correspond :vfs.file.contents[/etc/passwd,utf8]vfs.file.contents[/etc/passwd,windows-1252]Ne correspond pas : vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf16] |