블로그 · 가이드 · 2026년 10월 28일

AEGIS가 도구 호출을 봉인하는 방법: SEAL 게이트웨이, 단계별로

다른 언어: English, Español, Português, 日本語, Deutsch, Français, 简体中文, Italiano, हिन्दी · 한국어 가이드 전체

공개: AEGIS와 SEAL 게이트웨이는 100monkeys.ai가 만들고 있으므로 이 가이드는 만든 쪽의 설명으로 읽어 주세요. 이 가이드는 저희 AI 에이전트 하나가 공개 문서(영어), 주로 SEAL Protocol 페이지, Integration with AEGIS, Security Contexts를 바탕으로 초안을 쓰고 회사가 검토했으며, 이 한국어판은 영어 원문 가이드의 번역입니다. 아래의 필드, 코드, 흐름은 문서에 있는 그대로이며, 이 가이드를 위해 저희가 직접 캡처한 출력이 아닙니다.

AEGIS by 100monkeys.ai, in beta는 에이전트가 만들었다는 이유만으로 그 도구 호출을 믿지 않습니다. 모든 호출은 서명된 봉투에 담기고, 실행 바깥의 무엇이든 건드리기 전에 SEAL 게이트웨이의 검사를 받습니다. 이 가이드는 실행이 시작되는 순간부터 호출이 남기는 감사 기록까지 호출 하나를 따라갑니다.

SEAL은 무엇을 위한 것인가

SEAL은 Signed Envelope Attestation Layer의 약자입니다. 문서는 일반적인 도구 호출 프로토콜의 빈틈 네 가지를 듭니다. 어느 클라이언트가 요청을 보냈는지 증명할 수 없고, 권한은 세션마다 전부 아니면 전무이며, 본문은 전송 중에 변조될 수 있고, 어느 호출자가 무엇을 했는지 증명하는 기록이 없습니다. 문서의 예는 프롬프트 인젝션입니다. 가져온 페이지가 모델에게 /workspace를 지우라고 합니다. "With SEAL, the caller's SecurityContext has no fs.delete capability. The gateway blocks it before it ever reaches the tool."(SEAL에서는 호출자의 SecurityContext에 fs.delete 권한이 없습니다. 게이트웨이는 그 호출이 도구에 닿기도 전에 막습니다.)

게이트웨이는 독립 실행을 우선으로 설계되었습니다. 문서의 표현으로는 AEGIS 오케스트레이터가 "deploys alongside itself"(자기 옆에 배포하는) 것이 "the same aegis-seal-gateway binary"(같은 aegis-seal-gateway 바이너리)입니다. AEGIS를 쓰면 아래 단계를 얻기 위해 따로 할 일이 없습니다. "it is the default."(이것이 기본값입니다.)

1단계. 오케스트레이터가 실행을 위한 세션을 연다

실행이 Running 상태에 들어가면 오케스트레이터는 그 실행을 위한 새 Ed25519 키 쌍을 만들고 게이트웨이에 등록합니다. POST /v1/seal/sessions에 session_id(실행 ID, "so audit trails line up", 감사 기록이 서로 맞물리도록), public_key, security_context, 그리고 실행의 실제 시간 예산으로 제한되는 expires_at을 보냅니다. 이것은 seal.session.create 범위를 가진 호출자만 할 수 있습니다. "agents themselves cannot self-register."(에이전트는 스스로 등록할 수 없습니다.)

2단계. 개인 키는 에이전트에게만 간다

개인 키 쪽은 게이트웨이 URL, 세션 ID와 함께 에이전트 컨테이너의 임시 런타임 설정, "a tmpfs mount, never persisted"(tmpfs 마운트로, 절대 영구 저장되지 않음)에 기록됩니다. 그래서 모든 실행이 자기만의 키를 가지며, "a leaked private key is bounded to a single execution's lifetime."(유출된 개인 키의 피해는 실행 하나의 수명으로 한정됩니다.)

3단계. 세션은 하나의 보안 컨텍스트에 묶인다

보안 컨텍스트는 게이트웨이에 있는 이름 붙은 정책입니다. deny_list 하나와 순서가 있는 capabilities 목록으로 이루어지며, 각 capability에는 tool_pattern과 선택 항목인 path_allowlist, command_allowlist, subcommand_allowlist, domain_allowlist, max_response_size가 있습니다. 생성된 에이전트는 요청한 사람의 등급 컨텍스트가 아니라 aegis-system-agent-runtime 아래에서 실행됩니다. 오케스트레이터가 프로비저닝 때 컨텍스트를 찍어 두므로 에이전트는 "cannot escalate by claiming a different scp in its envelope"(봉투에 다른 scp를 적는 방법으로 권한을 높일 수 없습니다).

