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 AllowKey ou AllowKeyRegexp pour autoriser uniquement les éléments requis, et DenyKey ou DenyKeyRegexp comme 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ègles DenyKey ou DenyKeyRegexp.

  • 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ègles AllowKey, et utilisez les modèles d'expressions régulières les plus spécifiques dans les règles AllowKeyRegexp.

  • Si vous utilisez DenyKey ou DenyKeyRegexp, 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.run sont refusés par défaut (même lorsque DenyKey et DenyKeyRegexp sont vides), comme si DenyKey=system.run[*] était défini comme dernière règle. Ainsi, vous pouvez autoriser des éléments system.run spécifiques sans refuser explicitement les autres éléments system.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, AllowKeyRegexp et DenyKeyRegexp n'affecte pas les paramètres de l'agent HostnameItem, HostMetadataItem ou HostInterfaceItem.

  • 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 renverra Unsupported 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.

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.run contenant 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.bat peut ê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éments vfs.file nécessitent des paramètres.
  • Le modèle system.cpu.load[*] correspond uniquement aux clés d'élément avec paramètres ; cependant, les éléments system.cpu.load ne 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[* et vfs.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.size
vfs.file.contents

Ne correspond pas :
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
vfs.*.contents La clé commence par vfs.
La clé se termine par .contents
Sans paramètres
Correspond :
vfs..contents
vfs.file.contents
vfs.mount.point.file.contents

Ne correspond pas :
vfs.contents
vfs.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.contents
Sans paramètres
Correspond :
vfs.file.contents

Ne 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.contents
Paramè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.contents
Le premier paramètre est /etc/passwd
Paramè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.contents
Exactement 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.contents
Le premier paramètre contient passwd
Le 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.contents
Le premier paramètre est /etc/passwd
Le 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.size
vfs.file.contents

Ne correspond pas :
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
^vfs\..*\.contents$ La clé commence par vfs.
La clé se termine par .contents
Sans paramètres
Correspond :
vfs..contents
vfs.mount.point.file.contents

Ne correspond pas :
vfs.contents
vfs.file.contents[]
^vfs\.file\..*\[[\s\S]*\]$ 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.contents
Sans paramètres
Correspond :
vfs.file.contents

Ne 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.contents
Paramè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.contents
Le premier paramètre est /etc/passwd
Le 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.contents
Paramè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.contents
Le premier paramètre contient passwd
Le 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.contents
Le premier paramètre est /etc/passwd
Le 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]