Agent와 사람 사용자의 권한 요구는 근본적으로 다릅니다
사람에게 SSH 로그인 권한을 부여하면, 필요한 리소스 범위를 스스로 판단할 수 있습니다. 반면 AI Agent에 동일한 권한을 넘기면 전혀 다른 그림이 됩니다.
LangGraph, AutoGen, Cursor Background Agent 같은 Agent 프레임워크는 도구를 호출할 때 현재 macOS 사용자의 권한을 그대로 물려받습니다.
"저장소의 TODO 주석을 찾아 Markdown 표로 정리하라"는 작업이라면 /workspace 읽기와 결과 파일 쓰기면 충분해 보이지만,
실제로는 ~/Library/Keychains 접근, SSH 개인키 디렉터리 열람, curl을 통한 외부 전송까지 모두 가능합니다.
Agent가 스스로 악의적으로 행동하지 않더라도, 프레임워크에 내장된 범용 shell 도구나 외부 플러그인이 예상치 못한 호출을 일으킬 수 있고, 그 순간 당신이 화면 앞에 없을 수도 있습니다.
Apple M4 아키텍처는 이 문제를 덜 중요하게 만드는 게 아니라 오히려 더 급하게 만듭니다. 38 TOPS Neural Engine 덕분에 로컬 추론 비용이 크게 떨어졌고, Mac에서 AI Agent를 돌리는 빈도는 1년 전보다 한 자릿수는 더 높아졌습니다. 그만큼 권한 사고의 노출 시간도 함께 늘어납니다. OpenClaw는 이 지점에서 출발합니다. Agent에게 Docker 격리를 강요하면 Xcode 툴체인을 잃고, 매 작업마다 VM을 다시 띄우면 비용이 과합니다. 대신 베어메탈 macOS 위에서 정책 엔진이 시스템 호출 단계에서 초과 권한을 차단하고, 정책은 평범한 YAML 파일로 Git에 함께 버전 관리합니다.
하드웨어: Mac mini M4 · 10코어 CPU · 16 GB 통합 메모리 · 256 GB NVMe SSD · 1 Gbps 전용 대역폭(VPSRox 싱가포르 노드).
시스템: macOS 15 Sequoia. OpenClaw CLI 0.9.x, 정책 형식 v2.
데모 작업: 샌드박스 안에서 공개 GitHub 저장소 클론 → rg로 TODO 주석 스캔 → Markdown 보고서 작성. /workspace만 읽기·쓰기 허용, 아웃바운드 네트워크 차단.
전 과정은 SSH만으로 진행했으며 VNC는 사용하지 않았습니다.
시작 전: 4가지 필수 선행 조건
이 가이드는 로컬 Mac mini 클라우드 렌탈 환경을 전제로 하지 않습니다. Windows, Linux, macOS 노트북 중 어느 것이든 SSH 클라이언트만 있으면 됩니다. 다만 아래 네 가지는 시작 전에 모두 갖춰 두어야 중간에 막히지 않습니다.
M4 인스턴스
자격 증명 및 포트
instance-token
(5절 템플릿 제공)
M4 인스턴스: 아직 원격 Mac을 개통하지 않았다면 주문 페이지에서 노드와 렌탈 기간을 고르세요. 결제 후 1–5분 안에 인스턴스가 준비되며, SSH 자격 증명은 콘솔의 "접속 정보" 탭에 자동으로 표시됩니다. 싱가포르, 일본 도쿄, 한국 서울, 중국 홍콩, 미국 동부 등 5개 노드는 하드웨어 사양과 가격이 동일하므로, 팀이 주로 접속하는 지역의 지연 시간에 맞춰 선택하면 됩니다.
instance-token: 콘솔 "보안 및 샌드박스" 페이지에서 OpenClaw를 처음 켤 때 한 번 생성되며, 화면에는 단 한 번만 노출됩니다. 팝업을 닫기 전에 1Password나 Bitwarden 같은 비밀 관리 도구에 바로 저장하세요. 페이지를 벗어난 뒤에는 원래 token을 다시 볼 수 없고, 같은 화면에서 rotation으로 교체하는 것만 가능합니다. 교체 즉시 기존 token은 무효화됩니다.
콘솔에서 OpenClaw 활성화
OpenClaw는 기본값으로 켜져 있지 않습니다. 인스턴스마다 독립적으로 제어해, 감사가 필요 없는 워크로드에 불필요한 오버헤드를 주지 않기 위함입니다. 브라우저에서 할 일은 짧습니다. "활성화됨" 배지를 확인한 뒤 SSH 세션으로 넘어가면 됩니다.
-
01
인스턴스 상세 페이지 진입
VPSRox 콘솔에 로그인한 뒤 대상 인스턴스 이름을 클릭해 상세 화면으로 이동합니다. "보안 및 샌드박스" 탭에서 OpenClaw 스위치 영역을 찾습니다.
-
02
instance-token 활성화 및 저장
활성화 스위치를 켜면
instance-token이 표시됩니다(형식:oct-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx). 팝업을 닫기 전에 token을 비밀 저장소에 복사해 두고, "저장했습니다, 계속"을 눌러 진행합니다. -
03
상태가 "활성화됨"인지 확인
팝업이 닫힌 뒤 OpenClaw 영역에 녹색 "활성화됨" 배지가 보여야 합니다. 30초가 지나도 "활성화 중"이면 페이지를 새로고침한 뒤 다시 확인하세요. 브라우저에서 필요한 유일한 단계입니다.
CLI 설치 및 3가지 상태 점검
SSH로 원격 Mac에 접속한 뒤, 한 줄 명령으로 OpenClaw CLI를 설치합니다. 설치 스크립트는 macOS 버전과 CPU 아키텍처를 자동으로 감지하며, M4 베어메탈 인스턴스에서는 보통 30초 안에 끝납니다.
curl -fsSL https://api.vpsrox.com/openclaw/install.sh | bash
openclaw auth login --token <instance-token>
openclaw status
openclaw status는 세 가지 컴포넌트 상태를 반환합니다. 모두 healthy여야 다음 단계로 넘어갈 수 있습니다.
| 컴포넌트 | 역할 | 기대 상태 |
|---|---|---|
| Policy Engine | YAML 정책 해석, 시스템 호출 전 의사결정 | healthy |
| Sandbox Runtime | 샌드박스 수명 주기, 프로세스 격리, 파일 매핑 관리 | healthy |
| Audit Bus | 모든 의사결정 이벤트를 비동기로 영구 로그에 기록, 메인 경로 차단 없음 | healthy |
세 항목이 모두 녹색인 것은 필요 조건일 뿐, 충분 조건은 아닙니다. Policy Engine이 healthy라도 YAML 문법이 맞다는 뜻은 아닙니다.
정책 검증은 다음 단계에서 별도로 실행해야 합니다.
항목 중 하나라도 degraded 또는 unavailable이면
먼저 openclaw doctor로 자가 진단 보고서를 확인하세요. 흔한 원인은 커널 확장 승인 대기입니다.
이 경우 VNC로 잠시 로그인해 "시스템 설정 → 개인정보 보호 및 보안"에서 승인해야 하며, SSH만으로는 처리할 수 없습니다.
최소 권한 YAML: 정책 필드 줄별 설명
정책 파일은 샌드박스 안의 AI Agent가 할 수 있는 일과 할 수 없는 일을 정의합니다. 원칙은 처음엔 타이트하게, 필요할 때만 풀기입니다.
첫 YAML은 작업에 꼭 필요한 경로만 허용하고, 감사 로그의 deny 기록을 보면서 점진적으로 넓히세요.
처음부터 느슨하게 열어 두었다가 나중에 조이는 방식은 피하는 편이 안전합니다.
아래는 "공개 저장소 클론 → 정적 스캔 → 보고서 출력" 시나리오용 읽기 전용 템플릿입니다.
~/policies/quickstart-readonly.yaml에 저장해 사용하세요.
apiVersion: openclaw.vpsrox.com/v2
kind: SandboxPolicy
metadata:
name: quickstart-readonly
spec:
filesystem:
allow:
- path: /workspace
access: [read, write] # Agent writes scan report here
deny:
- path: "**/Keychains/**" # block signing certificates
- path: "**/.ssh/**" # block private keys
- path: "**/Library/Cookies/**" # block browser session data
process:
allow: [git, rg, python3, zsh, bash]
network:
egress: deny-all # no outbound in quickstart mode
설계상 주의할 점을 정리합니다. filesystem.deny가 allow보다 우선합니다. /workspace 전체에 읽기·쓰기를 허용해도
deny 목록에 있는 경로는 그대로 차단됩니다. 규칙 순서와 관계없이 엔진은 deny를 먼저 확인합니다.
process.allow는 프로세스명 화이트리스트입니다. 목록에 있는 실행 파일만 시작할 수 있으며,
Agent 툴체인에 node나 npm가 필요하면 함께 추가하지 않으면 E_POLICY_DENY: process 오류가 납니다.
network.egress: deny-all은 DNS 조회까지 막습니다. 첫 데모에서는 의도된 설정이며,
감사 로그에 deny 이벤트가 남아 정책 엔진이 실제로 동작하는지 확인하는 데 씁니다.
YAML 작성이 끝나면 샌드박스를 만들기 전에 검증을 실행해 문법 오류를 잡아 두세요.
openclaw policy validate -f ~/policies/quickstart-readonly.yaml
기대 출력: policy valid (0 warnings). 경로 충돌이나 필드명 오타가 있으면 validate가 해당 행 번호를 알려 줍니다.
첫 Agent 작업 제출: 샌드박스 생성 및 실행
LangGraph나 자체 프레임워크에 붙이기 전에, 결정적인 shell 스크립트로 전체 폐루프를 먼저 돌려 보는 것을 권장합니다. 이렇게 하면 실행 결과가 예측 가능하고, "정책이 막은 것"과 "Agent 로직 문제"를 분리해서 디버깅할 수 있습니다.
-
01
샌드박스 생성
openclaw sandbox create --name quickstart --policy ~/policies/quickstart-readonly.yaml
성공하면 샌드박스 ID와 상태ready가 반환됩니다. 생성 명령은 멱등적입니다. 같은 이름으로 다시 실행해도 오류 대신 "이미 존재함"을 알려 줍니다. -
02
별도 터미널에서 감사 로그 실시간 추적 시작
openclaw audit tail --sandbox quickstart --follow
이 창은 닫지 마세요. Agent 실행과 감사 기록을 동시에 봐야 전체 그림이 보입니다. 각 의사결정 이벤트는 Agent 조작 후 보통 50–200 ms 안에 나타납니다. -
03
첫 번째 터미널에서 Agent 진입 스크립트 실행
아래 예시 스크립트를
/workspace/agent-entry.sh에 저장합니다(호스트에서 만들면 샌드박스에 자동 매핑). 그다음 샌드박스 안에서 실행합니다.
openclaw sandbox exec quickstart -- /bin/zsh /workspace/agent-entry.sh -
04
작업 종료 후 샌드박스 중지
openclaw sandbox stop quickstart
중지해도 작업 공간 데이터는 호스트/workspace에 남습니다. 다음sandbox create시 자동으로 다시 마운트됩니다. 완전히 지우려면--rm옵션을 추가하세요.
#!/bin/zsh
set -euo pipefail
cd /workspace
# Attempt network — will be denied by policy (intentional demo)
git clone --depth 1 https://github.com/apple/swift-sample-code.git repo 2>/dev/null || echo "clone blocked (expected)"
rg -rn "TODO|FIXME" . --glob '*.swift' > scan-report.txt 2>/dev/null || true
echo "Scan complete: $(wc -l < scan-report.txt | tr -d ' ') matches" > summary.txt
cat summary.txt
network.egress: deny-all 설정 때문에 git clone은 네트워크 정책에 막히고, 스크립트는 "clone blocked (expected)"를 출력합니다.
이건 버그가 아니라 의도된 결과입니다. 감사 로그에 decision: deny network 이벤트가 남아, 다음 절에서 로그 구조를 확인할 수 있습니다.
스크립트가 rg 단계까지 도달했다면 /workspace 파일시스템 권한은 올바르게 잡힌 것입니다.
M4 싱가포르 노드에서 전체 스크립트(차단된 clone 포함) 실행 시간은 약 2.3초였고,
정책 엔진 의사결정 누적 오버헤드는 80 ms 이하였습니다.
감사 로그 해석: 각 행의 의미
감사 로그는 OpenClaw를 다른 샌드박스 솔루션과 구분하는 핵심입니다. 사후에만 볼 수 있는 정적 보고서가 아니라, 정책 의사결정과 동기화된 실시간 이벤트 스트림입니다. 작업 중에 tail로 보거나, 나중에 export할 수 있습니다. 각 레코드는 고정 필드 집합을 갖고 있어, 필드 의미만 익히면 로그만으로도 원인 추적이 가능합니다.
파일 읽기가 허용된 경우의 allow 이벤트 형식은 다음과 같습니다.
ts=2026-07-24T08:03:12.481Z
sandbox=quickstart
pid=8231
syscall=open
resource=filesystem
path=/workspace/agent-entry.sh
access=read
decision=allow
policy_rule=filesystem.allow[0]
latency_us=34
latency_us는 정책 엔진이 의사결정에 쓴 마이크로초입니다. policy_rule은 어떤 YAML 규칙이 적용됐는지 가리키므로,
allow/deny 중 어느 쪽이 발동했는지 빠르게 좁힐 수 있습니다.
네트워크가 차단된 deny 이벤트 형식은 다음과 같습니다.
ts=2026-07-24T08:03:12.512Z
sandbox=quickstart
pid=8233
syscall=connect
resource=network
dst=140.82.113.4:443
decision=deny
policy_rule=network.egress.deny-all
latency_us=19
이 기록은 Agent 스크립트에서 막힌 git clone에 해당합니다.
dst=140.82.113.4:443은 GitHub IP이므로, 정책을 정밀하게 열 때 참고할 수 있습니다.
network.egress를 allow-list로 바꾸고 github.com:443을 추가한 뒤
다시 validate하고 openclaw sandbox update --name quickstart --policy ...로 적용하면 됩니다.
샌드박스를 처음부터 다시 만들 필요는 없습니다.
자주 쓰는 로그 조회 명령은 다음과 같습니다.
최근 1시간 deny 기록: openclaw audit query --decision deny --since 1h.
경로 필터: openclaw audit query --resource filesystem --path "/workspace/**".
JSON 내보내기(SIEM·자동화용): openclaw audit export --sandbox quickstart --since 24h --format json > audit.json.
6가지 흔한 오류와 진단 접근
OpenClaw를 처음 쓸 때는 아래 표의 항목 중 하나 이상을 거의 반드시 만납니다. 실제 발생 빈도순으로 정리했으며, 각 행에 근본 원인과 최단 수정 경로를 적어 두었습니다. 문서 전체를 뒤질 필요 없이 여기서 바로 해결할 수 있습니다.
| 오류 현상 | 근본 원인 | 최단 수정 |
|---|---|---|
auth login에서 token 무효 메시지 |
복사 시 앞뒤 공백 포함, 또는 token이 이미 교체됨 | 콘솔 "보안 및 샌드박스"에서 다시 복사. macOS라면 pbpaste로 클립보드에 불필요한 문자가 없는지 확인 |
openclaw status 항목 중 unavailable 표시 |
커널 확장 사용자 승인 대기(최초 설치) | VNC로 인스턴스 로그인 → 시스템 설정 → 개인정보 보호 및 보안 → OpenClaw 시스템 확장 승인 → CLI 서비스 재시작 |
policy validate에서 unknown field 오류 |
YAML 필드명 오타, 또는 v1 형식의 구 필드명 사용 | apiVersion이 openclaw.vpsrox.com/v2인지 확인. 5절 템플릿과 대조 |
E_POLICY_DENY: filesystem |
Agent가 YAML allow 목록 밖 경로에 접근 | openclaw audit query --decision deny --since 1h로 대상 경로 확인 후 필요 시 filesystem.allow에 추가 |
E_POLICY_DENY: process |
Agent가 process.allow 화이트리스트 밖 실행 파일 호출 |
감사 로그에서 resource=process deny 기록 확인 후 해당 프로세스명을 화이트리스트에 추가 |
샌드박스 내 git clone 타임아웃, deny 로그 없음 |
DNS 조회가 차단됐지만 connect 전에 타임아웃 |
--verbose로 git 출력 확인. YAML 네트워크 허용 목록에 8.8.8.8:53 추가 또는 도메인 화이트리스트 모드 사용 |
instance-token은 인스턴스의 고권한 자격 증명과 동등합니다. 코드 주석, .env, Git 커밋에 넣지 마세요.
프로덕션 다중 사용자 환경에서는 콘솔에서 구성원별 zero-trust 장치 인증서와 최소 권한 역할(viewer / operator / admin)을 쓰는 편이 좋습니다.
하나의 instance-token을 팀 전체가 공유하지 마세요.
빠른 시험에서 안정적인 Agent 워크플로로
5분짜리 읽기 전용 샌드박스는 환경 검증의 출발점일 뿐입니다. 실제 프로덕션은 훨씬 복잡합니다.
Agent가 xcodebuild를 호출하려면 더 많은 프로세스와 임시 디렉터리 허용이 필요하고,
npm이나 PyPI 접근에는 세밀한 아웃바운드 네트워크 화이트리스트가 필요합니다.
CI 파이프라인에서 pull request마다 샌드박스를 자동 생성·삭제하려면 REST API나 GitHub Actions 연동도 들어갑니다.
공통된 확장 방법은 하나입니다. 정책을 추측으로 넓히지 말고, 감사 로그의 deny 기록을 보며 반복 개선하세요.
연산 여유도 참고하세요. Mac mini M4 · 16 GB 통합 메모리 1대 기준으로, DerivedData 캐시가 있는 xcodebuild 샌드박스 2개를 안정적으로 병렬 실행할 수 있었습니다.
OpenClaw 감사 프로세스와 시스템 서비스용으로 약 4 GB를 추가로 남겨 둘 여유도 있습니다.
Agent 워크로드가 계속 늘면 VPSRox Thunderbolt 5 병렬 서비스로 여러 Mac mini를 80 Gbps 클러스터로 묶을 수 있으며,
정책 파일과 감사 로그는 인스턴스별로 독립 저장됩니다.
아직 전용 원격 Mac이 없는 팀이 흔히 검토하는 대안에는 각각 분명한 한계가 있습니다. 로컬 개발 머신에서 AI Agent를 7×24 백그라운드로 돌리면 일상 개발을 방해하고, 지속 고부하에서 발열 문제가 두드러집니다. GitHub Actions 호스팅 macOS Runner 같은 퍼블릭 클라우드 VM은 공유 리소스 풀이며 OpenClaw 네이티브 연동이 없고, 피크 시간 대기는 대화형 Agent 워크플로에 치명적입니다. 사무실에 Mac mini를 직접 구매하면 하드웨어 감가상각, 유지보수 인력, 고정 공인 IP 구성 비용까지 팀이 부담해야 합니다.
VPSRox는 베어메탈 Mac mini M4(10코어 CPU · 16 GB 통합 메모리 · 256 GB NVMe · 38 TOPS Neural Engine)를 Mac mini 클라우드 렌탈 형태로 제공합니다. OpenClaw는 표준 인스턴스에 기본 내장되어 별도 설치가 필요 없습니다. 싱가포르, 일본 도쿄, 한국 서울, 중국 홍콩, 미국 동부 등 5개 노드마다 독립 공인 IPv4와 1 Gbps 전용 대역폭이 붙어 있고, 결제 후 1–5분 안에 배포됩니다. 일 $21.8부터 렌탈할 수 있습니다. Agent 실험은 일 단위로 시작하고, 검증이 끝나면 월 $109.1 장기 사용으로 전환해도 됩니다. 계약 없이 언제든 렌탈 기간을 조정할 수 있습니다.
AI Agent에게 OpenClaw 내장 전용 클라우드 Mac 제공
VPSRox Mac mini M4 전용 노드에는 OpenClaw가 인스턴스 단위로 내장되어 있습니다. 정책 엔진, 샌드박스 런타임, 감사 버스를 따로 배포할 필요 없이 바로 쓸 수 있습니다. 16 GB 통합 메모리와 38 TOPS Neural Engine으로 Agent 추론과 macOS 툴체인을 병렬 실행하고, 전 세계 5개 노드의 독립 IPv4에서 일 단위 렌탈로 시작할 수 있습니다. 장기 계약은 없습니다.