문제점: 전송 성공 로그는 올바른 상대 증명이 아니다
배포 키·OIDC는 클라이언트 측, 호스트 키는 서버 정체다. 바이트 수는 중간자를 드러내지 않는다. 빈 디스크 Runner에서 매번 스캔은 최초 신뢰 반복이다. DNS·사설 IP·bastion 별칭이 섞이면 CNAME·LB 뒤에서 키만 바뀌어도 느슨한 채로 초록이 이어진다. 사용자 CA는 호스트 검증을 대체하지 않는다. 동일 입구 병렬에서는 키 불일치와 세션 한도가 뒤섞인다. 재사용 YAML에 검사 끄기가 숨으면 나중에 불 끄기다. 출구가 다르면 보이는 키만 달라질 수 있어 미리 고정 줄이 있으면 이상이 드러난다. 티켓으로 Secret과 승인을 묶고 OS 재설치·복원 뒤 실제 키와 Secret을 반드시 대조한다.
위협 모델: 호스트 키는 변경 관리 대상
산출물 가치를 보면 SSH는 게이트웨이급이다. 호스트 키는 DNS를 넘어 서버 재료에 묶는다. 대화형의 신규 허용도 Runner 빈 파일에서는 매번 신규로 돌아간다. CI 전용 파일로 개인 실험 항목을 분리한다. bastion은 홉마다 표에 넣는다. ProxyJump 노트에 키 표를 같이 둔다. scp와 SFTP 이후에는 호스트 오류와 경로 의미 오류를 구분한다. known_hosts 한 줄도 잠금 파일처럼 리뷰·롤백을 맞추고 해시 표기는 통일한다. DNS 뷰가 갈리면 별칭을 나눈다. 공개 키는 비밀이 아니지만 Secret으로 변경 흐름을 맞추고 비밀 키와 섞지 않는다.
측정 기준: SSH가 불안정하다는 막연함 줄이기
이미지·macOS 갱신마다 ssh 버전과 실제 known_hosts 경로, rsync Host 별칭을 로그에(비밀은 제외). 호스트 검증 실패·권한·디스크를 지표로 분리. OIDC 변경과 같은 티켓에 호스트 정책을 적는다. 재설치 등에서는 Secret을 묶어 갱신하고 체크섬 티켓에 별칭·매니페스트를 함께 적는다. 지역별 시험 잡으로 키 일치를 주기 확인한다. 정적 검사로 검사 끄기·무설명 스캔을 금지한다. 암호화 전송은 도청 대응이고 호스트 고정은 별 층이다. 템플릿에서 composite를 필수로 한다.
StrictHostKeyChecking 정책 판단표(CI)
| 정책 | 적합 | 이점 | 리스크 |
|---|---|---|---|
StrictHostKeyChecking=no | 운영 금지 | 빠름 | 중간자·감사 불가 |
잡 안 ssh-keyscan | 시제 | 작성 쉬움 | 매번 최초 신뢰 |
accept-new만 | 랩 | 변경 거부 | 첫 회 위험 |
고정 줄+UserKnownHostsFile+yes | 운영 | 감사·로테 | Secret 필요 |
| 플랫폼 증명 | 대규모 | 자동화 | 벤더 의존 |
원자 릴리스와 함께 “어디서나 믿는 네트워크”와 운영 경로를 섞지 않는다.
절차: Secret에서 검증된 rsync로
# Collect keys offline from a trusted admin host, not inside CI
# ssh-keyscan -p 22 -H remote-mac.example.com > ci_known_hosts.fragment
# ssh-keygen -lf ci_known_hosts.fragment
# Store fragment in GitHub Secret SSH_KNOWN_HOSTS (host keys only)
# mkdir -p ~/.ssh && chmod 700 ~/.ssh
# printf '%s\n' "${{ secrets.SSH_KNOWN_HOSTS }}" > ~/.ssh/ci_known_hosts
# chmod 644 ~/.ssh/ci_known_hosts
# export RSYNC_RSH='ssh -o BatchMode=yes -o StrictHostKeyChecking=yes -o UserKnownHostsFile=$HOME/.ssh/ci_known_hosts'
# Append bastion lines when using ProxyJump; verify ordering matches ~/.ssh/config Host blocks
# rsync -av ./dist/ user@remote-mac:/Volumes/builds/app/dist/
# ssh user@remote-mac 'shasum -a 256 -c manifest.sha256'
옵션은 composite action으로 감싸 포크·복붙으로 반쪽 설정이 퍼지지 않게 한다.
읽는 순서와 CTA 정렬
권장 순서: OIDC→사용자 증명서→scp/SFTP→bastion→동시성→체크섬→원자 릴리스→홈.
호스트만·사용자만 극단을 피하고 별칭·지문·Secret 이름·소유자·병렬 상한을 한 장에 둔다. 빌드의 정답은 원격 Mac에 두고 로컬은 편집에 집중. 교육에서 지문 확인과 의도적 불일치 데모. 공유 빌더는 조직 Secret 단일화.
FAQ와 SFTPMAC 호스팅이 맞을 때
호스트 공개 키는 비밀인가
아니다. 다만 Secret은 변조 어려움과 변경 절차를 맞춘다. 사용자 비밀 키와 섞지 않는다.
Runner CPU마다 다른 핀인가
아니다. Mac 측이 기준. DNS 일관성은 여전히 중요하다.
점프와 앱 호스트 Secret 공유
분리 권장. 부분 갱신으로 한쪽만 낡는 사고를 막는다.
장수 VM 셀프 호스트 Runner
분리 파일로 개인 오염을 피하고 정책을 맞춘다.
요약: 호스트 키 검증은 개인 습관의 복사가 아니라 CI 1급 설정이다.
한계: 자체 fleet은 패치·디스크·당번이 무겁다. 입구와 키 운용을 빠르게 갖추려면 SFTPMAC 호스팅 원격 Mac으로 배달에 집중할 여지가 생긴다.
키·bastion·전송 절차를 한 Runbook에 모으고 로테를 팀 간에 추적 가능하게 한다.
