Passer au contenu principal
Une règle de firewall matche un appel d’outil sur deux axes : quel outil (un tool_name_glob) et quels arguments (des clauses args_match sur des champs JSONPath). Cette page est la grammaire précise des deux — ce qu’un motif matche, ce qu’il ne matche pas, et comment chaque opérateur coerce les types — afin qu’une règle que vous rédigez dans la console se comporte exactement comme vous la lisez ici. Le cas d’usage phare : transformer un grossier « bloquer shell.exec » en un chirurgical « bloquer shell.exec uniquement quand la commande ressemble à rm -rf ». Le glob choisit la famille d’outils ; les opérateurs d’argument choisissent l’appel dangereux à l’intérieur.
C’est la référence de syntaxe. Pour savoir où vivent ces clauses sur une règle, l’ordre des règles, et les verdicts, voir la référence approfondie des Règles du Firewall. Pour les champs de règle eux-mêmes, voir la vue d’ensemble Firewall.

1. Où cette syntaxe s’applique

Les deux formes sont rédigées sur une règle firewall, dans la console sous /console/firewall (les écritures requièrent Developer+). Vous n’appelez jamais le matcher directement — la passerelle l’évalue à chaque appel d’outil contre la politique résolue. Une règle matche quand sa surface, son tool_name_glob, son glob de skill optionnel, et ses clauses args_match matchent toutes ; la première correspondance gagne.
Une règle sans clause args_match matche sur le glob de nom d’outil seul. Ajoutez des clauses d’argument seulement quand le nom de l’outil n’est pas assez spécifique.

2. La grammaire des globs de nom d’outil

Le tool_name_glob est une grammaire délibérément petite et prévisible — pas un regex complet. Les motifs sont matchés en respectant la casse (les noms d’outils MCP sont conventionnellement en minuscules-avec-points, donc un repli de casse vous surprendrait quand vous copiez un nom depuis l’onglet Discovered tools).
Un motif vide ou un simple * matche tous les outils. Utilisez-le sur une règle fourre-tout, ou reposez-vous plutôt sur le default_verdict de la politique.
shell.* matche shell.exec, shell.read, shell.write. Il ne matche pas le simple shell (le point est requis — un glob de préfixe ne couvre que les enfants avec namespace).
*.exec matche le shell.exec avec namespace et le exec simple, sans namespace (les appels de fonction natifs du fournisseur et les serveurs MCP sans namespace exposent les outils sous le verbe simple, donc une règle de suffixe couvre les deux formes). Le suffixe reste ancré à un point ou au début de la chaîne, donc *.exec ne matche pas shell.execute.
*.shell.* matche toute forme <server>.shell.<verb>local.shell.exec, byo.shell.run. Il requiert au moins un caractère de chaque côté de l’infixe, donc *.shell.* ne matche pas le simple shell ni .shell. seul. Seule la forme symétrique *.X.* est traitée comme un infixe ; un motif mixte comme foo.*.bar retombe sur la correspondance exacte.
Tout motif qui n’est pas l’une des quatre formes wildcard ci-dessus (y compris un nom d’outil littéral, ou une combinaison malformée comme foo.*.bar) est comparé comme une chaîne exacte, sensible à la casse.
Il n’y a pas de wildcard mono-caractère ?, pas de classes de caractères, et pas de * en milieu de token (par ex. sh*l.exec). Un motif qui n’est pas l’une des quatre formes supportées est matché littéralement — sh*l.exec ne matche qu’un outil nommé littéralement sh*l.exec. Rédigez avec les formes ci-dessus, pas avec la mémoire musculaire du regex.

3. Clauses d’argument JSONPath

args_match est un ensemble de clauses, chacune un triplet {path, op, value}. Le path est un JSONPath dans l’objet d’arguments de l’appel d’outil ; op est l’un de sept opérateurs ; value est ce contre quoi comparer. Toutes les clauses d’une règle sont ET-ées ensemble — chaque clause doit matcher pour que la règle se déclenche.
{
  "clauses": [
    {"path": "$.command", "op": "regex", "value": "rm -rf|drop table"},
    {"path": "$.connection", "op": "in", "value": ["prod", "replica"]}
  ]
}

Sous-ensemble JSONPath supporté

FormeMatche
$.fooUne clé de premier niveau.
$.foo.barUne clé imbriquée.
$.foo[0]Un élément de tableau par index.
$.arr[1].kIndex puis clé (combinaisons des précédents).
C’est tout le sous-ensemble. Il n’y a pas de wildcards ($.*), de filtres ($.foo[?(...)]), de slices ($.foo[0:2]), ni de descente récursive ($..foo).
Fail-closed sur le chemin. Si le chemin d’une clause se résout en rien — la clé est manquante, les arguments ne sont pas du JSON valide, ou la valeur est du mauvais type pour l’opérateur — cette clause évalue à false, la règle ne se déclenche pas, et l’évaluation retombe sur la règle suivante ou le défaut de la politique. Un argument malformé ne refuse jamais automatiquement et ne plante jamais le moteur.

