샌드박스 vs 도구 정책 vs 엘리베이티드

OpenClaw에는 세 가지 관련된(하지만 서로 다른) 제어 기능이 있습니다:

  1. 샌드박스 (agents.defaults.sandbox.* / agents.list[].sandbox.*)는 도구가 어디서 실행되는지 결정합니다 (Docker vs 호스트).
  2. 도구 정책 (tools.*, tools.sandbox.tools.*, agents.list[].tools.*)는 어떤 도구를 사용할 수 있는지/허용되는지 결정합니다.
  3. 엘리베이티드 (tools.elevated.*, agents.list[].tools.elevated.*)는 샌드박스 환경에서 호스트에서 실행하기 위한 exec 전용 탈출구입니다.

빠른 디버깅

인스펙터를 사용하여 OpenClaw가 실제로 무엇을 하고 있는지 확인하세요:

openclaw sandbox explain
openclaw sandbox explain --session agent:main:main
openclaw sandbox explain --agent work
openclaw sandbox explain --json

출력 내용:

  • 유효한 샌드박스 모드/범위/작업 공간 접근 권한
  • 현재 세션이 샌드박스 처리되었는지 여부 (main vs non-main)
  • 유효한 샌드박스 도구 허용/거부 (에이전트/전역/기본값에서 온 것인지)
  • 엘리베이티드 게이트 및 수정 키 경로

샌드박스: 도구가 실행되는 위치

샌드박싱은 agents.defaults.sandbox.mode로 제어됩니다:

  • "off": 모든 것이 호스트에서 실행됩니다.
  • "non-main": non-main 세션만 샌드박스 처리됩니다 (그룹/채널에서 흔한 “의외의 동작”).
  • "all": 모든 것이 샌드박스 처리됩니다.

전체 매트릭스(범위, 작업 공간 마운트, 이미지)는 샌드박싱을 참고하세요.

바인드 마운트 (보안 빠른 확인)

  • docker.binds는 샌드박스 파일시스템을 _관통_합니다: 마운트한 것은 설정한 모드(:ro 또는 :rw)로 컨테이너 내부에서 볼 수 있습니다.
  • 모드를 생략하면 기본값은 읽기-쓰기입니다. 소스/비밀 정보에는 :ro를 선호하세요.
  • scope: "shared"는 에이전트별 바인드를 무시합니다 (전역 바인드만 적용).
  • /var/run/docker.sock을 바인딩하면 사실상 샌드박스에 호스트 제어 권한을 넘기게 됩니다. 의도적인 경우에만 사용하세요.
  • 작업 공간 접근 (workspaceAccess: "ro"/"rw")은 바인드 모드와 독립적입니다.

도구 정책: 어떤 도구가 존재/호출 가능한지

두 가지 레이어가 중요합니다:

  • 도구 프로필: tools.profileagents.list[].tools.profile (기본 허용 목록)
  • 프로바이더 도구 프로필: tools.byProvider[provider].profileagents.list[].tools.byProvider[provider].profile
  • 전역/에이전트별 도구 정책: tools.allow/tools.denyagents.list[].tools.allow/agents.list[].tools.deny
  • 프로바이더 도구 정책: tools.byProvider[provider].allow/denyagents.list[].tools.byProvider[provider].allow/deny
  • 샌드박스 도구 정책 (샌드박스 상태에서만 적용): tools.sandbox.tools.allow/tools.sandbox.tools.denyagents.list[].tools.sandbox.tools.*

경험 법칙:

  • deny가 항상 우선합니다.
  • allow가 비어 있지 않으면, 나머지 모든 것은 차단으로 처리됩니다.
  • 도구 정책은 최종 차단 지점입니다: /exec가 거부된 exec 도구를 재정의할 수 없습니다.
  • /exec는 권한 있는 발신자의 세션 기본값만 변경하며, 도구 접근 권한을 부여하지 않습니다. 프로바이더 도구 키는 provider (예: google-antigravity) 또는 provider/model (예: openai/gpt-5.2) 형식을 모두 수용합니다.

도구 그룹 (축약형)

도구 정책(전역, 에이전트, 샌드박스)은 여러 도구로 확장되는 group:* 항목을 지원합니다:

{
  tools: {
    sandbox: {
      tools: {
        allow: ["group:runtime", "group:fs", "group:sessions", "group:memory"],
      },
    },
  },
}

사용 가능한 그룹:

  • group:runtime: exec, bash, process
  • group:fs: read, write, edit, apply_patch
  • group:sessions: sessions_list, sessions_history, sessions_send, sessions_spawn, session_status
  • group:memory: memory_search, memory_get
  • group:ui: browser, canvas
  • group:automation: cron, gateway
  • group:messaging: message
  • group:nodes: nodes
  • group:openclaw: 모든 내장 OpenClaw 도구 (프로바이더 플러그인 제외)

엘리베이티드: exec 전용 “호스트에서 실행”

엘리베이티드는 추가 도구를 부여하지 않습니다. exec에만 영향을 미칩니다.

  • 샌드박스 상태에서 /elevated on (또는 elevated: true가 있는 exec)을 사용하면 호스트에서 실행됩니다 (승인이 여전히 필요할 수 있습니다).
  • /elevated full을 사용하면 세션에서 exec 승인을 건너뜁니다.
  • 이미 직접 실행 중이면, 엘리베이티드는 사실상 no-op입니다 (여전히 게이트 적용).
  • 엘리베이티드는 스킬 범위가 아니며 도구 허용/거부를 재정의하지 않습니다.
  • /exec는 엘리베이티드와 별개입니다. 권한 있는 발신자의 세션별 exec 기본값만 조정합니다.

게이트:

  • 활성화: tools.elevated.enabled (및 선택적으로 agents.list[].tools.elevated.enabled)
  • 발신자 허용 목록: tools.elevated.allowFrom.<provider> (및 선택적으로 agents.list[].tools.elevated.allowFrom.<provider>)

엘리베이티드 모드를 참고하세요.

일반적인 “샌드박스 감옥” 해결 방법

”도구 X가 샌드박스 도구 정책에 의해 차단됨”

수정 키 (하나 선택):

  • 샌드박스 비활성화: agents.defaults.sandbox.mode=off (또는 에이전트별 agents.list[].sandbox.mode=off)
  • 샌드박스 내에서 해당 도구 허용:
    • tools.sandbox.tools.deny에서 제거 (또는 에이전트별 agents.list[].tools.sandbox.tools.deny)
    • 또는 tools.sandbox.tools.allow에 추가 (또는 에이전트별 allow)

“main 세션인 줄 알았는데 왜 샌드박스 처리되나요?”

"non-main" 모드에서 그룹/채널 키는 main이 아닙니다. main 세션 키(sandbox explain에서 표시)를 사용하거나 모드를 "off"로 전환하세요.