이 글의 핵심 포인트
- 장수 클라우드 키를 러너에 심지 말 것: 업로드 권한은 컨트롤 플레인에서 발급하고, 러너는 단일 목적 URL이나 분 단위 역할 세션만 소비합니다.
- 프리사인 URL은 폭발 반경 줄이기에 강함: 버킷·접두사·HTTP 동사·체크섬 헤더·만료를 제한한 뒤 로그에는 비밀이 아니라
grant_id만 남깁니다. - STS 형 흐름은 회계를 더함: External ID가 있는 assume-role,
tenant_id·pipeline_id세션 태그, 러너 리스 수명에 묶인 의무 로테이션. - 무결성은 감이 아니라 매니페스트: 다이제스트, 서명 키 ID, 러너 어테스테이션을 아티팩트 버전당 한 행의 구조화 레코드로 고정합니다.

1. 위협 모델: 공격자가 실제로 원하는 것
침해된 러너는 멋진 REST를 통해 데이터를 빼내기보다 환경 변수를 긁거나 CI 비밀을 가로채고 로그에 남은 토큰을 재생합니다. 목표는 셸 권한이 있어도 공격자가 미리 정한 접두사에 쓰기할 수 있는 창이 짧고, 리스 안에서 새 권한을 추가 발급할 수 없게 만드는 것입니다. 이를 위해 업로드 승인(컨트롤 플레인)과 업로드 수행(러너)을 분리하고, 가능하면 게스트에 IAM 사용자 자격을 두지 않습니다.
위험 등급별 라우팅·쿼터·사람 게이트가 출구 정책과 같은 테이블에서 읽히면, 사고 후 복기 때 “왜 이 잡은 광범위 업로드 역할을 받았는가?”를 짧게 답할 수 있습니다. 실행면을 어떻게 쪼개는지는 OpenClaw 실행 전략과 Runner 프로파일: 위험 등급 라우팅, 테넌트 쿼터와 사람 게이트——클라우드 Mac 연산을 통제된 실행면으로 포장하기와 함께 보는 것이 좋습니다.
2. 프리사인 URL과 단명 STS 세션
프리사인 URL은 승인을 컨트롤 플레인에 둡니다. 러너는 동사·객체 키·선택적 SSE-KMS 키·콘텐츠 길이 상한이 박힌 불투명 URL만 받습니다. 비밀이 상시 환경 변수로 깔리지 않으면 유출 표면이 줄어듭니다—와일드카드 키를 허용하지 않고 TTL을 분 단위로 유지한다는 전제 하에서요.
STS 계열 페더레이션(클라우드 assume-role, CI IdP의 OIDC, 자체 브로커)은 멀티파트 업로드·다중 객체·동적 키 이름이 필요할 때 유리합니다. 세션을 runner_lease_id에 묶고, 예상 잡 시간+여유만큼만 길게 허용하며, 테넌트 단위 태그를 붙여 CloudTrail류 로그를 테넌트로 필터링합니다. 환경마다 같은 External ID를 재사용하면 폭발 반경이 조용히 합쳐지니 피하세요.
| 패턴 | 잘 맞는 경우 | 주의점 |
|---|---|---|
| 프리사인 PUT/POST | 객체 수가 적고 키가 고정적이며 러너 로직을 최소화할 때 | 시계 오차로 만료 실패; 전체 URL 로깅; 체크섬 미강제 |
| 단명 역할·세션 | 멀티파트, 동적 매니페스트, 많은 캐시 레이어 | 과도한 신뢰 정책; 러너 리스보다 오래 사는 세션 |
| 하이브리드 | 큰 아티팩트는 멀티파트 역할, 메타데이터는 작은 JSON 프리사인 | 두 경로의 감사 필드 불일치 |
업로드 권한을 새지 않고 로깅하기
구조화 로그에는 grant_id, 버킷, 정규화된 객체 접두사, 발급 주체, 업로드 시작 시점의 남은 TTL만 넣고 프리사인 쿼리 문자열은 넣지 않습니다. STS라면 role_arn, 세션 이름, 태그 집합을 남기고, 서명 CA 로테이션 일정을 공표해 “14:03 UTC에 어떤 신뢰 고리가 살아 있었는가?”를 티켓 사냥 없이 답합니다.
3. 승격 전 Runner 무결성 검증
모든 빌드 출력은 업로드가 끝나기 전에 수집한 증거로 고정되기 전까지 비신뢰로 둡니다. 암호학적 다이제스트(SHA-256 이상), 선택적 Sigstore류 서명, Git 커밋 SHA, 툴체인 버전, OpenClaw 잡·워크플로 식별자를 한 묶음으로 기록합니다. 클라이언트는 객체 스토어가 검증하는 Content-SHA256 등을 보내 전송 중 변조가 조용한 손상이 아니라 하드 실패로 드러나게 합니다.
GPU·RAM 압박으로 컴파일이 들쭉날쭉하면 운영자가 네트워크 유령을 쫓기도 하는데, 실제 원인은 메모리 경합인 경우가 많습니다. 러너 크기와 텔레메트리를 먼저 맞춰야 무결성 검사 자체를 신뢰할 수 있습니다. 관련 지표와 완화책은 Apple Silicon 클라우드 Mac Runner 메모리 피크와 스왑 거버넌스: 컴파일·Docker·Xcode 공존 시 관측 지표, 성능 저하 전략, 요금제 메모리 경계를 참고하세요.
4. 인입 파이프라인과 감사 체인
세 가지 기록을 한 시계열로 맞춥니다: (1) 권한 발급—누가 어떤 업로드 범위를 승인했는지; (2) 러너 어테스테이션—다이제스트 매니페스트와 리스 메타데이터; (3) 스토리지 확인—버킷의 버전 ID나 ETag. 이들을 OpenClaw 이벤트 전반에 걸쳐 하나의 artifact_id로 묶으면 웹훅 소비자와 SIEM 질의가 같은 어휘를 씁니다.
스크린샷보다 불변 로그가 낫습니다. 구조화 JSON을 기존 보존 계층으로 스트리밍하고, 프리사인 쿼리는 제거하며 서명 재료는 지문만 저장합니다. 감사인이 “파이프라인 중간에 바이너리가 바뀔 수 있었나요?”라고 물으면 컨트롤 플레인·러너 에이전트·객체 스토어 액세스 로그의 정렬된 타임스탬프로 답해야 하며, 서술형 문장만으로는 부족합니다.
5. 맺음말
산출물 출구의 최소 권한은 대부분 지루한 배관—짧은 TTL, 좁은 접두사, 매니페스트—이지만, 팀이 공격적인 자동화를 도입해도 모든 클라우드 Mac 러너가 떠도는 관리자 자격이 되지 않게 해 줍니다. 컨트롤을 OpenClaw 잡 템플릿에 초기부터 넣으세요. 사고 후에 붙이는 것은 거부 기본 객체 ACL을 첫날부터 강제하는 것보다 느리고 시끄럽습니다.
클라우드 Mac에서는 경계가 명확한 출구와 Apple Silicon 처리량이 잘 맞습니다
Apple Silicon 러너는 RAM과 디스크가 피크 구간을 버티면 Xcode 아카이브 처리가 빠르고, macOS는 OIDC와 키체인 친화 워크플로와 어울려 업로드가 같은 리스의 서명 신원과 공존해야 할 때 유리합니다. 전용 클라우드 Mac mini 티어는 동시성이 예측 가능해 프리사인 TTL과 STS 세션을 빡세게 잡아도 만료 레이스가 만성화되기 어렵습니다.
OpenClaw 기반 빌드를 잠글 수 있고 계측 가능한 호스트에서 돌리고 싶다면 kvmboot 클라우드 Mac mini M4가 실용적인 출발점입니다—요금제와 사양을 확인하고 출구 정책을 실제로 통제하는 하드웨어에 맞춰 조정해 보세요.