4. Opérateurs d’argument

Sept opérateurs, un ensemble fermé. Le validateur de console et le moteur en direct partagent exactement le même vocabulaire, donc une clause qui se sauvegarde est une clause qui s’exécute.
OpérateurCompareRègles de type
eqÉgalité exacte.Typé : string↔string, bool↔bool, ou number↔number. Les types mixtes ne matchent jamais.
containsContenance de sous-chaîne.Les deux côtés doivent être des strings ; tout le reste est un non-match. Une valeur vide matche n’importe quelle string.
regexUn motif RE2 (temps linéaire, pas de backreferences) contre une string.La valeur et l’arg résolu doivent tous deux être des strings. Un motif invalide désactive la clause (ne matche jamais).
inAppartenance — la valeur égale un élément quelconque d’une liste.La valeur doit être un tableau JSON ; chaque élément compare avec la sémantique eq.
cidr_matchLa valeur résolue est une IP à l’intérieur du réseau donné.La valeur est une string CIDR (IPv4 ou IPv6, par ex. 10.0.0.0/8, fd00::/8) ; l’arg doit se parser comme une IP.
gtSupérieur à, numérique.Les deux côtés doivent se coercer en un nombre. Une string d’allure numérique n’est pas coercée — c’est une non-correspondance de type (non-match).
ltInférieur à, numérique.Même règle numérique-seulement que gt.
gt et lt sont strictement numériques. Si un outil envoie {"max_rows": "10000"} (une string), une clause gt 5000 ne se déclenche pas — la string n’est jamais coercée. Comparez des nombres à des nombres ; utilisez regex ou contains pour les valeurs de forme string.

5. Un exemple travaillé

Bloquer un export de base de données destructeur, mais seulement quand il cible une connexion de production sur un hôte de réseau privé :
{
  "tool_name_glob": "db.*",
  "args_match": {
    "clauses": [
      {"path": "$.statement", "op": "regex", "value": "(?i)drop|truncate|delete from"},
      {"path": "$.connection.name", "op": "in", "value": ["prod", "prod-replica"]},
      {"path": "$.connection.host_ip", "op": "cidr_match", "value": "10.0.0.0/8"}
    ]
  }
}
Lisez-le de haut en bas : le glob db.* scope la règle à la famille d’outils de base de données ; les trois clauses se ET ensemble de sorte que le verdict (un deny, disons) se déclenche uniquement quand l’instruction est destructrice et que la connexion est l’une de deux cibles prod nommées et que son hôte tombe dans la plage privée 10.0.0.0/8. Un db.query contre une connexion de dev sur une IP publique passe à côté de cette règle intact.
Prouvez la clause avant de lui faire confiance : l’onglet Test sur une politique exécute en dry-run un appel d’outil d’échantillon et montre la règle correspondante et le verdict, ne persistant rien et ne dispatchant rien. Voir Observabilité du Firewall.

6. Règles d’egress (host / CIDR)

L’opérateur cidr_match ci-dessus matche une IP qu’un outil rapporte dans ses arguments. C’est différent d’une règle de surface egress, qui évalue la destination sortante qu’un outil atteint réellement avec une liste d’autorisation ou de refus host/CIDR — la défense principale contre le SSRF et l’exfiltration de données. Les règles d’egress utilisent la même notation CIDR mais vivent sur la surface egress ; voir Règles du Firewall pour le format de la liste d’egress.
Aucun preset ne livre de règles d’egress CIDR pour vous — le niveau d’autonomie tight refuse les noms d’outils courants de forme fetch (http_fetch, fetch_url, web_search, request), pas des plages réseau. Rédigez votre propre règle de refus host/CIDR quand vous avez besoin d’épingler l’egress à des destinations spécifiques.

7. Référence rapide

Formes de glob

* tout · foo.* préfixe · *.exec suffixe (+ verbe simple) · *.X.* infixe · tout le reste exact. Sensible à la casse.

JSONPath

$.foo · $.foo.bar · $.foo[0] · $.arr[1].k. Pas de wildcards, filtres, slices, ni descente récursive.

Opérateurs de string

eq (typé) · contains (sous-chaîne) · regex (RE2) · in (appartenance à une liste).

Opérateurs numériques & réseau

gt / lt (numérique uniquement, pas de coercion de string) · cidr_match (IPv4/IPv6 dans la plage).

Associés

Règles du Firewall

Le modèle de règle complet — surfaces, ordonnancement, assainisseurs, séquences, et listes d’egress.

Appels d'outils dangereux

La menace contre laquelle ces clauses défendent, et comment scoper une règle à celle-ci.

Glossaire des verdicts

Ce que allow, audit, deny, sanitize, et le reste font une fois qu’une règle matche.

Pourquoi a-ce été bloqué ?

Tracez un block spécifique jusqu’à la règle et la clause qui se sont déclenchées.