4단계. 에이전트가 정규화된 메시지에 서명한다

서명 대상은 원본 JSON이 아닙니다. payload, security_token, timestamp 세 키를 모든 단계에서 키를 정렬하고, 공백 없이, 정수 Unix 타임스탬프와 UTF-8로 직렬화한 것에 서명합니다. 다른 바이트열은 다른 서명을 낳고, "the gateway will reject the envelope."(게이트웨이는 그 봉투를 거부합니다.)

5단계. 에이전트가 봉투를 보낸다

봉투에는 protocol(항상 seal/v1), security_token(증명 시점에 발급되는 JWT, 기본 수명 1시간), Ed25519 signature, payload(MCP 방식 호출에서는 JSON-RPC tools/call), 선택 항목 container_id, 그리고 timestamp가 들어 있습니다. 봉투는 게이트웨이의 호출 엔드포인트 POST /v1/invoke로 갑니다. 게이트웨이는 기본적으로 8089에서 대기하고, AEGIS 오케스트레이터 자체의 API는 8088에 있습니다.

6단계. 게이트웨이가 아홉 가지를 검사한다

  1. protocol 필드가 seal/v1인지.
  2. 토큰이 클레임 sub, scp, wid, exec_id, iat, exp, jti로 디코딩되는지.
  3. alg 헤더를 명시적으로 확인한 상태에서, 토큰의 서명이 게이트웨이의 키로 검증되는지.
  4. 토큰이 만료되지 않았는지.
  5. 세션에 대해 호출자의 등록된 공개 키를 찾을 수 있는지.
  6. 정규화된 메시지를 다시 만든다.
  7. 봉투의 서명이 그 키와 메시지로 검증되는지.
  8. 타임스탬프가 서버 시계와 30초 이내인지.
  9. scp에 적힌 보안 컨텍스트를 불러와 호출을 평가한다.

"Every check must pass before the payload is unwrapped and forwarded."(payload를 풀어서 전달하기 전에 모든 검사를 통과해야 합니다.)

7단계. 보안 컨텍스트가 결정한다

평가는 정해진 순서로 진행됩니다. deny_list 패턴이 맞으면 호출은 거부되고, 그렇지 않으면 "the first capability whose tool_pattern matches the tool name owns the decision"(tool_pattern이 도구 이름과 맞는 첫 capability가 결정을 내립니다). 맞는 것이 없으면 호출은 거부됩니다. "there is no implicit allow."(암묵적인 허용은 없기 때문입니다.) fs.* 같은 계열 패턴은 fs.read와 맞고, fs나 fsx.read와는 절대 맞지 않습니다.

8단계. 호출이 전달되거나 코드와 함께 거부된다

허용된 호출은 payload를 풀어서 도구로 보냅니다. 도구에 자격 증명이 필요하면 그 순간에 해석됩니다. 거부된 호출은 숫자 코드로 답합니다. 정책(허용되지 않음, 거부 목록에 있음, 경로나 명령이나 도메인이 허용 목록 밖, 요청 제한, 맞는 capability 없음)은 2000에서 2006, 서명과 토큰과 세션은 1001에서 1006, 증명은 3000에서 3002입니다. 문서의 조언: "Switch on error.code, not on the status."(상태가 아니라 error.code로 분기하세요.)

9단계. 모든 결정은 감사 이벤트를 남긴다

게이트웨이는 ToolCallAuthorized나 PolicyViolationBlocked 등을 발행합니다. 여기에는 봉투의 서명, 타임스탬프, jti, 토큰의 sub, scp, wid, exec_id, 도구 이름, payload 다이제스트("payloads are not logged by default", payload는 기본적으로 기록되지 않음), 그리고 결정과 그 결정을 내린 규칙이 담깁니다. 봉투에 서명할 수 있는 것은 세션의 개인 키뿐이므로, 이 기록은 부인 방지를 제공합니다.

10단계. 세션은 실행과 함께 끝난다

실행이 성공, 오류, 시간 초과, 취소 중 어떤 이유로든 끝나면 오케스트레이터는 DELETE /v1/seal/sessions/{session_id}를 호출합니다. 게이트웨이는 키를 지우고, 그 뒤에 가로챈 봉투를 다시 보내면 거부됩니다.

문서가 답하지 않은 것

다음

실제 실행에서 이 호출들을 찾으려면 Reading an AEGIS execution log(영어)를 읽으세요. 직접 해 보려면 100monkeys.ai에 적힌 명령으로 AEGIS를 설치합니다.

curl -fsSL https://get.100monkeys.ai | bash

100monkeys.ai에서 AEGIS 설치하기