Saltar al contenido principal
Una regla del firewall coincide con una llamada a herramienta en dos ejes: qué herramienta (un tool_name_glob) y qué argumentos (cláusulas args_match sobre campos JSONPath). Esta página es la gramática precisa de ambos — qué coincide un patrón, qué no, y cómo cada operador coacciona tipos — para que una regla que autoras en la consola se comporte exactamente como la lees aquí. El caso de uso titular: convertir un romo “bloquear shell.exec” en un quirúrgico “bloquear shell.exec solo cuando el comando parece rm -rf”. El glob elige la familia de herramienta; los operadores de argumento eligen la llamada peligrosa dentro de ella.
Esta es la referencia de sintaxis. Para saber dónde viven estas cláusulas en una regla, el orden de reglas y los veredictos, ve la referencia profunda de Reglas del firewall. Para los campos de regla en sí, ve la visión general de Firewall.

1. Dónde aplica esta sintaxis

Ambas formas se autoran en una regla de firewall, en la consola bajo /console/firewall (las escrituras requieren Developer+). Nunca llamas al matcher directamente — el gateway lo evalúa en cada llamada a herramienta contra la política resuelta. Una regla coincide cuando su superficie, su tool_name_glob, su glob de skill opcional, y sus cláusulas args_match coinciden todos; gana la primera coincidencia.
Una regla sin cláusulas args_match coincide solo por el glob de nombre de herramienta. Añade cláusulas de argumento solo cuando el nombre de la herramienta no es lo bastante específico.

2. Gramática de glob de nombre de herramienta

El tool_name_glob es una gramática deliberadamente pequeña y predecible — no un regex completo. Los patrones se coinciden distinguiendo mayúsculas/minúsculas (los nombres de herramienta MCP son convencionalmente minúsculas-con-puntos, así que un plegado de mayúsculas te sorprendería cuando copias un nombre de la pestaña Discovered tools).
Un patrón vacío o un * solo coinciden con todas las herramientas. Úsalo en una regla catch-all, o confía en el default_verdict de la política en su lugar.
shell.* coincide con shell.exec, shell.read, shell.write. No coincide con el shell desnudo (el punto es requerido — un glob de prefijo solo cubre hijos con espacio de nombres).
*.exec coincide con el shell.exec con espacio de nombres y con el exec desnudo, sin espacio de nombres (las llamadas a función nativas del proveedor y los servidores MCP que no usan espacios de nombres exponen herramientas bajo el verbo desnudo, así que una regla de sufijo cubre ambas formas). El sufijo permanece anclado en un punto o el inicio de la cadena, así que *.exec no coincide con shell.execute.
*.shell.* coincide con cualquier forma <server>.shell.<verb>local.shell.exec, byo.shell.run. Requiere al menos un carácter a cada lado del infijo, así que *.shell.* no coincide con el shell desnudo ni con .shell. solo. Solo la forma simétrica *.X.* se trata como un infijo; un patrón mixto como foo.*.bar cae a coincidencia exacta.
Cualquier patrón que no sea una de las cuatro formas comodín de arriba (incluyendo un nombre de herramienta literal, o un combo malformado como foo.*.bar) se compara como una cadena exacta, distinguiendo mayúsculas/minúsculas.
No hay comodín de un solo carácter ?, ni clases de caracteres, ni * a mitad de token (p. ej. sh*l.exec). Un patrón que no es una de las cuatro formas soportadas se coincide literalmente — sh*l.exec solo coincide con una herramienta literalmente llamada sh*l.exec. Autora con las formas de arriba, no con memoria muscular de regex.

3. Cláusulas de argumento JSONPath

args_match es un conjunto de cláusulas, cada una un triple {path, op, value}. El path es un JSONPath dentro del objeto de argumentos de la llamada a herramienta; op es uno de siete operadores; value es contra qué comparar. Todas las cláusulas en una regla se AND-ean juntas — cada cláusula debe coincidir para que la regla se dispare.
{
  "clauses": [
    {"path": "$.command", "op": "regex", "value": "rm -rf|drop table"},
    {"path": "$.connection", "op": "in", "value": ["prod", "replica"]}
  ]
}

Subconjunto de JSONPath soportado

FormaCoincide
$.fooUna clave de nivel superior.
$.foo.barUna clave anidada.
$.foo[0]Un elemento de array por índice.
$.arr[1].kÍndice luego clave (combinaciones de lo anterior).
Ese es el subconjunto entero. No hay comodines ($.*), filtros ($.foo[?(...)]), slices ($.foo[0:2]) ni descenso recursivo ($..foo).
Fail-closed en el path. Si el path de una cláusula resuelve a nada — la clave falta, los argumentos no son JSON válido, o el valor es del tipo equivocado para el operador — esa cláusula evalúa a false, la regla no se dispara, y la evaluación cae a la siguiente regla o al valor por defecto de la política. Un argumento malformado nunca auto-deniega y nunca tumba el motor.

