Il linguaggio di matching dietro una policy del firewall. Abbina le chiamate a tool per nome, skill, argomenti e destinazione — poi allow, audit, deny, sanitize, metti in attesa di approvazione o limita il costo. Deterministico, fail-closed e sicuro sull’hot path.
Una policy del firewall è un elenco ordinato di
regole. Questa pagina è il riferimento completo di ciò che una regola può
esprimere — il linguaggio di matching, i verdetti e come il motore le valuta.Le regole sono create nel rule editor della console, che scrive oggetti di match
JSON strutturati. Tutto ciò che segue descrive quel vocabolario così puoi leggere,
ragionare e verificare una regola con precisione — sia che tu la costruisca
nell’UI sia che tu la posti tramite l’API.
Config di redazione, usata quando verdict = sanitize. Vedi §5.
egress
object
Elenco allow/deny di host/CIDR, usato quando stage = egress. Vedi §6.
cap_cost_cents
int
Tetto al costo dell’esecuzione, usato quando verdict = cap_cost.
sequence
object
Match multi-step ordinato, applicato reattivamente. Vedi §8.
notes
string
Razionale dell’autore; ignorato dal motore.
Una regola corrisponde a una chiamata a tool quando tutte le sue condizioni
dichiarate valgono: lo stage corrisponde (o è vuoto), il glob del tool corrisponde,
il glob della skill corrisponde (o è vuoto), le clausole sugli argomenti
corrispondono (o sono assenti) e lo scope di egress corrisponde (solo regole
egress). Il motore percorre le regole in ordine di priorità e vince il primo
match.
Una grammatica deliberatamente piccola, case-sensitive — nessuna sorpresa da
regex, tempo lineare, sicura sull’hot path del relay:
Pattern
Corrisponde a
"" o *
Ogni tool.
foo.*
Prefisso — foo.bar, foo.exec (non il nudo foo).
*.exec
Suffisso — shell.exec, db.exec (non il nudo exec).
*.shell.*
Infisso — local.shell.exec (richiede ≥1 carattere per lato).
qualsiasi altra cosa
Corrispondenza esatta di stringa (incluso foo.*.bar).
I tool sono per convenzione namespacizzati server.tool o category.action,
quindi shell.* cattura un’intera famiglia e *.delete cattura un verbo tra i
server.
La stessa grammatica di glob, abbinata alla skill proprietaria della chiamata a
tool (es. community.*, builtin.send). È messa in AND con
tool_name_glob, quindi:
corrisponde a http.fetchsolo quando è di proprietà di una skill
community.* — fidati dello stesso tool da una skill integrata, mettilo sotto
controllo da una della community. Un glob di skill vuoto corrisponde a qualsiasi
proprietario. Come una chiamata a tool viene attribuita a una skill è trattato in
Skill.
Il matching sul nome del tool risponde a quale tool; le clausole sugli argomenti
rispondono a con quali argomenti — la differenza tra “blocca shell.exec” e
“blocca shell.exec solo quando il comando è rm -rf.”args_match è un insieme di clausole, tutte messe in AND tra loro:
Un piccolo sottoinsieme di JSONPath sull’oggetto degli argomenti del tool:
$.foo, $.foo.bar — accesso ai campi
$.foo[0], $.arr[1].k — indicizzazione di array
$ — l’intero oggetto degli argomenti
Nessun wildcard, filtro, slice o discesa ricorsiva.
Le clausole sugli argomenti fanno fail closed — la regola, non la richiesta. Se
un path non si risolve, gli argomenti sono malformati o una regex/CIDR è invalida,
la clausola valuta false e la regola semplicemente non scatta — la chiamata
ricade sulla regola successiva o sul verdetto di default. Una clausola rotta non
nega mai automaticamente e non manda mai in crash il relay. Scrivi la tua regola
“cattura tutto ciò che è pericoloso” come un deny esplicito con il proprio glob
anziché affidarti a una clausola che fallisce in un modo particolare.
La console valida le clausole in modo rigoroso al salvataggio (operatori
sconosciuti, path errati, valori in non-array, regex non compilabili e CIDR
invalidi vengono tutti rifiutati) così una clausola malformata non può essere
persistita in primo luogo.
Un verdetto sanitize redige le sottostringhe corrispondenti dagli argomenti del
tool e inoltra la chiamata ripulita — utile per rimuovere segreti o PII che un
agent ha messo in un argomento di tool senza bloccare l’intera azione.
I match dei preset vengono sostituiti con [redacted:<preset>]; i match della
regex custom con [redacted:custom]. La libreria di preset integrata:aws_access_key, aws_secret_key, openai_key, anthropic_key,
bearer_token, email, ssn_us, credit_card (con un controllo di Luhn).Una regola sanitize deve dichiarare almeno un preset o un pattern custom — un
sanitizer vuoto viene rifiutato al salvataggio. Sulla superficie inbound non ci
sono argomenti al momento della chiamata da redigere, quindi lì un verdetto sanitize
escala a un block.
Le voci corrispondono come un CIDR, un IP letterale o un hostname case-insensitive;
gli hostname vengono risolti best-effort e ri-controllati rispetto alle voci
IP/CIDR. La polarità segue il verdetto: con un verdetto allow l’elenco allow
definisce cosa è in scope e deny ne ritaglia le eccezioni; con un verdetto
applicativo (deny) l’elenco deny definisce cosa è bloccato e allow ne ritaglia
le eccezioni.169.254.169.254 (l’endpoint dei metadati cloud) e i range RFC-1918 sono le cose
canoniche da negare — il preset block_ssrf_egress e il
livello di autonomiatight forniscono esattamente quello.
Alcuni rischi sono visibili solo attraverso diverse chiamate — leggere 50 record
CRM, poi esportare, poi colpire un host esterno. Una regola sequence abbina una
catena ordinata anziché una singola chiamata:
Ogni step è un glob di tool con un min_count opzionale (default 1) e un
egress: true opzionale (lo step deve essere una chiamata egress). Gli step devono
verificarsi in ordine — l’interleaving con altre chiamate va bene — e l’intera
catena deve completarsi entro window_seconds (0 = nessun limite).
Le sequenze sono applicate reattivamente da un matcher asincrono, non inline su
ogni chiamata — una sequenza con uno step * corrisponderebbe altrimenti a ogni
singola chiamata a tool. Illuminano il feed degli eventi e possono innescare
un’azione successiva, ma non bloccano in tempo reale la singola chiamata che
completa la catena.
Vince il primo match. Le regole girano in ordine priority ASC, id ASC; la
prima regola le cui condizioni valgono tutte decide il verdetto. Nessuna regola
corrisponde → il default_verdict della policy.
Deterministico e privo di dipendenze. Il matching di glob e clausole sono
pure operazioni su stringhe/JSON senza chiamate di rete, sicuro da eseguire su
ogni chiamata a tool. Le regex sono RE2 — tempo lineare, nessun backtracking
catastrofico.
Clausole fail-closed. Una clausola che non può essere valutata fa non
scattare la sua regola anziché negare automaticamente
(§4).
Validazione rigorosa al salvataggio. Gli accoppiamenti verdetto/stage, la non
vacuità del sanitizer, la presenza di cap_cost_cents, la forma delle clausole e
la risoluzione dei ref vengono tutti controllati al salvataggio — le regole
invalide non possono essere persistite.
Sottoposto ad audit. Ogni create/update/delete di regola scrive una riga di
audit dopo il commit della modifica; i blob delle regole e i segreti non vengono
mai scritti nell’audit log.
Le regole vivono sotto una policy e hanno scope a livello di workspace; le
scritture richiedono Developer+.
Metodo & path
Ruolo
Scopo
POST /api/workspace/firewall/rules
Developer+
Crea una regola.
PUT /api/workspace/firewall/rules
Developer+
Aggiorna una regola (id nel body).
DELETE /api/workspace/firewall/rules/:id
Developer+
Elimina una regola.
GET /api/workspace/firewall/presets
Member
Elenca i preset integrati.
POST /api/workspace/firewall/test
Developer+
Esegue un dry-run di una policy (regole incluse) contro una chiamata a tool di esempio.
Per fare l’anteprima di una regola prima di dipenderne, usa Test — restituisce
il verdetto, la regola corrispondente e la motivazione senza dispatchare nulla.