Passer au contenu principal
Une politique de firewall est une liste ordonnée de règles. Cette page est la référence complète de ce qu’une règle peut exprimer — le langage de correspondance, les verdicts, et comment le moteur les évalue. Les règles sont rédigées dans l’éditeur de règles de la console, qui écrit des objets de correspondance JSON structurés. Tout ce qui suit décrit ce vocabulaire afin que vous puissiez lire, raisonner et vérifier une règle précisément — que vous la construisiez dans l’UI ou que vous la postiez via l’API.

1. Anatomie d’une règle

ChampTypeSignification
priorityintPlus bas s’exécute en premier. Égalités tranchées par l’id de règle.
labelstringNom humain, affiché dans les événements et l’audit.
stageenumLa surfaceinbound / response / mcp / egress. Vide = toutes les surfaces.
tool_name_globstringGlob sur le nom de l’outil.
skill_name_globstringGlob optionnel sur le skill propriétaire. AND-é avec le glob d’outil ; vide = n’importe quel skill.
verdictenumL’action — voir §7.
args_matchobjectPrédicat d’argument optionnel.
sanitizeobjectConfig de redaction, utilisée lorsque verdict = sanitize. Voir §5.
egressobjectListe allow/deny de host/CIDR, utilisée lorsque stage = egress. Voir §6.
cap_cost_centsintPlafond de coût d’exécution, utilisé lorsque verdict = cap_cost.
sequenceobjectCorrespondance multi-étapes ordonnée, appliquée réactivement. Voir §8.
notesstringJustification de l’auteur ; ignorée par le moteur.
Une règle correspond à un appel d’outil lorsque toutes ses conditions déclarées sont vérifiées : le stage correspond (ou est vide), le glob d’outil correspond, le glob de skill correspond (ou est vide), les clauses d’arguments correspondent (ou sont absentes), et la portée d’egress correspond (règles egress uniquement). Le moteur parcourt les règles dans l’ordre de priorité et la première correspondance gagne.

2. Glob de nom d’outil

Une grammaire délibérément petite, sensible à la casse — pas de surprises de regex, temps linéaire, sûre sur le chemin à chaud du relais :
MotifCorrespond à
"" ou *Tous les outils.
foo.*Préfixe — foo.bar, foo.exec (pas foo seul).
*.execSuffixe — shell.exec, db.exec (pas exec seul).
*.shell.*Infixe — local.shell.exec (nécessite ≥1 caractère de chaque côté).
tout le resteCorrespondance de chaîne exacte (y compris foo.*.bar).
Les outils sont conventionnellement nommés en namespace server.tool ou category.action, donc shell.* attrape une famille entière et *.delete attrape un verbe à travers les serveurs.

3. Glob de nom de skill

La même grammaire de glob, mise en correspondance avec le skill propriétaire de l’appel d’outil (par exemple community.*, builtin.send). Il est AND-é avec tool_name_glob, donc :
tool_name_glob:  http.fetch
skill_name_glob: community.*
correspond à http.fetch seulement lorsqu’il appartient à un skill community.* — faites confiance au même outil depuis un skill intégré, verrouillez-le depuis un skill communautaire. Un glob de skill vide correspond à n’importe quel propriétaire. La façon dont un appel d’outil est attribué à un skill est couverte dans Skills.

4. Clauses d’arguments

La correspondance par nom d’outil répond quel outil ; les clauses d’arguments répondent avec quels arguments — la différence entre « bloquer shell.exec » et « bloquer shell.exec seulement quand la commande est rm -rf ». args_match est un ensemble de clauses, toutes AND-ées ensemble :
{
  "clauses": [
    { "path": "$.command",    "op": "regex",      "value": "rm -rf|drop table" },
    { "path": "$.connection", "op": "in",         "value": ["prod", "replica"] },
    { "path": "$.ip",         "op": "cidr_match", "value": "10.0.0.0/8" }
  ]
}
Un args_match vide / absent est vraie de manière vacueuse — la règle correspond sur le glob seul.

Opérateurs

