SSH 접속이 안 되는 경우(REMOTE HOST IDENTIFICATION HAS CHANGED)

SSH 클라이언트로 SSH 서버에 접속하려고 하면 REMOTE HOST IDENTIFICATION HAS CHANGED 메시지를 만나는 경우가 있습니다. 문제의 원인을 알아보고, 해결해 보도록 하겠습니다.

문제의 원인 – WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED

위와 같은 원격 호스트 증명이 변경되었다고 경고 메시지가 뜨면서 서버 접속이 되지 않나요? 총 3가지 가능성이 있습니다.

첫번째는 서버가 누군가에게 공격을 당한 경우에 발생할 수 있습니다. 두번째는 IP 주소는 동일한데 서버를 다른 서버로 교체하거나 새로 서버를 설치했을 때 경험할 수 있습니다. 세번째는 도메인 주소는 동일한데 도메인 주소에 할당한 IP 주소가 변경돼서 해당 도메인 주소가 다른 서버를 가르키는 경우에 발생할 수 있습니다.

세 가지 경우 모두 원격 서버에서 보내주는 fingerprint가 현재 known_hosts에 등록된 키와 같지 않을 때 이 문제가 생깁니다. SSH Client에서 SSH Server에 접속할 때에는 그림 1과 같이 SSH Client에서 Server로 접속을 요청하면, 서버에서 fingerprint를 던져줍니다.

그림 1. SSH Server 접속 과정
그림 1. SSH Server 접속 과정

SSH Client는 ~/.ssh/known_hosts에 해당 호스트에 대한 fingerprint가 있는지 확인합니다. 해당 호스트에 대한 fingerprint가 없다면, 그림 2와 같이 해당 fingerprint를 등록할 것인지 물어봅니다. yes를 누르면 known_hosts 파일에 fingerprint와 호스트 정보를 해시(hash)해서 저장합니다.

그림 2. SSH 서버 공개키의 fingerprint를 known_hosts에 저장
그림 2. SSH 서버 공개키의 fingerprint를 known_hosts에 저장

이러한 이유로 기존에 known_hosts에 저장한 해당 호스트에 대한 fingerprint의 해시 값과 서버에서 받은 fingerprint의 해시값이 다르다면, SSH Client는 원격 호스트 증명이 변경되었다고 메시지로 알려주는 것입니다.

이제 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 메시지가 발생하는 이유를 아시겠죠?

해결방법

서버가 공격을 당했기 때문에 발생하는 문제라면 IP도 그대로이고, 도메인 주소와 관련된 환경도 전혀 달라지지 않은 경우겠죠. 그 경우에는 긴급하게 서버를 복구하는 작업이 시급할 것입니다.

서버 재설치나 서버 변경 또는 서버 이전과 같은 경우에는 ~/.ssh/known_hosts에 있는 내용을 지워주면 되는데, known_hosts에 호스트가 보통 1개만 등록된 경우는 흔치 않기 때문에 vi나 nano 편집기로 찾기는 어렵습니다. 그렇다고 해서 known_hosts 파일을 삭제해 버린다면 기존에 known_hosts로 등록하던 작업을 매번 해줘야 하기 때문에 귀찮습니다.

known_hosts 안에는 특정 도메인 주소나 IP 주소도 나와 있지 않은데 어떻게 특정 IP나 도메인 주소에 대한 것만 삭제할 수 있을까요?

해결방법은 아래 그림 1의 메시지 안에 다 들어 있습니다. 메시지의 내용이 잔뜩 떠서 당황하신 분들도 있겠지만, 아래에서 3번째 줄을 보면 어떻게 해당 호스트에 대한 키를 제거할 수 있는지 알려줍니다.

그림 3. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
그림 3. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED

아래와 같이 입력해 주면, example.com 도메인에 대한 known_hosts 내용만 제거가 됩니다.

ssh-keygen -f "/home/username/.ssh/known_hosts" -R "example.com"
ShellScript

위의 명령어를 실행하면 아래와 같이 몇 번째 줄에 해당 호스트 정보가 있는지 알려주고 해당 내용을 삭제해서 known_hosts를 업데이트 해 줍니다. 기존의 known_hosts 파일은 known_hosts.old 파일로 백업되니까, 혹시 기존의 값을 다시 살려야 하는 경우에는 해당 파일을 참고하면 되겠습니다.

그림 4. 기존의 호스트 정보 삭제
그림 4. 기존의 호스트 정보 삭제

이제 모든 작업이 끝났습니다. 이제 다시 해당 호스트로 접속하려고 하면 서버의 fingerprint가 known_hosts에 등록되어 있지 않으므로 그림 2와 같이 진행하고 이용하면 됩니다.

관련 자료

ssh client man page를 참고했습니다.

같이 읽으면 좋은 글

Leave a Comment