2026-05-11 OpenClaw 워크스페이스 루트, 저장소 허용 목록, 모노레포 가드레일——헤드리스 임대 Apple Silicon 클라우드 Mac(홍콩 / 도쿄 / 서울 / 싱가포르 / 미국)
헤드리스 게이트웨이는 도구가 편집하려던 저장소 밖으로 나올 때까지 거의 보이지 않습니다. 홍콩·도쿄·서울·싱가포르·미국에서 임대한 Mac mini M4에서는 동일 UID에 OpenClaw, xcodebuild 레인, 장기 서명 자료가 자주 공존합니다——「워크스페이스」는 분위기가 아니라 보안 속성입니다. 이 2026-05-11 플레이북은 파일 전송 경로 정책, launchd 환경·비밀 위생, 세션 checkpoint 규율, 병렬 레인 분리를 연결해 명시적 허용 루트, 해석된 심볼릭 링크, ~/Library나 인접 CI 트리에 손이 닿을 때 실패 폐쇄(fail-closed)하는 운영자 훈련으로 묶습니다.
공유 임대 호스트에서 워크스페이스 가드레일이 영향 반경을 가르는 이유
범위를 잘못 잡은 루트는 무해해 보이는 읽기를 키체인 인접 이슈로 바꿉니다: 모델이 상대 경로를 따라가고, launchd 아래에서 shell이 ~를 다르게 펼치거나, 오래된 심볼릭 링크가 「허용된」 하위 트리에서 다른 테넌트 체크아웃으로 이어집니다. 프로덕션 게이트웨이는 파일 시스템 루트의 포지티브 리스트를 공개합니다——「모델 상식」만 믿지 마세요. 인프라 설정 병합마다 OpenClaw 정책과 인접 CI 래퍼를 함께 검토하도록 자동화 티켓과 묶으세요.
구조: OPENCLAW_STATE_DIR, CI 체크아웃, DerivedData 인접
어시스턴트의 영구 상태는 데이터 플레인 스토리지로 취급하세요: 단명 /tmp 클론이나 작업 중에 청소기가 지우는 Xcode DerivedData 트리와는 분리합니다. 세 링——state(checkpoint+정책), workspace(승인한 git 루트), scratch(일회성보내기)——을 문서화하고 cron이 경계를 넘지 않게 하세요. CI와 어시스턴트가 UID를 공유하면 병렬 레인 글의 분리 지침을 따라 잠금 고아를 막습니다.
- State 링 — 허용 목록용 버전 관리 스니펫 + 필요 시 봉인 JSON.
- Workspace 링 — 저장소/서비스 라인당 하나 이상의 절대 루트.
- Scratch 링 — 작업별 TMP 접두 아래 TTL 디렉터리.
파일 전송 + shell 도구 정책과 통합된 허용 목록
2026-05-07 전송 플러그인 기본값은 거부 쪽으로 치우칩니다. 워크스페이스 루트도 그에 맞춰 fetch/목록이 심볼릭 링크 홉으로만 존재하는 상위로 올라가지 못하게 하세요. 환경(staging vs prod)별로 루트를 Git에 유지하고 PR로 승격——SSH 즉흥 편집은 피합니다. 모노레포에 마이크로서비스를 넣었다면 패키지별 네임스페이스 루트로 「그냥 둘러본다」는 가면의 교차 읽기를 막으세요.
readlink -f 스윕. APFS firmlink와 기업 VPN 마운트는 디스크 설정 문자를 바꾸지 않고도 경로를 바꿀 수 있습니다.
모노레포 엣지: SwiftPM 중첩, Xcode workspace, git 서브모듈
대형 모노레포는 여러 Package.swift와 하이브리드 Xcode 프로젝트로 어시스턴트를 유혹합니다. 소유 경계에 팀 의견이 갈리면 루트를 분리——예: /build/mobile/ios vs /platform/android——두 번째 허용 항목이 없으면 횡단을 금지합니다. 서브모듈은 보안 검토가 있을 때만 부모 권한을 상속하고, 그렇지 않으면 중첩 .git을 더 좁은 범위의 명시 루트로 다룹니다.
# 새 루트 승인 전 심볼릭 링크 해석
/usr/bin/python3 - <<'PY'
import os
roots = ["/var/ci/job123/acme"]
for r in roots:
print(os.path.realpath(r))
PY
대화형 어시스턴트 옆에서 CI가 클론하는 위치
단명 CI는 /var/tmp 아래 해시 폴더나 전용 볼륨에 클론하고, SSH로 띄운 어시스턴트는 ~/workspace를 기본으로 쓸 수 있습니다. 규약을 맞추고 지역별로 ASSISTANT_WORKSPACE_ROOT를 설정하고 오케스트레이터에 승인된 접두 아래로만 마운트하도록 가르치세요. GitHub Actions 셀프호스트 라벨이 OpenClaw와 같은 Mac으로 흐르면 경로를 분리해 PR 정리가 어시스턴트 scratch와 동시에 지워지지 않게 하세요.
launchd: 비대화형 게이트웨이로 루트 전달
대화형 shell은 profile을 읽지만 데몬은 읽지 않습니다. plist EnvironmentVariables나 체크섬이 있는 참조 env 파일에 허용 목록을 미러링하세요. 업데이트 후 제어된 launchctl kickstart로 재로드하고 헬스 프로브 지침에 따라 stdout을 수집——HTTP 준비와 금지 경로에 대한 파일 시스템 프로브를 모두 검증합니다.
의사결정 매트릭스: 경로 의도 vs 강제 계층
| 시나리오 | 위험 | 권장 완화 |
|---|---|---|
어시스턴트가 저장소를 읽고 ../를 따름 |
인접 서비스 비밀로의 탈출 | 양의 접두 검사 + 정규화 후 .. 세그먼트 거부 |
| 바탕화면/문서로의 심볼릭 링크 | 헤드리스 vs GUI에서 TCC 기대가 다름 | 링크 대상 해석 후 macOS 개인정보 문서와 대조 |
| UID 공유 CI + 어시스턴트 | 겹치는 트리에서 삭제 레이스 | 오케스트레이션 ID별 TMPDIR 네임스페이스 분리 |
| 긴급 핫픽스 브랜치 | 롤백 계획 없는 일시적 확대 | 기한이 있는 허용 티켓 + 자동 만료 |
워크스페이스 거버넌스 8단계 롤아웃
- 감사 로그로 지난 30일 동안 어시스턴트가 건드린 모든 파일 시스템 경로를 조사합니다.
- 최소 허용 목록을 코드화하고 확장은 VPEng+보안 검토를 요구합니다.
- 정책을 Git에 병합하고 자동화 번들에 체크섬을 붙입니다.
- plist/env를 지역별로 배포하고 헬스 curl을 수행합니다.
- 심볼릭 링크 탈출을 덮는 스크립트 거부 테스트를 실행합니다.
- 온콜이 허용 목록 PR을 빠르게 되돌릴 수 있게 훈련합니다.
- 청소 스크립트를 scratch TTL 계약에 맞춥니다.
- 분기마다 거부/허용 작업을 비교하는 회고 지표를 공개합니다.
워크스페이스 거버넌스 SLO 신호
| 신호 | 임계값 | 조치 |
|---|---|---|
| 미승인 경로 시도 | 게이트웨이당 주 > 3 | 설정 변경 동결·인시던트 트레이스 재생 |
| Git 대비 허용 목록 드리프트 | 배포되지 않은 수동 편집이 하나라도 | 호스트 롤백·PR 전용 워크플로 강제 |
| 심볼릭 링크 감사 실패 | 중대 발견 > 0 | 릴리스 차단·해석된 루트 맵 재구축 |
FAQ
| 질문 | 실무 답변(2026-05-11) |
|---|---|
루트에 /Users/ci 전체를 포함해야 하나요? |
아니요——파이프라인 또는 테넌트별로 분할하세요. 통째 루트는 허용 목록을 무의미하게 만듭니다. |
| 캐시를 위해 워크스페이스 밖에 쓸 수 있나요? | 선언된 scratch 접두 안에서만, 쿼터와 자동 제거를 붙이세요. |
Mac mini M4 임대가 파일 시스템 거버넌스를 단순화하는 이유
빠른 NVMe와 예측 가능한 통합 메모리로 심볼릭 링크 감사, 세 저장소 동시 클론, 게이트웨이 동시 헬스를 스왑 압박 없이 돌릴 수 있습니다——인시던트 중 허용 목록을 반복할 때 중요합니다. 지역 용량은 요금으로 계획하고, 루트를 넓히기 전에 망설이는 엔지니어를 SSH/VNC 가이드로 안내하세요.