임대 Mac mini: 로그인 키체인과 SSH 세션 키체인으로 codesign·노타리제이션—2026 VmMac 매트릭스
VmMac에서 Apple Silicon Mac mini를 임대해 iOS 릴리스를 돌리는 릴리스 엔지니어는 비슷한 벽에 부딪힙니다. VNC 데스크톱의 Xcode에서는 codesign이 성공하는데, SSH에서는 errSecInternalComponent가 나오거나 키체인 대화 상자가 렌더링되지 않아 조용히 실패합니다. 이 2026 매트릭스는 로그인 키체인과 세션·파일 키체인을 비교하고, 아홉 단계 롤아웃과 홍콩·일본·한국·싱가포르·미국 리전에서의 잠금 해제 실패 수치 임계값을 정리합니다. LaunchAgent plist 비밀·환경 변수 위생과 다중 계정·빠른 사용자 전환 격리를 함께 읽어 테넌트 간 서명 신원이 섞이지 않게 하십시오.
SSH 부트스트랩은 도움말, 컴파일 전용 호스트와 서명 전용 호스트를 나눌 때 비용은 요금, 사람이 개입해야 하는 드문 잠금 해제는 VNC 가이드에 맡기고 무인 CI에는 끌어들이지 마십시오.
골든 VM 이미지가 인증서를 굽던 이유와 베어 메탈 macOS가 대체하는 것
하이퍼바이저 스냅샷은 서비스 계정 키체인에 이미 잠금 해제된 인증서를 실어 보내는 문화가 있었습니다. VmMac에서는 macOS 기본값으로 돌아가므로 login.keychain-db는 최초 GUI 로그인한 사람에게 묶이고, SSH 자동화는 다른 보안 맥락에서 동작합니다. 명시적 security 명령, 예측 가능한 경로, GUI 잠금 해제 프롬프트에 의존하지 않는 운영으로 골든 이미지 수준의 재현성을 되찾으십시오.
클라우드 Mac을 “짧은 수명 VM”처럼 다루는 팀일수록 키체인 수명 설계가 흐려지기 쉽습니다. 체크아웃마다 사용자를 바꾸는 편이 깔끔해도, 인증서 가져오기·삭제를 자동화하지 않으면 오래된 ACL이 디스크에 남습니다. 티어다운 스크립트에 “해당 파일 키체인을 반드시 삭제하고 검색 목록을 기본으로 되돌린다” 단계를 넣고, 홍콩·일본·한국·싱가포르·미국 각 리전에서 같은 순서를 지키십시오.
codesign 전후에 security find-identity -v -p codesigning을 반드시 기록하면 “인증서는 있는데 서명만 실패”류 분석이 빨라집니다. 로그에는 호스트명·사용자명·키체인 절대 경로를 포함하고, 대시보드에서는 릴리스 브랜치와 맞출 수 있게 하십시오. VmMac 임대 풀에서 호스트마다 미묘하게 다른 검색 순서가 쌓이면, 한 리전만 간헐적으로 실패하는 악몽 같은 장애가 됩니다. 표준 런북 한 장에 “검색 목록 덤프 명령”을 고정해 두고, 프로비저닝 직후와 분기별 감사 때마다 실행하십시오.
- 신원 분리: 대화형 개발자와
launchd에이전트 사이에서 키체인과 검색 순서를 나눕니다. - 하드웨어 결합 키: YubiKey 정책이 있다면 CI로 비밀키를 보내지 않습니다.
- Apple 공증 자격 증명: App Store Connect API 키 로테이션을 잊으면 스프린트 중간에 만료됩니다.
SSH 비대화형 고통: errSecInternalComponent와 사라진 GUI 프롬프트
ssh ci@host xcodebuild가 WindowServer에 붙지 못하면 “항상 허용”을 전제로 한 정책은 교착 상태가 됩니다. macOS가 ACL 결정을 재부팅까지 캐시하면 증상은 간헐적입니다. 파이프라인 구조화 로그에 키체인 경로, partition ID, codesign 호출 ID를 반드시 출력해 호스트 차이를 며칠이 아니라 몇 분 안에 좁히십시오.
또 다른 미묘한 실패는 partition 분리입니다. VNC로 로그인한 상태에서 가져온 인증서는 GUI 맥락 ACL이 남아 비대화형 codesign을 거부할 수 있습니다. 사람이 서명 신원을 만질 때마다 -T /usr/bin/codesign로 재가져오기를 필수 위생으로 두고, 생 SSH 세션에서 재검증한 뒤에만 프로덕션 준비 완료를 선언하십시오. Apple Distribution 인증서를 분기 중간에 교체한다면 각 VmMac 리전에 짧은 유지보수 창을 두어 야간 빌드와 경쟁하지 않게 하십시오.
notarytool과 altool 자격 증명은 서명 신원과 다른 객체입니다. 호스트는 로컬 서명은 성공해도 ASC API 키가 잘못된 키체인 파일에 있거나 서비스 계정에 Developer 역할이 없으면 업로드는 실패합니다. 볼트 경로를 분리해 문서화하고, 어떤 자동화 사용자가 어떤 파일을 읽는지 명시해 엔지니어가 공유 미니의 로그인 키체인에 임의의 .p12를 끌어다 놓는 “응급 처치”를 하지 않게 하십시오. 한국·싱가포르·미국 등 지역마다 네트워크 지연이 달라도 키체인 API 자체는 같지만, 공증 업로드 재시도 정책은 지역별로 튜닝해야 할 때가 있습니다. 그 경우에도 검색 목록과 절대 경로는 동일하게 유지하고, 백오프 상수만 문서화된 예외로 두십시오.
security unlock-keychain -p 사용 기록은 /usr/local/bin에 봉인된 래퍼 스크립트를 통해서만 남기고, YAML에 인라인 비밀번호를 넣지 마십시오.
매트릭스: 로그인 키체인 vs 세션 파일 키체인 vs 임시 키체인
| 모델 | 적합한 용도 | SSH 위험 | 로테이션 비용 |
|---|---|---|---|
| 기본 로그인 키체인 | VNC 대화형 Xcode | 높음—GUI 잠금 해제 이력에 의존 | 침해 전까지 낮음 |
| CI 전용 파일 키체인 | 무인 빌드 | 낮음—명시적 -k 경로로 억제 |
중간—분기별 로테이션 |
| 작업마다 ephemeral 임시 키체인 | 극도로 신중한 PR 빌드 | 매우 낮음 | 높음—매 실행 가져오기 CPU 부담 |
코드사인, 공증, Fastlane: 비밀이 사는 위치
Fastlane Match는 git 암호화 저장소가 기본입니다. 여기에 ci 사용자만 읽을 수 있는 파일 키체인을 겹칩니다. 공증은 비밀 관리자에서 짧은 수명 환경 변수로 주입하는 App Store Connect API 키를 선호하십시오. OpenClaw를 쓰지 않더라도 plist 비밀 레이어링 패턴을 그대로 응용할 수 있습니다. 가능하면 xcrun notarytool 자격 증명을 디스크에 두지 않고, 불가피하면 RAM 디스크 경로에 두고 24시간마다 지우는 정리 작업을 붙이십시오.
CI에서 match를 호출하기 전에 래퍼가 항상 security default-keychain과 실제 검색 목록을 로그로 남기고 기대와 어긋나지 않았는지 검증하십시오. Fastlane verbose만으로는 키체인 쪽 이상이 묻히기 쉬워, 서명 단계 표준 오류를 별 스트림으로 저장하면 사후 조사가 수월합니다. 여러 팀 ID를 다루는 배포 파이프라인에는 환경 변수 CODE_SIGN_IDENTITY와 실제 가져온 인증서 지문을 대조하는 가드를 넣으십시오. VmMac에서 “어제까지 되던 게 오늘 다른 팀으로 서명된다”는 사고는 검색 순서 선두가 바뀌었을 때 자주 납니다.
security list-keychains -s ~/Library/Keychains/ci-build.keychain-db login.keychain-db
보안 분할: 빌드 풀 vs 대화형 서명 스테이션
컴파일 팜과 서명 스테이션이 같은 기본 키체인 검색 목록을 공유하지 마십시오. VmMac 고객은 미니 두 대를 임대하는 패턴이 흔합니다. 한 대는 컴파일과 단위 테스트에 특화, 다른 한 대는 VNC를 허용해 Apple이 아직 완전 자동화하기 어려운 배포 인증서를 다룹니다. 신입이 데스크톱 신원을 빌드 호스트로 복사해 CI를 “고치는” 사고를 막으려면 내부 위키에 경계를 명시하십시오.
2026년 아홉 단계 롤아웃
- GUI 자동 로그인 없는
ci-buildmacOS 사용자를 만듭니다. - 볼트에 저장한 강한 난수 비밀번호로 파일 키체인
ci-build.keychain-db를 생성합니다. codesign과productsign만 허용하도록 명시적 ACL로 서명 인증서를 가져옵니다.- SSH 강제 명령 래퍼에서
security list-keychains로 검색 목록을 고정합니다. - 비밀번호는 argv가 아니라 FD 3에서 읽는
UnlockKeychain헬퍼를 추가합니다. launchd표준 출력·오류를 상관 ID가 있는 구조화 로그로 연결합니다.- 재부팅 리허설: 에이전트가 사람 손 없이 서명하는지 확인합니다.
- 홍콩·일본·한국·싱가포르·미국에서 동일 plist와 키체인 경로를 미러링합니다.
- 분기별 훈련: 인증서 한 장을 폐기하고 리전별 복구 시간을 측정합니다.
VmMac 다섯 리전 동등성(홍콩 / 일본 / 한국 / 싱가포르 / 미국)
지연 시간은 키체인 API를 바꾸지 않지만 시각 스큐는 공증 타임스탬프를 깨뜨립니다. 모든 호스트에서 동일 NTP 규율을 쓰고 macOS 메이저 업그레이드 후 sntp -d 출력을 로그에 남기십시오. 리전마다 다른 App Store Connect 서비스 계정을 쓰면 매니페스트에 명시하십시오. 조용한 분기는 잘못된 팀 ID로 서명된 빌드를 출하하게 만듭니다.
운영 동등성은 동일한 키체인 검색 순서와 동일한 파일 경로를 의미합니다. 도쿄 엔지니어가 ~/Library/Keychains/ci.keychain-db를 symlink하고 싱가포르가 /var/lib/ci/keychains/prod.keychain-db를 쓰는 안티패턴은 Ansible을 갈라놓고 사고 대응 시간을 낭비하게 합니다. 환경 등급당 절대 경로 하나로 표준화하고, 베어 메탈 Mac 풀용 내부 Terraform에 넣으며, 래퍼 스크립트 체크섬과 볼트 시크릿 버전으로 승격을 게이트하십시오.
notarytool 업로드 재시도의 네트워크 이그레스 차이는 TLS 핸드셰이크 스파이크로 나타날 수 있어도 VmMac 홍콩 엣지가 건강한 경우가 많습니다. 지수 백오프를 스크립트에 넣되, 백오프가 진짜 키체인 잠금 실패를 가리지 않게 로그에 region=HK|JP|KR|SG|US 태그를 붙여 Grafana 패널에서 오탐과 Apple API 장애를 나누십시오. 한국 리전에서 테스트한 동일 런북을 미국 샌드박스에 그대로 복제할 수 있어야 엔지니어 교대가 매끄럽습니다.
잠금 해제 실패에 대한 수치 임계값
| 신호 | 임계값 | 조치 |
|---|---|---|
| 키체인 오류가 있는 코드사인 실패 | 시간당 > 2회 | 플랫폼 온콜; 릴리스 동결 |
| 잠금 해제 헬퍼 지연 | p95 > 800ms | 볼트 또는 디스크 경합 조사 |
| 만료 임박 배포 인증서 | 만료 < 21일 | 자동 티켓 로테이션 |
FAQ: 임대 Mac mini의 키체인과 코드사인
iCloud 키체인을 CI에 쓸 수 있나요? 아니요. 동기화로 상태가 변해 재현성이 깨집니다.
VmMac이 내 키체인을 잠금 해제하나요? 아니요. 비밀은 고객 소유이고 VmMac은 하드웨어와 네트워크를 제공합니다.
Developer ID Application 인증서는? 같은 매트릭스입니다. 파일 키체인과 정책상 필요한 하드웨어 토큰을 선호하십시오.
CI 로그에 security set-key-partition-list가 보여야 하나요? 가져오기 후 의도적으로 신원을 재봉인할 때만입니다. 그 외 예상치 못한 호출은 누군가 ACL을 수동 편집했다는 신호로 검토하십시오.
유출 의심 후 호스트 안전을 어떻게 증명하나요? 키를 교체하고, 손상된 키체인 파일을 완전히 삭제한 뒤 볼트에서 재생성하고, 정책이 엄격히 요구하지 않아도 자동화 사용자 비밀번호를 바꾸십시오. 공유 임대 하드웨어에서는 값싼 보험입니다.
Mac mini M4와 VmMac이 서명 풀을 단순화하는 이유
Mac mini M4는 단일 스레드 서명 지연을 충분히 낮춰 PR 검증에서 ephemeral 키체인 가져오기가 현실적입니다. VmMac은 홍콩·일본·한국·싱가포르·미국에 발을 두어 테스터 가까이에 서명 호스트를 두면서 컴파일 버스트 용량은 분리할 수 있게 하고, 키체인 프롬프트를 돌보기 위한 여분 노트북 구매를 요구하지 않습니다. 임대는 유출 의심 호스트를 장부상 감가 없이 퇴역시킬 수 있다는 뜻이기도 합니다. 장기적으로는 동일 런북과 동일 임계값으로 다섯 리전을 운영해 온콜 피로를 줄이고, 신규 엔지니어 온보딩 시 “왜 VNC에서는 되고 SSH에서는 안 되는지”를 문서 한 권으로 설명할 수 있게 하십시오.