메인 콘텐츠로 건너뛰기
firewall 규칙은 툴 호출을 두 축으로 매치합니다: 어떤 툴(tool_name_glob)과 어떤 인자(JSONPath 필드에 대한 args_match 절). 이 페이지는 둘 다를 위한 정밀한 문법입니다 — 패턴이 무엇을 매치하고, 무엇을 매치하지 않고, 각 연산자가 어떻게 타입을 강제하는지 — 그래서 콘솔에서 작성한 규칙이 여기서 읽는 대로 정확히 동작합니다. 핵심 사용 사례: 무딘 “shell.exec를 차단”을 외과적 “명령이 rm -rf처럼 보일 때만 shell.exec를 차단”으로 바꾸기. glob은 툴 패밀리를 고르고; 인자 연산자는 그 안의 위험한 호출을 고릅니다.
이것은 문법 레퍼런스입니다. 이 절들이 규칙의 어디에 있는지, 규칙 순서, 그리고 판정은 Firewall 규칙 심층 레퍼런스를 참조하세요. 규칙 필드 자체는 Firewall 개요를 참조하세요.

1. 이 문법이 적용되는 곳

두 형식 모두 firewall 규칙에, 콘솔의 /console/firewall 아래에서 작성됩니다 (쓰기는 **Developer+**를 요구). 여러분은 결코 매처를 직접 호출하지 않습니다 — 게이트웨이가 모든 툴 호출에 대해 해석된 정책에 대해 평가합니다. 규칙은 그 표면, tool_name_glob, 선택적 skill glob, 그리고 args_match 절이 모두 매치할 때 매치합니다; 첫 매치가 이깁니다.
args_match 절이 없는 규칙은 툴 이름 glob만으로 매치합니다. 툴 이름이 충분히 구체적이지 않을 때만 인자 절을 추가하세요.

2. 툴 이름 glob 문법

tool_name_glob은 의도적으로 작고 예측 가능한 문법입니다 — 전체 정규식이 아닙니다. 패턴은 대소문자 구분으로 매치됩니다(MCP 툴 이름은 관례적으로 점이 있는 소문자이므로, Discovered tools 탭에서 이름을 복사할 때 대소문자 폴딩은 놀라게 할 것입니다).
빈 패턴이나 단순한 *는 모든 툴을 매치합니다. catch-all 규칙에 사용하거나, 대신 정책의 default_verdict에 의존하세요.
shell.*shell.exec, shell.read, shell.write를 매치합니다. 단순한 shell은 매치하지 않습니다(점이 필요합니다 — 접두사 glob은 네임스페이스 자식만 다룹니다).
*.exec는 네임스페이스가 있는 shell.exec 그리고 단순한, 네임스페이스가 없는 exec를 매치합니다(프로바이더 네이티브 함수 호출과 네임스페이스를 사용하지 않는 MCP 서버는 단순한 동사 아래 툴을 노출하므로, 접미사 규칙은 두 형태를 모두 다룹니다). 접미사는 점 또는 문자열 시작에 앵커된 채로 유지되므로, *.execshell.execute를 매치하지 않습니다.
*.shell.*는 임의의 <server>.shell.<verb> 형태를 매치합니다 — local.shell.exec, byo.shell.run. infix의 각 측에 최소 한 문자를 요구하므로, *.shell.*는 단순한 shell이나 .shell. 단독을 매치하지 않습니다. 대칭적 *.X.* 형태만 infix로 취급됩니다; foo.*.bar 같은 혼합 패턴은 정확한 매치로 떨어집니다.
위 네 개의 와일드카드 형태 중 하나가 아닌 임의의 패턴(리터럴 툴 이름, 또는 foo.*.bar 같은 잘못된 조합 포함)은 정확한, 대소문자 구분 문자열로 비교됩니다.
? 단일 문자 와일드카드, 문자 클래스, 토큰 중간 *(예: sh*l.exec)는 없습니다. 네 개의 지원되는 형태 중 하나가 아닌 패턴은 리터럴로 매치됩니다 — sh*l.exec는 리터럴로 sh*l.exec라고 명명된 툴만 매치합니다. 정규식 근육 기억이 아니라 위의 형태로 작성하세요.

3. JSONPath 인자 절

args_match 세트이며, 각각은 {path, op, value} 트리플입니다. path는 툴 호출 인자 객체로의 JSONPath입니다; op는 일곱 연산자 중 하나입니다; value는 비교 대상입니다. 규칙의 모든 절은 AND로 결합됩니다 — 규칙이 발동하려면 모든 절이 매치해야 합니다.
{
  "clauses": [
    {"path": "$.command", "op": "regex", "value": "rm -rf|drop table"},
    {"path": "$.connection", "op": "in", "value": ["prod", "replica"]}
  ]
}

지원되는 JSONPath 부분집합

ShapeMatches
$.foo최상위 키.
$.foo.bar중첩 키.
$.foo[0]인덱스에 의한 배열 요소.
$.arr[1].k인덱스 후 키(위의 조합).
그것이 전체 부분집합입니다. 와일드카드($.*), 필터($.foo[?(...)]), 슬라이스($.foo[0:2]), 또는 재귀 하강($..foo)은 없습니다.
경로에 대해 fail-closed. 절의 경로가 아무것도 해석하지 않으면 — 키가 누락되었거나, 인자가 유효한 JSON이 아니거나, 값이 연산자에 대해 잘못된 타입이면 — 그 절은 false로 평가되고, 규칙은 발동하지 않으며, 평가는 다음 규칙 또는 정책 기본값으로 떨어집니다. 잘못된 인자는 결코 자동 거부하지 않고 결코 엔진을 크래시시키지 않습니다.

