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.run sont désactivés par défaut (même lorsque DenyKey et DenyKeyRegexp sont vides), comme si DenyKey=system.run[*] ou DenyKeyRegexp=^system\.run\[.*\]$ était défini comme dernière règle. De ce fait, vous pouvez autoriser des éléments system.run spécifiques sans interdire explicitement les autres éléments system.run.

  • Si possible, utilisez AllowKey/AllowKeyRegexp pour 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ègles DenyKey/DenyKeyRegexp.

  • La configuration AllowKey, DenyKey, AllowKeyRegexp et DenyKeyRegexp n'affecte pas les paramètres d'agent HostnameItem, HostMetadataItem ou HostInterfaceItem.

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

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.run de 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.bat peut ê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éments vfs.file né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é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 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[* et vfs.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.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
vfs.*.contents La clé commence par vfs.
La clé se termine par .contents
Aucun paramètre
Correspond à :
vfs..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
Aucun paramètre
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
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[*passwd*] 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*,*] 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] 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]

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.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
^vfs\..*\.contents$ La clé commence par vfs.
La clé se termine par .contents
Aucun paramètre
Correspond à :
vfs..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
Aucun paramètre
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
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\[.*passwd.*\]$ 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.*,.*\]$ 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]