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를 던져줍니다.
SSH Client는 ~/.ssh/known_hosts에 해당 호스트에 대한 fingerprint가 있는지 확인합니다. 해당 호스트에 대한 fingerprint가 없다면, 그림 2와 같이 해당 fingerprint를 등록할 것인지 물어봅니다. yes를 누르면 known_hosts 파일에 fingerprint와 호스트 정보를 해시(hash)해서 저장합니다.
이러한 이유로 기존에 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번째 줄을 보면 어떻게 해당 호스트에 대한 키를 제거할 수 있는지 알려줍니다.
아래와 같이 입력해 주면, example.com 도메인에 대한 known_hosts 내용만 제거가 됩니다.
ssh-keygen -f "/home/username/.ssh/known_hosts" -R "example.com"
ShellScript위의 명령어를 실행하면 아래와 같이 몇 번째 줄에 해당 호스트 정보가 있는지 알려주고 해당 내용을 삭제해서 known_hosts를 업데이트 해 줍니다. 기존의 known_hosts 파일은 known_hosts.old 파일로 백업되니까, 혹시 기존의 값을 다시 살려야 하는 경우에는 해당 파일을 참고하면 되겠습니다.
이제 모든 작업이 끝났습니다. 이제 다시 해당 호스트로 접속하려고 하면 서버의 fingerprint가 known_hosts에 등록되어 있지 않으므로 그림 2와 같이 진행하고 이용하면 됩니다.
관련 자료
ssh client man page를 참고했습니다.