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.
2. La grammaire des globs de nom d’outil
Letool_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).
* (ou vide) — matcher chaque outil
* (ou vide) — matcher chaque outil
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.foo.* — correspondance par préfixe
foo.* — correspondance par préfixe
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 — correspondance par suffixe
*.exec — correspondance par suffixe
*.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.*.X.* — correspondance médiane (infixe)
*.X.* — correspondance médiane (infixe)
*.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 le reste — correspondance exacte
tout le reste — 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.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.
Sous-ensemble JSONPath supporté
| Forme | Matche |
|---|---|
$.foo | Une clé de premier niveau. |
$.foo.bar | Une clé imbriquée. |
$.foo[0] | Un élément de tableau par index. |
$.arr[1].k | Index puis clé (combinaisons des précédents). |
$.*), 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érateur | Compare | Règles de type |
|---|---|---|
eq | Égalité exacte. | Typé : string↔string, bool↔bool, ou number↔number. Les types mixtes ne matchent jamais. |
contains | Contenance 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. |
regex | Un 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). |
in | Appartenance — 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_match | La 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. |
gt | Supé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). |
lt | Inférieur à, numérique. | Même règle numérique-seulement que gt. |
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é :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.
6. Règles d’egress (host / CIDR)
L’opérateurcidr_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.