4. Operadores de argumento

Siete operadores, un conjunto cerrado. El validador de la consola y el motor en vivo comparten exactamente el mismo vocabulario, así que una cláusula que se guarda es una cláusula que se ejecuta.
OperadorComparaReglas de tipo
eqIgualdad exacta.Tipado: string↔string, bool↔bool, o number↔number. Los tipos mixtos nunca coinciden.
containsContención de subcadena.Ambos lados deben ser strings; cualquier otra cosa es una no-coincidencia. Un valor vacío coincide con cualquier string.
regexUn patrón RE2 (tiempo lineal, sin retrorreferencias) contra un string.El valor y el arg resuelto deben ser ambos strings. Un patrón inválido deshabilita la cláusula (nunca coincide).
inPertenencia — el valor es igual a cualquier elemento de una lista.El valor debe ser un array JSON; cada elemento compara con semántica eq.
cidr_matchEl valor resuelto es una IP dentro de la red dada.El valor es una cadena CIDR (IPv4 o IPv6, p. ej. 10.0.0.0/8, fd00::/8); el arg debe parsearse como una IP.
gtMayor-que, numérico.Ambos lados deben coaccionar a un número. Un string de apariencia numérica no se coacciona — es una discrepancia de tipo (no-coincidencia).
ltMenor-que, numérico.Misma regla solo-numérica que gt.
gt y lt son estrictamente numéricos. Si una herramienta envía {"max_rows": "10000"} (un string), una cláusula gt 5000 no se dispara — el string nunca se coacciona. Compara números contra números; usa regex o contains para valores con forma de string.

5. Un ejemplo trabajado

Bloquea una exportación de base de datos destructiva, pero solo cuando apunta a una conexión de producción sobre un host de red privada:
{
  "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"}
    ]
  }
}
Léelo de arriba abajo: el glob db.* acota la regla a la familia de herramientas de base de datos; las tres cláusulas se AND-ean juntas así que el veredicto (un deny, digamos) se dispara solo cuando la sentencia es destructiva y la conexión es uno de dos destinos prod nombrados y su host cae en el rango privado 10.0.0.0/8. Una db.query contra una conexión de dev en una IP pública pasa de largo esta regla sin tocar.
Prueba la cláusula antes de confiar en ella: la pestaña Test en una política ejecuta en seco una llamada a herramienta de muestra y muestra la regla coincidente y el veredicto, sin persistir nada y sin despachar nada. Ve Observabilidad del firewall.

6. Reglas de egress (host / CIDR)

El operador cidr_match de arriba coincide con una IP que una herramienta reporta en sus argumentos. Eso es diferente de una regla de superficie egress, que evalúa el destino saliente que una herramienta realmente alcanza con una lista de permitidos o denegación de host/CIDR — la defensa principal contra SSRF y exfiltración de datos. Las reglas de egress usan la misma notación CIDR pero viven en la superficie egress; ve Reglas del firewall para el formato de la lista de egress.
Ningún preset trae reglas de egress CIDR por ti — el nivel de autonomía tight deniega los nombres de herramienta comunes con forma de fetch (http_fetch, fetch_url, web_search, request), no rangos de red. Autora tu propia regla de denegación host/CIDR cuando necesites fijar el egress a destinos específicos.

7. Referencia rápida

Formas de glob

* todo · foo.* prefijo · *.exec sufijo (+ verbo desnudo) · *.X.* infijo · cualquier otra cosa exacta. Distingue mayúsculas/minúsculas.

JSONPath

$.foo · $.foo.bar · $.foo[0] · $.arr[1].k. Sin comodines, filtros, slices ni descenso recursivo.

Operadores de string

eq (tipado) · contains (subcadena) · regex (RE2) · in (pertenencia a lista).

Operadores numéricos y de red

gt / lt (solo numérico, sin coerción de string) · cidr_match (IPv4/IPv6 en rango).

Relacionado

Reglas del firewall

El modelo de regla completo — superficies, orden, saneadores, secuencias y listas de egress.

Llamadas a herramienta peligrosas

La amenaza contra la que defienden estas cláusulas, y cómo acotar una regla a ella.

Glosario de veredictos

Qué hacen allow, audit, deny, sanitize y el resto una vez que una regla coincide.

¿Por qué se bloqueó esto?

Rastrea un bloqueo específico hasta la regla y cláusula que se disparó.