OpérateurCorrespond lorsque
eqÉgalité scalaire (les nombres comparés numériquement ; incompatibilité de type → pas de correspondance).
containsSous-chaîne (les deux opérandes doivent être des chaînes).
regexUn motif Go RE2 correspond à la valeur chaîne (temps linéaire, sans backreferences).
inLa valeur est un élément du tableau JSON donné.
cidr_matchL’IP chaîne tombe à l’intérieur du CIDR donné.
gt / ltSupérieur / inférieur numérique (les chaînes ne sont pas coercées).

Syntaxe de chemin

Un petit sous-ensemble de JSONPath sur l’objet d’arguments de l’outil :
  • $.foo, $.foo.bar — accès à un champ
  • $.foo[0], $.arr[1].k — indexation de tableau
  • $ — l’objet d’arguments entier
Pas de wildcards, de filtres, de slices ni de descente récursive.
Les clauses d’arguments fail closed — la règle, pas la requête. Si un chemin ne se résout pas, que les arguments sont malformés, ou qu’une regex/CIDR est invalide, la clause s’évalue à false et la règle ne se déclenche tout simplement pas — l’appel retombe sur la règle suivante ou le verdict par défaut. Une clause cassée ne refuse jamais automatiquement et ne fait jamais planter le relais. Rédigez votre règle « attraper tout ce qui est dangereux » comme un deny explicite avec son propre glob plutôt que de compter sur une clause pour échouer d’une manière particulière.
La console valide les clauses strictement à l’enregistrement (opérateurs inconnus, mauvais chemins, valeurs in non-tableau, regexes non-compilables et CIDR invalides sont tous rejetés) afin qu’une clause malformée ne puisse pas être persistée en premier lieu.

5. Assainisseurs

Un verdict sanitize redacte les sous-chaînes correspondantes des arguments de l’outil et transmet l’appel nettoyé — utile pour retirer des secrets ou de la PII qu’un agent a mis dans un argument d’outil sans bloquer toute l’action.
{ "presets": ["email", "ssn_us"], "custom": ["foo-\\d+"] }
Les correspondances de preset sont remplacées par [redacted:<preset>] ; les correspondances de regex personnalisée par [redacted:custom]. La bibliothèque de presets intégrée : aws_access_key, aws_secret_key, openai_key, anthropic_key, bearer_token, email, ssn_us, credit_card (avec une vérification de Luhn). Une règle sanitize doit déclarer au moins un preset ou un motif personnalisé — un assainisseur vide est rejeté à l’enregistrement. Sur la surface inbound, il n’y a pas d’arguments au moment de l’appel à redacter, donc un verdict sanitize y escalade en un block.

6. Listes de destinations d’egress

Une règle egress (stage egress) correspond sur une destination sortante — la surface de SSRF et d’exfiltration :
{
  "deny":  ["169.254.169.254", "10.0.0.0/8"],
  "allow": ["api.openai.com"]
}
Les entrées correspondent comme un CIDR, un littéral IP, ou un nom d’hôte insensible à la casse ; les noms d’hôtes sont résolus au mieux et re-vérifiés contre les entrées IP/CIDR. La polarité suit le verdict : avec un verdict allow, la liste allow définit ce qui est dans la portée et deny y découpe des exceptions ; avec un verdict appliquant (deny), la liste deny définit ce qui est bloqué et allow y découpe des exceptions. 169.254.169.254 (l’endpoint de métadonnées cloud) et les plages RFC-1918 sont les choses canoniques à refuser — le preset block_ssrf_egress et le niveau d’autonomie tight livrent exactement cela.

7. Verdicts

VerdictEffetNotes
allowLaisse passer, journalisé.
auditAutorise + enregistre pour revue.Le default_verdict habituel.
denyBloque l’appel.HTTP 400 sur inbound ; erreur d’outil sur mcp.
sanitizeRedacte les arguments, transmet.Nécessite un assainisseur ; escalade en deny sur inbound.
pending_approvalMet en attente d’un humain.Nécessite le store d’approbation configuré ; rejeté sur response/egress.
cap_costRefuse au-delà d’un plafond de dépense.Nécessite un cap_cost_cents non-négatif ; inerte sur response/egress.
En mode shadow, chaque verdict appliquant est rétrogradé en audit et la raison est préfixée [shadow] would ….

8. Séquences