4. 인자 연산자

일곱 연산자, 닫힌 세트. 콘솔 검증기와 라이브 엔진은 정확히 동일한 어휘를 공유하므로, 저장되는 절은 실행되는 절입니다.
OperatorComparesType rules
eq정확한 동등성.타입 지정: string↔string, bool↔bool, 또는 number↔number. 혼합 타입은 결코 매치하지 않음.
contains부분 문자열 포함.양측이 문자열이어야 함; 그 외에는 비매치. 빈 값은 임의의 문자열을 매치.
regex문자열에 대한 RE2 패턴(선형 시간, 역참조 없음).값과 해석된 인자가 둘 다 문자열이어야 함. 잘못된 패턴은 절을 비활성화(결코 매치 안 함).
in멤버십 — 값이 리스트의 임의 요소와 같음.값이 JSON 배열이어야 함; 각 요소는 eq 의미로 비교.
cidr_match해석된 값이 주어진 네트워크 안의 IP.값은 CIDR 문자열(IPv4 또는 IPv6, 예: 10.0.0.0/8, fd00::/8); 인자가 IP로 파싱되어야 함.
gt초과, 숫자.양측이 숫자로 강제되어야 함. 숫자처럼 보이는 문자열은 강제되지 않음 — 타입 불일치(비매치).
lt미만, 숫자.gt와 동일한 숫자 전용 규칙.
gtlt는 엄격하게 숫자입니다. 툴이 {"max_rows": "10000"}(문자열)을 보내면, gt 5000 절은 발동하지 않습니다 — 문자열은 결코 강제되지 않습니다. 숫자를 숫자에 대해 비교하세요; 문자열 형태 값에는 regex 또는 contains를 사용하세요.

5. 한 가지 작동 예시

파괴적 데이터베이스 export를 차단하되, 사설 네트워크 호스트를 통해 프로덕션 연결을 목표로 할 때만:
{
  "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"}
    ]
  }
}
위에서 아래로 읽으세요: glob db.*는 규칙을 데이터베이스 툴 패밀리로 범위 지정합니다; 세 절은 AND로 결합되어 판정(예: deny)이 명령문이 파괴적이고 그리고 연결이 명명된 두 prod 타겟 중 하나이고 그리고 그 호스트가 사설 10.0.0.0/8 범위에 있을 때만 발동합니다. 공개 IP의 dev 연결에 대한 db.query는 이 규칙을 건드리지 않고 지나갑니다.
신뢰하기 전에 절을 증명하세요: 정책의 Test 탭은 샘플 툴 호출을 dry-run하고 매치된 규칙과 판정을 보여줍니다, 아무것도 영속화하지 않고 아무것도 디스패치하지 않습니다. Firewall 관측성 참조.

6. Egress (호스트 / CIDR) 규칙

위의 cidr_match 연산자는 툴이 그 인자에 보고하는 IP를 매치합니다. 그것은 툴이 실제로 도달하는 아웃바운드 목적지를 호스트/CIDR 허용 또는 거부 목록으로 평가하는 egress-표면 규칙과는 다릅니다 — 주요 SSRF 및 데이터 유출 방어. Egress 규칙은 동일한 CIDR 표기를 사용하지만 egress 표면에 존재합니다; egress 목록 포맷은 Firewall 규칙을 참조하세요.
어떤 프리셋도 여러분을 위해 CIDR egress 규칙을 제공하지 않습니다 — tight 자율성 수준은 네트워크 범위가 아니라 흔한 fetch 형태 툴 이름 (http_fetch, fetch_url, web_search, request)을 거부합니다. egress를 특정 목적지에 고정해야 할 때 여러분 자신의 호스트/CIDR 거부 규칙을 작성하세요.

7. 빠른 레퍼런스

Glob 형태

* 전체 · foo.* 접두사 · *.exec 접미사(+ 단순 동사) · *.X.* infix · 그 외 정확. 대소문자 구분.

JSONPath

$.foo · $.foo.bar · $.foo[0] · $.arr[1].k. 와일드카드, 필터, 슬라이스, 또는 재귀 하강 없음.

문자열 연산자

eq(타입 지정) · contains(부분 문자열) · regex(RE2) · in(리스트 멤버십).

숫자 및 네트워크 연산자

gt / lt(숫자 전용, 문자열 강제 없음) · cidr_match (범위 내 IPv4/IPv6).

관련

Firewall 규칙

전체 규칙 모델 — 표면, 순서, 새니타이저, 시퀀스, 그리고 egress 목록.

위험한 툴 호출

이 절들이 방어하는 위협, 그리고 규칙을 그것에 범위 지정하는 방법.

판정 용어집

규칙이 매치된 후 allow, audit, deny, sanitize, 그리고 나머지가 무엇을 하는지.

왜 차단되었나요?

특정 차단을 발동한 규칙과 절로 추적하세요.