보안 2026년 5월 6일

2026년 ProxyMac Mac mini에서 OpenClaw MCP 파일시스템 허용목록, POSIX 샌드박스 루트, 폭발 반경 통제

ProxyMac 엔지니어링 팀 2026년 5월 6일 약 13분 읽기

OpenClaw 에이전트가 홍콩·일본·한국·싱가포르·미국에 있는 임대 Mac mini M4에서 빌드를 조율할 때, 업스트림 MCP 파일시스템 서버를 켜 모델이 저장소 diff나 로그를 읽게 하는 경우가 많습니다. 편의는 서버 argv 루트가 홈 전체를 포함할 때 재앙이 됩니다—MCP는 정책 메모가 아니라 게이트웨이를 실행하는 Unix 사용자의 POSIX 권한을 그대로 물려받기 때문입니다. 이 플레이북은 (1) 파일시스템 도구의 위협 모델, (2) 읽기·쓰기·스크래치를 나누는 3단 디렉터리 계약, (3) 자동화 계정과 디렉터리를 매핑하는 권한 매트릭스, (4) 7단계 강화 런북, (5) 누군가 자정 데모에 chmod -R 777을 박았을 때의 사고 대응을 다룹니다. 런타임 모니터링에는 분당 open(2) 실패 횟수를 포함하세요—지속적인 ENFILE·EMFILE 스파이크는 에이전트가 거절된 트리를 두드리며 멈추지 않는 신호입니다. 기본기는 MCP 서버 설정, 시크릿·키체인, macOS TCC와 겹쳐 방어가 층층이 되게 하세요.

분기마다 스테이징에서 argv 루트를 의도적으로 넓혀 JSONL 알람을 보고, 30분 안에 다시 조이는 테이블탑을 넣으면 프로덕션 에스컬레이션 때 즉흥이 줄어듭니다.

규제 산업에서는 “에이전트가 읽을 수 있는 경로”를 데이터 분류와 1:1로 연결해야 합니다. PCI나 HIPAA 범위에 들어가는 트리가 scratch에 섞이면, 단순 chmod 실수도 보고 의무로 이어질 수 있습니다.

macOS 게이트웨이에서 파일시스템 MCP가 브라우저 자동화 위험을 압도하는 이유

헤드리스 Chromium 한계와 달리 파일시스템 MCP는 데몬 UID가 읽을 수 있는 모든 경로를 순회할 수 있습니다—로스터가 홈을 잘못 잡으면 ~/.ssh의 개인키까지요. 프롬프트 인젝션은 원격 코드 실행이 필요 없습니다. 모델에게 정중히 cat ~/.aws/credentials을 부탁하면 됩니다. 따라서 IAM 역할과 같은 엄격함으로 디렉터리를 범위 지정하세요: 기본 거부, 포함마다 티켓 ID, 프롬프트는 매주 악화될 수 있다고 가정합니다.

JSONL에 경로 해시만 남기면 SOC는 고객 파일명을 저장하지 않고도 스파이크를 재생할 수 있습니다.

  • 숫자: MCP JSONL을 남기는 팀은 긴 세션당 파일시스템 작업 120–400건을 자주 보며, 경로 이름만으로도 메타데이터가 새 나갈 수 있습니다.
  • Apple Silicon: APFS 클론은 “복제” 단축키가 환경 간 inode 스냅샷을 실수로 공유할 수 있으니 Finder 복사 의미로 격리를 가정하지 마세요.
  • 감사: 해시된 경로를 JSONL 진단으로 보내 SOC가 스파이크를 재생하게 하세요.

3단 허용목록: 읽기 루트, 쓰기 루트, 스크래치 루트

목적대표 APFS 경로허용 MCP 동사
읽기 전용 말뭉치벤더 SDK, 승인 문서/srv/oc-mcp/read/sdk-cache목록+바이트 읽기
쓰기 말뭉치생성 아티팩트, 빌드 산출/srv/oc-mcp/write/build-out하위 트리 내 생성/추가
스크래치일시 diff 덩어리/srv/oc-mcp/scratch/$JOB_ID심볼릭 링크 탈출 제외

스크래치를 쓰기 루트로 심볼릭 링크하지 마세요—ACL 상속이 어긋나면 macOS가 순회를 허용할 수 있습니다. 업그레이드 후 chmod -h 감사를 명시적으로 돌리세요.

외장 SSD 바인드 마운트는 SSD를 뽑는 순간 MCP 캐시에 오래된 inode 핸들이 남을 수 있으니, 하드웨어 교체 후 게이트웨이를 재시작하고 24시간 이내 스크래치 폴더는 자동 무효화하세요.

POSIX 매트릭스: LaunchDaemon 사용자를 파일 범위에 매핑

