shell.exec를 실행하고, 파일을 편집하고, URL을 가져오고,
커뮤니티 skill을 로드합니다 — 그 어느 것이든 볼륨을 rm -rf하거나, .env를
읽거나, 공격자 호스트로 유출할 수 있습니다. 이 레시피는 그 표면을
Firewall로 잠급니다: 파괴적 셸을 거부하고, 여러분이
허용하는 호출의 인자를 검증하고, egress에 울타리를 치고, 진짜로 위험한
작업을 사람을 위해 보류합니다. 그 어느 것도 여러분 에이전트의 코드를 건드리지
않습니다 — 정책은 게이트웨이에 존재하며 다음 호출에서 강제됩니다.
아래의 모든 것은 콘솔(Firewall → Posture / Policies)에서 구성됩니다. 그
관리 라우트는 릴레이 키가 아니라 여러분의 콘솔 세션을 사용합니다. 에이전트가
만드는
/v1/* 호출만 sk-orca-… 키를 운반합니다. 정책 편집은 Developer
역할을 요구합니다.1. 차단이 아니라 관찰로 시작하기 — 안전한 코딩 에이전트 기준선
규칙을 맹목적으로 작성하지 마세요. 에이전트에게sk-orca-… 키를 준 다음,
Firewall → Posture를 열고 balanced
자율성 수준을 적용하세요. 한
트랜잭션에서 이는 모든 툴 호출을 감사하고, PII를 플래그하고, 파괴적 셸을
거부합니다 — 그래서 실제 트래픽에서 나머지 에이전트 동작을 학습하는 동안
최악의 액션은 이미 울타리로 차단됩니다.
실행하게 둔 다음, Firewall → Discovered tools를 읽으세요: 워크스페이스가
본 모든 툴이, covered(규칙이 적용됨) 또는 gap(아무것도 안 됨)으로
플래그됩니다. 그 목록이 여러분의 허용 목록 초안입니다. 피드가 적절해 보이면,
tight(기본 거부)로 이동하거나 아래의 타깃 정책을 작성하세요.
2. 파괴적 셸 거부 — 타협 불가의 바닥
코딩 에이전트를 위한 단 하나의 가장 중요한 규칙은 파괴적 셸 금지입니다.balanced와 tight 자율성 수준은 이미 이것을 Block destructive shell
프리셋으로 제공하며, 이는 워크스페이스 직접 툴 이름(shell.*, bash,
cmd.*, powershell.*, exec.*)과 등록된 서버가 노출하는 MCP 네임스페이스
형태(*.shell.*, *.cmd.*, …) 양쪽을 커버하는 실제의, 편집 가능한 deny
규칙을 구체화합니다.
“모든 셸 거부”보다 더 단단히 범위를 지정하고 싶다면, 파괴적 명령만 거부하고
나머지는 감사하는 규칙 하나를 작성하세요. 규칙은 툴 이름 glob에 선택적
인자 술어(호출의 인자에 대한 JSONPath)를 더해 매치합니다:
rm -rf는 거부하되 다른 셸 호출은 허용
rm -rf는 거부하되 다른 셸 호출은 허용
Firewall → Policies에서, 여러분의 기본값 위에 규칙을 추가하세요:
- Tool glob:
shell.exec - Args match(JSONPath 절):
- Verdict:
deny
eq, contains, regex, in,
cidr_match, gt, lt. $.command가 정규식과 매치하는 호출은
차단됩니다; 나머지 모든 것은 다음 규칙으로 떨어집니다.block이 어떻게 보이는가
block이 어떻게 보이는가
inbound 표면의 거부된 호출은 오류 코드
firewall_blocked와 툴과
이유를 명시하는 메시지와 함께 HTTP 400을 반환합니다. MCP 게이트웨이를
통해 디스패치된 호출은 툴 오류(firewall deny: …)로 돌아오므로 모델이
크래시하는 대신 반응할 수 있습니다. inbound block은 업스트림 모델 호출
전에 발동하므로 모델 토큰을 소모하지 않습니다.3. 유지하는 툴의 인자 검증하기
툴을 허용하는 것은 그것에 대한 모든 인자를 허용하는 것과 같지 않습니다. deny에 범위를 지정하는 동일한 JSONPath 술어로 허용된 호출의 형태를 제약할 수 있습니다 — 그래서db.query는 DROP을 운반할 수 없고, file.write는
디렉토리를 탈출할 수 없습니다.
SQL DROP 차단
glob
db.query, 절
{"path":"$.sql","op":"regex","value":"(?i)\\bdrop\\b"}, 판정
deny.인자 내 시크릿 가리기
판정
sanitize는 호출이 전달되기 전에 툴 호출 인자에서 매치된 부분
문자열을 가립니다. 툴이 반환하는 것은 결코 건드리지 않습니다; inbound
표면(아직 호출 시점 인자 없음)에서는 block으로 격상됩니다.4. egress 통제 — 에이전트가 도달할 수 있는 곳에 울타리 치기
URL을 가져올 수 있는 코딩 에이전트는 SSRF(클라우드 메타데이터나 내부10.x 호스트를 타격)로 유도되거나 유출에 사용될 수 있습니다. tight 자율성
수준은 fetch 형태의 툴 이름(http_fetch, web_search, fetch_url,
request, 그리고 그들의 <server>.* 형태)을 완전히 거부하는 SSRF
프리셋을 제공합니다.
목적지 수준 통제를 위해, egress 규칙을 작성하세요. egress 규칙은
egress 표면에서 평가되며 allow / deny 항목으로 host 또는 CIDR별로
범위를 지정합니다:
어떤 프리셋도 CIDR 기반 egress 규칙을 제공하지 않습니다 — SSRF 프리셋은
fetch 형태의 툴 이름을 매치합니다. 위의 host/CIDR 거부 목록은 여러분이
직접 작성하는 것입니다. 전체 패턴은
유출 중지를 참조하세요.
5. 위험한 작업을 사람을 위해 보류하기 (HITL)
어떤 작업은 자동 허용도 자동 거부도 되어서는 안 됩니다 — 배포,git push,
파괴적 마이그레이션. 그런 것에는 pending_approval 판정을 사용하세요. 호출이
보류되고, 에이전트는 승인 id가 담긴 “held” 응답을 받고, 검토자가 대역 외에서
그것을 해결합니다:
- 규칙을 작성하세요(예: glob
deploy.*, 판정pending_approval). - 보류된 호출은 승인 id와 함께 HTTP 400
firewall_approval_pending을 반환합니다. - 검토자가 콘솔에서(Developer+) 또는 HMAC 서명 웹훅 콜백을 통해 승인합니다.
- 에이전트가 승인을 폴링한 다음, 일회용
X-OrcaRouter-Firewall-Approval헤더와 함께 원래 호출을 재제출하고 — 게이트웨이는 그것을 그 한 번 통과시킵니다.
6. 로드하는 skill과 MCP 서버 통제하기
코딩 에이전트는 런타임에 기능을 끌어옵니다 — 커뮤니티 skill, BYO MCP 서버. Firewall은 게이트웨이에서 둘 다 통제합니다:- Skills는 강제 모드(
allow/quarantine/block)와 함께 위험 밴드로 스캔됩니다. 자동 탐지된 skill은 검토자가 해제할 때까지 격리됩니다 — 승인을 위해 보류됨. Skills를 참조하세요. - 여러분이 등록하는 MCP 서버는 모든
tools/call을 게이트웨이를 통해 디스패치하며, 게이트웨이는 디스패치 전에 각각을mcp표면에서 평가합니다. 자격 증명은 암호화되어 저장됩니다; 헬스 프로브는ok/degraded/down을 보고합니다. MCP 서버와 MCP 에이전트 강화를 참조하세요.
7. 검증하고 관찰하기
정책에 의존하기 전에, dry-run하세요. Test 탭은 현재 정책에 대해 샘플 툴 호출을 평가하고 판정, 매치된 규칙, 그리고 이유를 보여줍니다 — 아무것도 디스패치되지 않고, 아무것도 영속화되지 않습니다. 일단 라이브가 되면, Firewall → Events / Runs는 모든 평가의 기록으로, 판정, 표면, 툴, run으로 필터링 가능하며, 이상 피드는 워크스페이스의 학습된 베이스라인에 대한 속도/비용 급증,retry_loop, 그리고 한 번도 본 적 없는 툴 경로를 플래그합니다.
요약
Firewall 레퍼런스
전체 정책 평면 — 표면, 판정, 해석, 자율성.
Firewall 규칙
매칭 언어: glob, 인자 절, egress, 시퀀스.
위험한 툴 호출
이 레시피가 방어하는 위협.
과도한 에이전시
과도하게 권한이 부여된 에이전트가 핵심 에이전트 위험인 이유.
자율 에이전트 레시피
완전 자율 에이전트 루프를 처음부터 끝까지 잠그세요.
유출 중지
egress와 lethal-trifecta 패턴을 깊이 있게.
