메인 콘텐츠로 건너뛰기

Sandboxing

OpenClaw 는 Docker 컨테이너 내부에서 도구를 실행하여 피해 범위를 줄일 수 있습니다. 이는 선택 사항이며 구성(agents.defaults.sandbox 또는 agents.list[].sandbox)으로 제어됩니다. 샌드박스화가 꺼져 있으면 도구는 호스트에서 실행됩니다. Gateway(게이트웨이)는 호스트에 유지되며, 활성화 시 도구 실행은 격리된 샌드박스에서 이루어집니다. 이는 완벽한 보안 경계는 아니지만, 모델이 잘못된 동작을 할 때 파일시스템과 프로세스 접근을 실질적으로 제한합니다.

무엇이 샌드박스화되는가

  • 도구 실행(exec, read, write, edit, apply_patch, process 등).
  • 선택적 샌드박스화된 브라우저(agents.defaults.sandbox.browser).
    • 기본적으로 샌드박스 브라우저는 브라우저 도구가 필요할 때 자동 시작되어(CDP 접근 가능 보장) 동작합니다. agents.defaults.sandbox.browser.autoStartagents.defaults.sandbox.browser.autoStartTimeoutMs로 구성합니다.
    • agents.defaults.sandbox.browser.allowHostControl를 사용하면 샌드박스화된 세션이 호스트 브라우저를 명시적으로 대상으로 지정할 수 있습니다.
    • 선택적 허용 목록이 target: "custom"를 게이트합니다: allowedControlUrls, allowedControlHosts, allowedControlPorts.
샌드박스화되지 않음:
  • Gateway(게이트웨이) 프로세스 자체.
  • 호스트에서 실행하도록 명시적으로 허용된 모든 도구(예: tools.elevated).
    • 상승된 exec 는 호스트에서 실행되며 샌드박스화를 우회합니다.
    • 샌드박스화가 꺼져 있으면 tools.elevated은 실행을 변경하지 않습니다(이미 호스트에서 실행). Elevated Mode를 참조하십시오.

모드

agents.defaults.sandbox.mode는 샌드박스화를 언제 사용하는지를 제어합니다:
  • "off": 샌드박스화 없음.
  • "non-main": 메인 세션이 아닌 경우에만 샌드박스화(호스트에서 일반 채팅을 원할 때 기본값).
  • "all": 모든 세션이 샌드박스에서 실행됩니다. 참고: "non-main"은 에이전트 id 가 아니라 session.mainKey 기준(기본값 "main")입니다. 그룹/채널 세션은 자체 키를 사용하므로 메인이 아닌 것으로 간주되어 샌드박스화됩니다.

범위

agents.defaults.sandbox.scope는 생성되는 컨테이너 수를 제어합니다:
  • "session" (기본값): 세션당 하나의 컨테이너.
  • "agent": 에이전트당 하나의 컨테이너.
  • "shared": 모든 샌드박스화된 세션이 하나의 컨테이너를 공유.

워크스페이스 접근

agents.defaults.sandbox.workspaceAccess는 샌드박스가 무엇을 볼 수 있는지를 제어합니다:
  • "none" (기본값): 도구는 ~/.openclaw/sandboxes 아래의 샌드박스 워크스페이스를 봅니다.
  • "ro": 에이전트 워크스페이스를 /agent에 읽기 전용으로 마운트합니다(write/edit/apply_patch 비활성화).
  • "rw": 에이전트 워크스페이스를 /workspace에 읽기/쓰기 가능으로 마운트합니다.
