Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 가이드 · 실용 가이드

SSH에 ‘REMOTE HOST IDENTIFICATION HAS CHANGED’가 뜨면? 이전 키를 지우기 전에 대상과 지문부터 확인

경고를 없애려고 known_hosts를 삭제하거나 검사를 끄지 마세요. SSH가 실제로 사용한 호스트명, 주소, 포트, 점프 경로와 신뢰 파일을 확인하고 별도의 신뢰 채널에서 예상 지문을 받으세요. 정확히 일치할 때만 오래된 기록을 제거합니다.

SSH 경고의 지문을 별도의 신뢰할 수 있는 서버 콘솔과 비교하는 사람의 원본 편집 일러스트.
원본 개념 일러스트: 로컬 신뢰 기록을 바꾸기 전에 별도 신뢰 채널에서 서버 지문을 검증합니다. Watch at Ease

SSH 호스트 키 경고는 단순 연결 오류가 아니라 신원 확인 실패입니다. 로컬 신뢰 기록을 바꾸기 전에 어느 서버에 도달했고 그 서버가 어떤 키를 제시해야 하는지 확인해야 합니다.

경고를 장애가 아니라 증거로 보기

OpenSSH는 서버의 공개 호스트 키를 known_hosts에 저장합니다. 같은 대상이 다른 키를 제시하면 재구축, 키 교체, 이동, 대체 또는 가로채기인지 알 수 없어 연결을 거부합니다. 정리 전에 신원을 확인하세요.

경고 전체에서 호스트명, IP, 포트, 키 유형, SHA256 지문, 파일과 줄 번호를 보관합니다. VS Code Remote SSH, Git, rsync, IDE는 다른 설정, 포트, 점프 호스트나 신뢰 파일을 쓸 수 있습니다.

1. SSH가 실제로 도달한 대상 확인

`ssh -G host`의 `hostname`, `port`, `proxyjump`, `proxycommand`, `userknownhostsfile`, `globalknownhostsfile`을 확인합니다. 별칭이 다른 DNS 이름, 점프 호스트 뒤의 사설 주소, 비표준 포트를 가리킬 수 있습니다.

평소 네트워크 경로에서 이름을 해석하고 경고, 자산 목록, 클라우드 콘솔 또는 관리자 기록과 비교합니다. VPN 분할 DNS, 로드밸런서, 재사용된 주소, 점프 호스트가 다른 머신으로 보낼 수 있습니다. 경로를 설명할 수 없으면 중단합니다.

`hostkeyalias`도 확인하세요. 설정되어 있으면 호스트 키 데이터베이스는 실제 호스트명 대신 이 별칭으로 조회합니다. 명령행 별칭을 저장 이름으로 단정하지 말고 SSH가 표시한 신뢰 대상과 파일을 사용하세요.

2. 별도 신뢰 채널에서 예상 지문 확보

인증된 공급자 콘솔, 직렬/복구 콘솔, 구성 관리 기록 또는 확인된 관리자를 사용합니다. 관리자는 서버 콘솔에서 `ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub`와 다른 활성 키에 해당하는 명령을 실행할 수 있습니다.

알고리즘과 완전한 SHA256 지문을 요청합니다. 유지보수 공지는 교체 이유일 뿐 지문을 대신하지 않습니다. `ssh-keyscan`은 현재 경로가 제시하는 키를 관찰하지만 독립적인 신원 증명은 아닙니다.

3. 같은 알고리즘끼리 비교

ED25519는 ED25519, RSA는 RSA, ECDSA는 ECDSA와 비교합니다. 한 알고리즘만 교체되어 다른 저장 키가 유효할 수 있으므로 클라이언트가 협상한 키를 확인합니다.

대상이 설명되고 표시 지문이 별도 채널의 값과 정확히 일치할 때만 진행합니다. 다르면 관리자에게 문의하고 기존 기록을 보존합니다. 줄 번호는 진단 정보이지 신뢰 허가가 아닙니다.

4. 정확한 known_hosts 기록 찾기

표시된 파일을 백업하고 `ssh-keygen -F host`를 실행합니다. 비표준 포트는 `ssh-keygen -F '[host]:2222'`, 저장된 IP도 별도로 확인합니다. `-F`는 해시된 호스트명도 찾습니다.

다른 신뢰 파일이면 `-f /path/to/file`을 추가합니다. 시스템 파일은 관리자 권한이 필요할 수 있습니다. 점프 호스트가 있으면 경고가 점프 호스트인지 최종 대상인지 먼저 구분합니다.

5. 확인된 오래된 대상만 제거

지문 일치와 정당한 이유를 확인한 뒤 `ssh-keygen -R host`, 비표준 포트는 `ssh-keygen -R '[host]:2222'`를 실행하고 필요하면 `-f`를 추가합니다. 호스트명과 IP 기록은 각각 확인합니다.

새 연결 검증이 끝날 때까지 백업을 유지합니다. `~/.ssh/known_hosts` 전체 삭제, 광범위한 줄 삭제, StrictHostKeyChecking 비활성화는 증거와 다른 서버 보호를 없앱니다.

`ssh-keygen -R`은 선택한 파일에서 해당 호스트명 또는 [호스트명]:포트에 속한 모든 키를 지웁니다. 변경된 알고리즘 하나만 제거하지 않습니다. 모든 일치 기록을 먼저 검토하고 관리 대상 기록이나 다른 알고리즘의 유효성이 불분명하면 관리자에게 맡기세요.

6. 한 번 재연결하고 다시 검증

대화형으로 재연결해 대상과 알고리즘을 확인한 뒤 표시 지문을 신뢰 값과 다시 비교하고 수락합니다. 변경 원인, 신뢰 출처, 이전/새 지문, 시각, 승인자를 기록합니다.

키가 다시 바뀌거나 동일 이름의 백엔드가 설명되지 않는 키를 제시하거나 특정 클라이언트/네트워크에서만 경고하면 중단합니다. DNS 불일치, 로드밸런서, 비정상 프록시, 다른 신뢰 파일 또는 보안 사고일 수 있습니다.

정상 변경과 에스컬레이션 조건

고정 IP를 유지한 VM 재구축, 문서화된 키 교체, 이미지 복원, 장비 교체, 별칭 이동은 정상일 수 있습니다. 그래도 운영 책임자가 대상과 지문을 확인해야 합니다.

예고가 없거나 신뢰 콘솔에서 지문을 얻지 못하거나 DNS/경로가 바뀌었거나 지문이 다르거나 키가 반복 변경되면 즉시 에스컬레이션합니다. 신원이 해결되기 전에는 자격 증명을 입력하지 마세요.

오래된 신뢰 기록 하나를 격리하기 전에 SSH 호스트명, 주소, 포트와 점프 경로를 정리한 원본 편집 일러스트.
원본 개념 일러스트: 실제 대상과 신뢰 파일을 확인해 검증된 오래된 기록만 제거합니다. Watch at Ease