12 Restriction des contrôles de l'agent
Aperçu
Vous pouvez contrôler quelles clés d'élément Zabbix agent ou agent 2 est autorisé ou interdit d'utiliser lors de l'exécution des vérifications d'élément, des commandes distantes ou des scripts.
Pour ce faire, utilisez ces paramètres de configuration de l'agent pour définir des règles d'autorisation/interdiction :
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 à n'importe quel nombre de caractères à 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 des clés d'élément et leurs chaînes de paramètres.
Voir aussi des exemples d'échappement correct.
Veuillez noter que Zabbix agent et Zabbix agent 2 peuvent prendre en charge une syntaxe d'expressions régulières différente.
Pour améliorer la sécurité, il est recommandé d'utiliser des clés d'élément exactes plutôt que des caractères génériques pour AllowKey et DenyKey.
Il est également recommandé d'utiliser les modèles d'expressions régulières les plus spécifiques pour AllowKeyRegexp et DenyKeyRegexp.
Pour plus de détails, voir Sécurisation des règles d'autorisation/interdiction.
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.
Notes importantes
-
Tous les éléments
system.runsont désactivés par défaut (même lorsqueDenyKeyetDenyKeyRegexpsont vides), comme siDenyKey=system.run[*]ouDenyKeyRegexp=^system\.run\[.*\]$était défini comme dernière règle. De ce fait, vous pouvez autoriser des élémentssystem.runspécifiques sans interdire explicitement les autres élémentssystem.run. -
Si possible, utilisez
AllowKey/AllowKeyRegexppour autoriser uniquement les éléments requis et refuser tout le reste. Certaines clés peuvent être exploitées pour lire des fichiers non prévus via une traversée de chemin (par exemple,vfs.file.contents["../../../../etc/passwd"]), et les nouvelles versions de l'agent Zabbix peuvent introduire des clés non couvertes par vos règlesDenyKey/DenyKeyRegexp. -
La configuration
AllowKey,DenyKey,AllowKeyRegexpetDenyKeyRegexpn'affecte pas les paramètres d'agentHostnameItem,HostMetadataItemouHostInterfaceItem. -
Les éléments refusés deviennent non pris en charge sans indication ni message d'erreur ; par exemple :
- La commande en ligne de commande de l'agent Zabbix
--print (-p)n'affichera pas les clés d'éléments refusées. - La commande en ligne de commande de l'agent Zabbix
--test (-t)renverra "Unsupported item key." pour les clés d'éléments refusées. - Lorsque la journalisation est activée (
LogRemoteCommands=1), le fichier journal de l'agent Zabbix n'enregistrera pas les commandes à distance refusées.
- La commande en ligne de commande de l'agent Zabbix
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
Autorisez uniquement deux vérifications d'élément vfs.file et deux commandes system.run :
en utilisant 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.*[*]
en utilisant AllowKeyRegexp et DenyKeyRegexp :
AllowKeyRegexp=^vfs\.file\.(contents|size)\[/tmp/app\.log\]$
AllowKeyRegexp=^system\.run\[/usr/bin/(uptime|df -h /)\]$
DenyKeyRegexp=^vfs\.file\..*\[.*\]$
Il est inutile de définir DenyKey=system.run[*] ou DenyKeyRegexp=^system\.run\[.*\]$, car toutes les autres commandes system.run sont refusées par défaut.
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 issues des opérations d'action (cette méthode utilise toujours la clé
system.run[myscript.sh,nowait]) - Éléments
system.runde l'agent Zabbix avec 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=^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érez les règles suivantes :
en utilisant AllowKey et DenyKey :
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]
DenyKey=vfs.file.*
DenyKey=system.cpu.load[*]
en utilisant 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 caret (^) pour AllowKey ou DenyKey, et de \s pour AllowKeyRegexp ou DenyKeyRegexp.
Ces règles contiennent un caractère générique (*) (ou .* pour les motifs basés sur des expressions régulières), qui peut être exploité de manière abusive :
- Le script
test.batpeut être exécuté avec n'importe quels arguments, y compris des arguments non souhaités. - Le motif
vfs.file.*(^vfs\.file\..*$) correspond à des clés d'élément avec ou sans paramètres ; cependant, tous les élémentsvfs.filenécessitent des paramètres. - Le motif
system.cpu.load[*](^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 motifs de clés d'élément corrects ; par exemple :
en utilisant 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[*]
en utilisant AllowKeyRegexp et DenyKeyRegexp :
AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat (status|version)"\]$
DenyKeyRegexp=^vfs\.file\..+\[.*\]$
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 motifs
Les tableaux suivants montrent comment les motifs de clé d'élément sont mis en correspondance :
- Une clé correspond au motif uniquement si elle satisfait à toutes les conditions de la colonne Matches.
- Les paramètres doivent être entièrement encadrés par des crochets (par exemple,
vfs.file.contents[*etvfs.file.contents*utf8]sont des motifs invalides). - Les exemples illustrent uniquement la correspondance des motifs ; les éléments réels nécessitent des paramètres.
Pour AllowKey et DenyKey :
| Pattern | Matches | Examples |
|---|---|---|
* |
Toute clé avec ou sans paramètres | |
vfs.file.* |
La clé commence par vfs.file.Avec ou sans paramètres |
Correspond à :vfs.file.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
vfs.*.contents |
La clé commence par vfs.La clé se termine par .contentsAucun paramètre |
Correspond à : vfs..contentsvfs.mount.point.file.contentsNe correspond pas à : vfs.contentsvfs.file.contents[] |
vfs.file.*[*] |
La clé commence par vfs.file.Paramètres quelconques ou vides |
Correspond àvfs.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.contentsAucun paramètre |
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/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[*passwd*] |
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*,*] |
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] |
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] |
Pour AllowKeyRegexp et DenyKeyRegexp :
| Pattern | Matches | Examples |
|---|---|---|
^.*$ |
Toute clé avec ou sans paramètres | |
^vfs\.file\..*$ |
La clé commence par vfs.file.Avec ou sans paramètres |
Correspond à :vfs.file.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
^vfs\..*\.contents$ |
La clé commence par vfs.La clé se termine par .contentsAucun paramètre |
Correspond à : vfs..contentsvfs.mount.point.file.contentsNe correspond pas à : vfs.contentsvfs.file.contents[] |
^vfs\.file\..*\[.*\]$ |
La clé commence par vfs.file.Paramètres quelconques ou vides |
Correspond àvfs.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.contentsAucun paramètre |
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/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\[.*passwd.*\]$ |
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.*,.*\]$ |
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] |