AI Agent에 작업 수준 샌드박스가 필요한 이유
LLM 기반 Agent는 몇 줄 자동완성을 넘어 파일 읽기·쓰기, 터미널 실행, 의존성 다운로드, 외부 API 호출까지 수행합니다. macOS에서는 Xcode, 코드 서명, Apple Neural Engine 온디바이스 추론이 여전히 필요하지만, Linux 컨테이너로는 이 스택을 재현할 수 없습니다. 반면 일상용 MacBook에서 Agent를 그대로 실행하면 SSH 키, Keychain, IDE 전역 저장소와 동일한 권한 평면을 공유하게 됩니다.
OpenClaw는 ZovCloud 전용 Mac mini M4 하드웨어 위에서 동작하는 샌드박스 계층입니다. 각 작업에 설정 가능·추적 가능·중단 가능한 경계를 부여하면서 네이티브 macOS 기능은 그대로 사용할 수 있습니다. 머신 전체를 넘기는 대신, 샌드박스 세션마다 독립된 정책과 감사 스트림이 붙습니다—— Owner는 언제든 토큰을 무효화하고 활성 작업을 종료할 수 있습니다.
이 글은 개인의 첫 세션부터 「팀 + CI 프로덕션」까지를 다룹니다. 읽은 뒤에는 노드 프로비저닝 → OpenClaw 초기화 → policy YAML 작성 → 역할 할당 → GitHub Actions에서 격리 리뷰 세션 기동 → 감사 로그 조회·보내기까지 수행할 수 있어야 합니다.
OpenClaw 1.4.2 / macOS Sequoia 15.3 기준으로 작성했으며, 싱가포르 노드 Mac mini M4(10코어 · 16 GB · 256 GB SSD)에서 검증했습니다. 콘솔 UI는 릴리스마다 달라질 수 있으나, CLI 의미론과 YAML 필드 구조는 안정적입니다.
사전 요건: 노드, 네트워크, 권한 기대치
OpenClaw는 ZovCloud 전용 물리 서버에서 동작합니다——단독 소프트웨어 라이선스 판매가 아닙니다. 먼저 Mac mini M4 노드 개통이 필요합니다. 주문 페이지에서 5개 리전(싱가포르, 일본(도쿄), 한국(서울), 중국 홍콩, 미국 동부) 중 하나를 선택하세요. 기본 플랜은 $19.8/일부터, 결제 후 1–5분 내 개통되며 SSH·VNC 인증 정보가 이메일로 전달됩니다.
최초 초기화 시 macOS Endpoint Security 승인(파일·프로세스 감사)과 네트워크 필터 확장 권한이 요구됩니다. 사내 네트워크에서 아웃바운드 프록시를 쓰는 경우, Agent가 호출하는 API 도메인 도달 가능 여부를 확인하거나 정책 YAML에 허용 목록을 미리 넣어 두세요. 팀 운영에서는 여러 사람이 동시에 ES 프롬프트를 누르는 혼란을 피하기 위해 Owner가 초기화를 마친 뒤 Operator·Auditor를 초대하는 것이 좋습니다.
콘솔 초기화: 인스턴스에서 첫 claw status까지
-
01
콘솔에 로그인하고 인스턴스 상세 열기
내 인스턴스에서 대상 Mac mini M4를 선택하고 실행 중인지 확인합니다. 신규 노드는 먼저 SSH로 디스크·네트워크 연결을 검증하세요.
-
02
OpenClaw 탭을 열고 제로 트러스트 초기화 실행
첫 방문 시 Ed25519 키 쌍이 생성되고,
com.zovcloud.openclaw.daemon서비스가 설치되며, 감사용/var/log/openclaw/가 생성됩니다. 화면 안내에 따라 ES와 네트워크 확장을 승인하세요. -
03
멤버 및 액세스 정책 구성
액세스 제어에서 협업자를 추가하고 Owner / Operator / Auditor 역할을 할당합니다. Operator는 샌드박스 세션을 시작할 수 있고, Auditor는 감사 로그 열람만 가능——정책 편집은 불가합니다.
-
04
CLI 번들과 토큰을 받아 동작 확인
콘솔에 원라인 설치 스크립트가 표시됩니다. 노드에 SSH 접속 후
claw status를 실행——daemon: running과auth: valid가 나오면 OK. 아니면 먼저claw doctor를 실행하세요.
초기화 후 대시보드에서 활성 세션 수, 세션별 CPU/RAM 사용량, 최근 24시간 BLOCK 이벤트를 확인할 수 있으며, 보안 검토용 PDF 컴플라이언스 요약도보낼 수 있습니다. BLOCK 급증에 알림을 설정해 두면 느슨한 정책이 방치되지 않습니다.
CLI 명령 그룹과 일상 운영 리듬
일상 업무는 claw를 중심으로 돌아갑니다. 책임별로 묶으면 스크립트화하기 쉽습니다:
# 헬스 체크
claw status
claw doctor
# 세션 라이프사이클
claw run --config policy.yaml
claw run --template ci-review --detach
claw attach <session-id>
claw stop <session-id>
claw list
# 정책 템플릿
claw template list
claw template export agent > policy.yaml
claw template save my-ci-policy
# 감사 및 네트워크 연결 테스트
claw audit tail <session> --follow
claw audit query --since 24h --action BLOCK
claw audit export <session> --format json
claw net test --domain api.openai.com
정기 점검에 claw doctor를 포함하세요: 데몬 상태, Endpoint Security 승인, 감사 디렉터리 쓰기 가능 여부, 토큰 만료.
샌드박스 시작이 모호한 오류로 실패할 때는 먼저 진단——흔한 원인은 ES 승인 만료나 워크스페이스 경로 누락입니다.
프로덕션에서는 CI용과 사람 작업용 템플릿을 분리하세요: ci-review는 읽기 위주로 네트워크 허용 목록을 좁게,
agent-dev는 워크스페이스와 DerivedData 쓰기를 허용하되 ~/.ssh와 Keychain 경로는 항상 거부합니다.
프로덕션용 policy.yaml: 필드 의미와 함정
정책 파일은 샌드박스 경계의 단일 진실 공급원(single source of truth)입니다. 아래는 프로덕션 Agent에서 자주 쓰는 전체 설정 예와 각 섹션 주의점입니다:
version: "1"
session:
name: "prod-agent"
auto_cleanup: false
max_duration: "4h"
idle_timeout: "30m"
filesystem:
workspace: "~/agent-workspace"
readonly_mounts:
- /Applications
- /usr/local/bin
- /Library/Developer
deny:
- ~/.ssh
- ~/Library/Keychains
- ~/Library/Application Support/Cursor/User/globalStorage
syscalls:
preset: "agent"
deny: [ptrace, setuid, mount]
network:
allow_domains:
- "api.openai.com"
- "api.anthropic.com"
- "*.github.com"
- "registry.npmjs.org"
- "pypi.org"
block_all_others: true
log_blocked: true
session 블록은 라이프사이클을 제어합니다: max_duration으로 방치 작업이 16 GB RAM을 계속 점유하는 것을 막고,
idle_timeout으로 Agent 비활동 후 리소스를 회수합니다. auto_cleanup: false는 코드 생성 작업에서 산출물을 남겨야 할 때 적합합니다.
filesystem에서는 deny가 readonly_mounts보다 우선합니다.
OpenClaw는 심볼릭 링크 실체를 해석합니다——Homebrew 도구가 Cellar를 가리키면 Cellar를 readonly_mounts에 넣지 않으면
git이나 python3 호출이 조용히 실패할 수 있습니다.
network에서는 block_all_others: true를 유지하고 log_blocked: true를 켜세요:
미허가 아웃바운드는 차단되지만, 감사 스트림에는 알 수 없는 도메인 접근 시도가 기록됩니다.
/Applications/Xcode.app 외에 /Library/Developer를 마운트하고,
~/Library/Developer/Xcode/DerivedData를 쓰기 가능한 워크스페이스 하위 경로로 두세요.
DerivedData에 쓸 수 없으면 전체 리빌드가 강제되어 컴파일이 3–5배 느려지는 사례가 있습니다.
캐시를 Agent가 지워 18분 클린 빌드에 이른 경우도 확인했습니다.
다중 사용자 제로 트러스트: 역할, 토큰, 협업 경계
팀 운영에서는 최소 권한 원칙으로 3가지 역할을 할당합니다. 각 역할은 전용 CLI 토큰으로 인증(기본 TTL 24시간)하며, Owner는 토큰 무효화와 해당 세션 강제 종료가 가능합니다. 외부 컨설턴트에게는 기한 제한 Guest 토큰을 발급——마스터 정책 파일을 건드리지 않고 만료됩니다.
| 역할 | 샌드박스 시작 | 감사 열람 | 정책 편집 | 일반 사용자 |
|---|---|---|---|---|
| Owner | 가능 | 가능 | 가능 | 테크 리드 / DevOps |
| Operator | 가능 | 가능 | 불가 | 일상 개발자 |
| Auditor | 불가 | 가능 | 불가 | 보안 / 컴플라이언스 |
여기서 제로 트러스트란 모든 CLI 호출이 단기 토큰을 동반하고, 정책 변경·고위험 작업(네트워크 허용 목록 확대 등)은 Owner 전용이며,
모든 ALLOW/BLOCK 이벤트가 변조 탐지 가능한 감사 스트림에 들어간다는 뜻입니다.
Owner 토큰을 CI 시크릿 저장소에 넣지 마세요——파이프라인용으로 ci-review 템플릿에만 묶인 Operator 토큰을 발급하세요.
GitHub Actions 통합: PR마다 샌드박스 세션 1개
ZovCloud M4를 셀프 호스팅 Runner로 등록한 뒤, PR 파이프라인에서 AI 코드 리뷰마다 격리 샌드박스를 기동할 수 있습니다. 패턴은 고정입니다: 세션 시작 → 샌드박스 내 Agent 실행 → 성공·실패와 무관하게 감사보내기 → 세션 종료.
# .github/workflows/ai-review.yml
name: AI Code Review (Sandboxed)
on: [pull_request]
jobs:
review:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
- name: Start OpenClaw sandbox
run: |
claw run --template ci-review --detach
SESSION=$(claw list --json | jq -r '.[0].id')
echo "SESSION_ID=$SESSION" >> $GITHUB_ENV
- name: Run AI review agent
run: |
claw attach $SESSION_ID --exec \
"claude -p 'Review this PR for security issues'"
- name: Export audit log
if: always()
run: |
claw audit export $SESSION_ID \
--format json \
--output audit-${{ github.run_id }}.json
- name: Stop sandbox
if: always()
run: claw stop $SESSION_ID
ci-review 템플릿 YAML은 저장소 .openclaw/에 두고 워크플로와 함께 버전 관리하세요——
정책 변경은 Code Review를 거쳐 보안 팀이 유효 경계를 검사할 수 있습니다.
여러 프로젝트가 한 노드를 공유할 때는 저장소별로 다른 Runner 라벨을 등록하거나,
OpenClaw로 세션별 파일시스템 범위를 제한해 Agent가 다른 프로젝트 소스 트리를 읽지 못하게 하세요.
감사 로그, 알림, 흔한 장애 대응
이상 징후 조사 시 감사 스트림을 시간·유형으로 필터링합니다:
claw audit query --since 7d --action BLOCK --type network --format table
claw audit query --since 24h --action BLOCK --type write --format json \
| jq '.[] | select(.target | contains("/etc"))'
컴플라이언스보내기는 JSON, CSV, PDF를 지원합니다. PDF에는 세션 요약, ALLOW/BLOCK 통계, 정책 스냅샷, 타임라인이 포함되어 감사인에게 바로 전달할 수 있습니다.
콘솔에서는 「한 세션에서 시간당 BLOCK > 50건」이나 「~/.ssh 읽기 시도」 같은 규칙으로 알림을 설정해 Owner에게 이메일 또는 Webhook으로 통지할 수 있습니다.
| 증상 | 추정 원인 | 조치 |
|---|---|---|
| git / python 호출 실패 | 도구 경로 미마운트 | 심볼릭 링크 확인; Cellar를 readonly_mounts에 추가 |
| Xcode 빌드가 매우 느림 | DerivedData 쓰기 불가 | 쓰기 가능한 워크스페이스 하위 경로 추가 |
claw run 타임아웃 |
ES 승인 만료 | claw doctor 안내에 따라 재승인 |
| 네트워크 전부 BLOCK | 도메인 미허용 | claw net test로 확인 |
| 감사 디스크 사용량 증가 | 고빈도 작업 로그 증가 | 로그 로테이션 또는 필터 임계값 조정 |
전체 감사는 M4 10코어에서 CPU 약 3% 오버헤드——대부분 워크로드에서 무시할 수 있습니다.
지연에 민감한 엣지 케이스에서는 세밀한 syscall 감사를 끄고 파일/네트워크 계층만 남길 수 있으나, 프로덕션에서는 전체 감사를 권장합니다.
프로덕션 투입 전 체크리스트: 작업당 세션 1개; 정책 YAML을 Git으로 관리하고 리뷰;
~/.ssh, Keychain, IDE 전역 저장소는 항상 거부; 네트워크는 기본 거부 + 명시적 허용 목록;
max_duration과 idle_timeout 설정; CI에서 if: always()로 감사보내기; BLOCK 알림 구성.
로컬 대신 클라우드 전용 Mac에서 OpenClaw를 돌릴 때
MacBook에서 Agent를 그대로 실행하면 일상 머신과 동일한 권한 평면이 되고, 작업 수준 감사가 없습니다. 8 GB 기기에서는 장시간 작업 시 swap이 쉽게 발생하고, CI를 7×24로 돌리기도 어렵습니다. 퍼블릭 클라우드 macOS 인스턴스는 가상화가 많아 Neural Engine 패스스루와 내장 샌드박싱이 빠지는 경우가 있습니다. 최소 이용 기간이나 종량제에서는 유연한 일 단위 물리 전용기가 더 저렴할 수도 있습니다. GitHub Actions macOS Runner는 분 단위 고가 과금, 공유 환경, 정책 제어 부족, 피크 시간 대기열이 문제입니다.
ZovCloud는 전용 Mac mini M4($19.8/일, $53.5/주, $99.1/월부터), 내장 OpenClaw, 5개 리전·1–5분 개통, 7×24 실인력 지원을 제공합니다——이 가이드의 협업·CI·감사 흐름은 이 스택을 전제로 합니다. 노트북이 포화 상태라면 싱가포르나 한국(서울)에서 일 단위로 임대해 같은 저장소와 Agent 작업을 돌려 감사 완전성과 완료 시간을 비교한 뒤, 프로덕션 리뷰 파이프라인을 클라우드에 둘지 결정하세요.
임대 종료나 해지 시 ZovCloud는 안전한 디스크 소거를 자동 실행합니다.
노드 해제 전 claw audit export로 감사 로그를 객체 스토리지에 아카이브해
컴플라이언스 증적이 인스턴스와 함께 사라지지 않게 하세요.
가볍게 시작하려면 5분 퀵스타트부터. 팀·CI 시나리오는 이 가이드로 확장할 수 있습니다.
OpenClaw 샌드박스를 프로덕션 파이프라인에
ZovCloud Mac mini M4 전용 노드: 제로 트러스트 협업, 전체 감사 로그, 16 GB 통합 메모리와 38 TOPS AI 연산——$19.8/일부터, 계약 묶임 없음.