수신 미디어는 활성 샌드박스 워크스페이스(media/inbound/*)로 복사됩니다. Skills 참고: read 도구는 샌드박스 루트 기준입니다. workspaceAccess: "none"를 사용하면, OpenClaw 는 읽을 수 있도록 적격한 Skills 를 샌드박스 워크스페이스(.../skills)로 미러링합니다. "rw"를 사용하면 워크스페이스 Skills 를 /workspace/skills에서 읽을 수 있습니다.

사용자 지정 바인드 마운트

agents.defaults.sandbox.docker.binds는 추가 호스트 디렉토리를 컨테이너에 마운트합니다. 형식: host:container:mode (예: "/home/user/source:/source:rw"). 전역 및 에이전트별 바인드는 병합됩니다(대체되지 않음). scope: "shared"에서는 에이전트별 바인드가 무시됩니다. agents.defaults.sandbox.browser.binds는 추가적인 호스트 디렉터리를 sandbox browser 컨테이너에만 마운트합니다.
  • 설정된 경우([] 포함), 브라우저 컨테이너에 대해 agents.defaults.sandbox.docker.binds를 대체합니다.
  • 생략된 경우, 브라우저 컨테이너는 agents.defaults.sandbox.docker.binds로 폴백합니다(하위 호환).
예시(읽기 전용 소스 + docker 소켓):
{
  agents: {
    defaults: {
      sandbox: {
        docker: {
          binds: ["/home/user/source:/source:ro", "/var/run/docker.sock:/var/run/docker.sock"],
        },
      },
    },
    list: [
      {
        id: "build",
        sandbox: {
          docker: {
            binds: ["/mnt/cache:/cache:rw"],
          },
        },
      },
    ],
  },
}
보안 참고 사항:
  • 바인드는 샌드박스 파일시스템을 우회하여 설정한 모드(:ro 또는 :rw) 그대로 호스트 경로를 노출합니다.
  • 민감한 마운트(예: docker.sock, 비밀 값, SSH 키)는 절대적으로 필요하지 않은 한 :ro로 설정해야 합니다.
  • 워크스페이스에 대한 읽기 접근만 필요하다면 workspaceAccess: "ro"와 함께 사용하십시오; 바인드 모드는 독립적으로 유지됩니다.
  • 바인드가 도구 정책 및 상승된 exec 와 어떻게 상호작용하는지는 Sandbox vs Tool Policy vs Elevated를 참조하십시오.

이미지 + 설정

기본 이미지: openclaw-sandbox:bookworm-slim 한 번만 빌드합니다:
scripts/sandbox-setup.sh
참고: 기본 이미지는 Node 를 포함하지 않습니다. 어떤 Skill 이 Node(또는 다른 런타임)를 필요로 하는 경우, 사용자 지정 이미지를 굽거나 sandbox.docker.setupCommand를 통해 설치하십시오(네트워크 이그레스 + 쓰기 가능한 루트 + root 사용자 필요). 샌드박스화된 브라우저 이미지:
scripts/sandbox-browser-setup.sh
기본적으로 샌드박스 컨테이너는 네트워크가 없습니다. agents.defaults.sandbox.docker.network로 재정의할 수 있습니다. Docker 설치와 컨테이너화된 Gateway(게이트웨이)는 여기에서 확인하십시오: Docker

setupCommand (컨테이너 1회 설정)

setupCommand은 샌드박스 컨테이너가 생성된 후 한 번만 실행됩니다(매 실행마다 아님). sh -lc를 통해 컨테이너 내부에서 실행됩니다. 경로:
  • 전역: agents.defaults.sandbox.docker.setupCommand
  • 에이전트별: agents.list[].sandbox.docker.setupCommand
일반적인 함정:
  • 기본 docker.network"none"(이그레스 없음)이므로 패키지 설치가 실패합니다.
  • readOnlyRoot: true은 쓰기를 방지합니다; readOnlyRoot: false로 설정하거나 사용자 지정 이미지를 사용하십시오.
  • 패키지 설치를 위해서는 user가 root 여야 합니다(user을 생략하거나 user: "0:0"로 설정).
  • 샌드박스 exec 는 호스트 process.env상속하지 않습니다. Skill API 키에는 agents.defaults.sandbox.docker.env(또는 사용자 지정 이미지)를 사용하십시오.

도구 정책 + 탈출구

도구 허용/차단 정책은 샌드박스 규칙보다 먼저 적용됩니다. 도구가 전역 또는 에이전트별로 차단되어 있다면, 샌드박스화로 다시 활성화되지 않습니다. tools.elevated는 호스트에서 exec를 실행하는 명시적인 탈출구입니다. /exec 지시문은 승인된 발신자에 대해서만 적용되며 세션별로 유지됩니다; exec을 강제로 비활성화하려면 도구 정책 차단을 사용하십시오(Sandbox vs Tool Policy vs Elevated 참조). 디버깅:
  • 유효한 샌드박스 모드, 도구 정책, 수정 구성 키를 확인하려면 openclaw sandbox explain를 사용하십시오.
  • “왜 이게 차단되었는가?”에 대한 사고 모델은 Sandbox vs Tool Policy vs Elevated를 참조하십시오. 잠금을 유지하십시오.

멀티 에이전트 재정의

각 에이전트는 샌드박스 + 도구를 재정의할 수 있습니다: agents.list[].sandboxagents.list[].tools(샌드박스 도구 정책을 위한 agents.list[].tools.sandbox.tools 포함). 우선순위는 Multi-Agent Sandbox & Tools를 참조하십시오.

최소 활성화 예제

{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main",
        scope: "session",
        workspaceAccess: "none",
      },
    },
  },
}

관련 문서