Unix 계정주 그룹umask소유 디렉터리
automationstaff027/srv/oc-mcp/*
builder (대화형)developer022Homebrew 트리, MCP 루트 아님
rootwheeln/aMCP 서버를 root로 실행 금지—exec 전 권한 낮추기
소유권 의식: 한 번 sudo chown -R automation:staff /srv/oc-mcp 후 LaunchAgent 안에서는 sudo 금지—브레이크 글래스 스크립트는 체크섬 태그와 함께 git에 둡니다.

서비스 계정에 로그인 셸을 주지 말고, 홈 디렉터리를 /srv/oc-mcp 아래로 고정하면 틸드 확장이 홈 밖으로 새는 일이 줄어듭니다.

프로덕션에서 파일시스템 MCP를 켜기 전 7단계 강화 런북

  1. 인벤토리 동결: 구성 관리에 있는 모든 MCP argv 루트를 문서화—Downloads 아래 그림자 복사본 금지.
  2. 필요 시 sticky bit가 있는 APFS 폴더/볼륨 생성; 작업 ID별로 날짜 접두 스크래치 분리.
  3. 환경 다이어트: 가능하면 LaunchAgent에 HOME=/srv/oc-mcp svc를 두어 틸드 확장이 방황하지 않게.
  4. 시크릿 방화벽: 토큰은 읽기 루트 밖에 두거나 시크릿 가이드대로 키체인 항목 사용.
  5. 프롬프트 린트: 게이트웨이 미들웨어로 허용목록 밖 절대 경로 언급을 차단.
  6. 카나리아: 스테이징에서 ../../etc/passwd 읽기 시도—결정적 거부와 로그를 기대.
  7. 분기 검토: find /srv/oc-mcp -perm +020 출력을 정책 베이스라인과 diff—넓어지면 롤백.
알림: 화면 녹화 TCC는 POSIX 읽기를 가두지 않습니다—TCC 글의 프라이버시 토글만으로는 부족하고 파일 ACL을 짝지으세요.

런북 끝에 “누가 argv를 넓혔는지, 어떤 테스트가 놓쳤는지” 회고 슬롯을 넣으면 컴플라이언스가 PR 링크로 추적할 수 있습니다.

계약 밖을 에이전트가 읽었을 때 사고 대응

JSONL에 예기치 않은 경로 접두사나 파일 디스크립터 급증이 보이면 침해로 가정하세요. 즉시: (1) MCP plist에 launchctl bootout, (2) Time Machine이 볼륨을 덮으면 tmutil compare로 APFS 스냅샷, (3) 읽기 가능 디렉터리 근처에 있던 클라우드 PAT 회전, (4) 규제 데이터에 닿았다면 고객 통지, (5) 미들웨어 배포 전까지 가드레일 정규식으로 프롬프트 패치.

타임스탬프는 ±5분 정밀도로—재무팀은 인시던트 브리지가 청구 주기와 겹칠 때 상관관계를 원합니다.

포함 후 내부 블레임리스 리뷰: 어떤 argv가 정책보다 넓었는지, 누가 확장을 승인했는지, 어떤 자동화 테스트가 놓쳤는지, JSONL이 증거를 얼마나 보존했는지, 환경 격리가 폭발 반경을 줄였을지. 답변에 PR 링크를 붙이세요.

자주 묻는 질문

macOS 샌드박스 프로파일이 도움이 되나요? MCP 바이너리를 래핑할 때만—대부분 팀은 업스트림 서버가 서명되지 않아 디렉터리 허용목록에 의존합니다.

원격 NFS를 마운트해도 되나요? 지연에 민감한 에이전트에는 비권장—불가피하면 루트를 읽기 전용으로 두고 TCP 정체를 모니터링하세요.

대소문자 무시 APFS는요? 대소문자만 다른 중복 경로가 diff 도구를 혼란스럽게 하니 MCP에 노출 전 정규화하세요.

심볼릭 탈출은 어떻게 테스트하나요? 스크래치 안에 ln -s ../../etc/hosts를 의도적으로 만들고 MCP가 권한 오류를 보고하며 JSONL에 시도를 남기는지 확인—Node.js 소버전마다 realpath 동작이 바뀔 수 있어 반복하세요.

엄격한 MCP 자세에도 ProxyMac Mac mini가 맞는 이유

단일 테넌트 Mac mini M4는 이웃 컨테이너가 조용히 /srv 트리를 마운트하는 일이 없어 경로가 결정적이고, Apple Silicon은 에이전트가 프레임워크를 대량 읽을 때 HK / JP / KR / SG / US에서 처리량을 예측 가능하게 유지합니다. 발자국은 요금 페이지로 비교하고, 원격 운영은 도움말 센터로 표준화하며, 누군가 “잠깐만” chmod 했다고 약속한 드리프트를 눈으로 확인하려면 VNC 가이드를 곁에 두세요.

MCP 루트를 프로덕션 IAM처럼 범위 지정

OpenClaw · Apple Silicon M4 · HK / JP / KR / SG / US