SSH 접속 원리 및 서버 마이그레이션

서버 운영을 하다 보면 SSH로 서버에 접속해 작업을 수행하는 일이 필수적입니다. 하지만 서버를 업그레이드하거나 이전하는 과정에서는 SSH 관련 문제가 예상치 못하게 발생할 수 있습니다. 여기서는 SSH의 개념과 동작 원리, 그리고 서버 마이그레이션 시 발생할 수 있는 SSH 관련 문제를 정리해보겠습니다.

1. SSH란 무엇인가?

SSH(Secure Shell)는 네트워크 상에서 다른 컴퓨터(서버)에 암호화된 연결을 통해 안전하게 접속할 수 있도록 해주는 프로토콜입니다. 주로 리눅스 서버 관리에 많이 사용되며, 원격에서 명령어를 실행하거나 파일을 전송할 때 사용됩니다.

  • SSH의 주요 특징
    • 데이터 암호화: 모든 통신 내용이 암호화되어 도청 위험이 낮음
    • 원격 로그인 및 명령어 실행
    • 파일 전송 지원 (scp, sftp)
    • 포트 포워딩 기능

기본 접속 명령어는 아래와 같습니다:

ssh 사용자명@서버주소

예시: ssh user@192.168.0.10

2. SSH의 동작 원리

SSH 접속 과정은 다음 단계로 이루어집니다:

  1. 서버 공개키 전달: 클라이언트(내 컴퓨터)가 서버에 접속 시 서버의 공개키(fingerprint)를 받아옴
  2. known_hosts 확인: 클라이언트의 ~/.ssh/known_hosts 파일에서 서버의 공개키 fingerprint를 비교
    • 처음 접속이라면 fingerprint 저장 여부를 묻고, 사용자가 yes 입력 시 저장
    • 저장된 fingerprint와 다를 경우 보안 경고 발생
  3. 클라이언트 인증:
    • 비밀번호 입력
    • 또는 SSH 키(공개키/비밀키 쌍)를 통한 인증
  4. 암호화된 세션 생성: 안전한 통신 채널 위에서 명령어 실행, 파일 전송 등 수행

3. SSH 키와 known_hosts의 역할

SSH 키는 비밀번호 대신 사용할 수 있는 인증 방식입니다.

  • 비밀키(private key): 클라이언트에만 보관
  • 공개키(public key): 서버의 ~/.ssh/authorized_keys에 등록

접속 과정에서 서버는 클라이언트에게 “너 이 공개키의 주인 맞아?” 하고 도전장(challenge)을 보냅니다. 클라이언트는 비밀키로 응답을 서명하고, 서버는 공개키로 그 응답을 검증하여 인증합니다.

한편, known_hosts 파일은 클라이언트가 접속하려는 서버의 fingerprint를 저장하고 관리하는 파일입니다. 이전에 접속한 서버의 공개키 정보가 여기에 저장되며, 다음 접속 시 서버가 동일한지 확인하는 용도로 사용됩니다. 이는 중간자 공격(man-in-the-middle attack)을 방지하기 위한 보안 장치입니다.

4. 서버 마이그레이션 시 SSH 관련 문제

이번에 저희가 실제로 서버를 옮기면서 발생할 수 있는 문제를 고려해 보았는데요.
기존에 사용하던 서버가 사양이 너무 안 좋아서 새로 서버를 구축하면서 이전하는 작업을 진행합니다.
이 때 기존 서버에서 SSH로 접속하던 서버들에 똑같이 아무 문제 없이 붙을지 테스트 하는 과정을 거쳤습니다.

시나리오

  • 기존 **A 서버(IP: X)**에서 B 서버로 SSH 접속(id_rsa private key 사용)해 작업
  • 서버 업그레이드로 C 서버를 새로 구축
  • A 서버의 IP와 SSH private key(id_rsa)를 C 서버에 그대로 복사
  • C 서버에서 B 서버에 접속하려고 함

이런 상황에서 발생할 수 있는 문제는 다음과 같습니다.

  1. C 서버 → B 서버 접속 가능 여부
    • B 서버의 ~/.ssh/authorized_keys에는 A 서버에서 사용하던 공개키가 등록되어 있음
    • C 서버가 A 서버의 private key를 그대로 가져왔으므로, B 서버는 C 서버를 기존 A 서버와 동일한 사용자로 인식
    • 결과: 접속 자체는 정상적으로 가능
  2. known_hosts 문제
    • known_hosts는 “클라이언트(C 서버) → 서버(B 서버)“의 관계에서 서버의 fingerprint를 검증하는 용도로 사용됩니다.
    • C 서버에는 B 서버의 fingerprint가 ~/.ssh/known_hosts에 없을 수 있음 → 첫 접속 시 저장 요청 메시지 출력
    • 만약 A 서버의 known_hosts 파일을 C 서버에 복사해왔다면:
      • B 서버의 SSH 공개키가 예전과 같다면 문제 없음
      • B 서버의 SSH 공개키가 변경되었다면 경고 메시지 발생:
      • WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! → 이 경우 접속이 차단되며, known_hosts의 해당 라인을 삭제하거나 업데이트해야 함
  3. 보안 측면 문제 A 서버의 private key를 C 서버로 복사해 오는 것은 보안상 주의가 필요합니다.
    • private key가 외부에 유출되었다면 C 서버도 동일한 위험에 노출
    • 키 파일의 권한과 보관 방식이 적절히 관리되지 않으면 무단 접속 가능성 존재 실제로는 C 서버에서 새로운 SSH 키 쌍을 생성하고 공개키만 B 서버에 등록하는 방식이 더 안전합니다
  4. 결론 및 권장 사항 서버 마이그레이션 시 SSH 관련 설정을 그대로 가져오는 것은 접속 편의성 면에서는 문제없이 동작할 수 있지만, 보안 측면에서 주의가 필요합니다.
    • 접속 자체는 정상적으로 가능할 가능성이 높음
    • known_hosts는 클라이언트의 파일이므로, 새 서버(C 서버)에서는 fingerprint mismatch 경고가 발생할 수 있음
    • private key 복사는 보안 리스크를 수반 → 새 키를 발급하고 공개키만 서버에 등록하는 방식 권장

항상 이렇게 예상 문제를 찾아보고 테스트를 해봐도 문제가 꼭 생기더라고요. 이번에는 테스트가 아무 문제없이 잘 진행되면 좋겠네요~