Certains risques ne sont visibles qu’à travers plusieurs appels — lire 50 enregistrements CRM, puis exporter, puis atteindre un hôte externe. Une règle sequence correspond à une chaîne ordonnée plutôt qu’à un seul appel :
{
  "window_seconds": 600,
  "steps": [
    { "match": "crm.*",   "min_count": 3 },
    { "match": "*.export" },
    { "match": "*",       "egress": true }
  ]
}
Chaque étape est un glob d’outil avec un min_count optionnel (défaut 1) et un egress: true optionnel (l’étape doit être un appel d’egress). Les étapes doivent se produire dans l’ordre — l’entrelacement avec d’autres appels est acceptable — et toute la chaîne doit se compléter dans window_seconds (0 = pas de borne).
Les séquences sont appliquées réactivement par un matcher asynchrone, pas en ligne sur chaque appel — une séquence avec une étape * correspondrait sinon à chaque appel d’outil. Elles éclairent le flux des événements et peuvent déclencher une action de suivi, mais elles ne bloquent pas en temps réel l’appel individuel qui complète la chaîne.

9. Presets intégrés

Partez d’un preset plutôt que d’une règle vierge. Ils sont rédigés côté serveur afin que la console et cette documentation décrivent un comportement identique :
PresetCe qu’il fait
block_destructive_shellRefuse les commandes shell destructrices (rm -rf, mkfs, dd, fork bombs, …) via un ensemble de règles deny-par-glob.
block_ssrf_egressAudite l’egress vers l’endpoint de métadonnées et les plages RFC-1918.
block_secrets_in_argsOrienté détection — signale les credentials apparaissant dans les arguments d’outils.
block_pii_in_tool_resultsOrienté détection — fait remonter la PII dans les résultats d’outils.
Appliquez un preset comme une graine, puis modifiez librement — un preset est un point de départ, pas un verrou.

10. Évaluation, limites & sécurité

  • La première correspondance gagne. Les règles s’exécutent dans l’ordre priority ASC, id ASC ; la première règle dont toutes les conditions sont vérifiées décide du verdict. Aucune règle ne correspond → le default_verdict de la politique.
  • Déterministe et sans dépendance. La correspondance de glob et de clause sont de pures opérations sur chaînes/JSON sans appel réseau, sûres à exécuter sur chaque appel d’outil. Les regexes sont RE2 — temps linéaire, sans backtracking catastrophique.
  • Clauses fail-closed. Une clause qui ne peut pas être évaluée fait que sa règle ne se déclenche pas plutôt que de refuser automatiquement (§4).
  • Validation stricte à l’enregistrement. Les appariements verdict/stage, la non-vacuité de l’assainisseur, la présence de cap_cost_cents, la forme des clauses et la résolution des références sont tous vérifiés lorsque vous enregistrez — les règles invalides ne peuvent pas être persistées.
  • Audité. Chaque création/mise à jour/suppression de règle écrit une ligne d’audit après le commit du changement ; les blobs de règles et les secrets ne sont jamais écrits dans le journal d’audit.

Référence API

Les règles vivent sous une politique et sont à portée d’espace de travail ; les écritures nécessitent Developer+.
Méthode & cheminRôleObjectif
POST /api/workspace/firewall/rulesDeveloper+Créer une règle.
PUT /api/workspace/firewall/rulesDeveloper+Mettre à jour une règle (id dans le corps).
DELETE /api/workspace/firewall/rules/:idDeveloper+Supprimer une règle.
GET /api/workspace/firewall/presetsMemberLister les presets intégrés.
POST /api/workspace/firewall/testDeveloper+Exécuter en dry-run une politique (règles incluses) contre un appel d’outil d’échantillon.
Pour prévisualiser une règle avant d’en dépendre, utilisez Test — il renvoie le verdict, la règle correspondante et la raison sans rien dispatcher.

Voir aussi

Vous souhaitez approfondir la sécurité des agents ? Les guides Sécurisez vos agents (Zero Trust) replacent cette fonctionnalité dans un workflow zero-trust.

Construire une politique de pare-feu

Rédigez une politique zero-trust étape par étape, puis testez-la en mode observation avant de l’appliquer.

Référence du schéma de règles

Chaque champ de règle — globs, prédicats d’arguments, sorties et plafonds de coût.