SSH Permission denied publickey 에러 해결 완벽 가이드 - EC2 접속 문제 5분 안에 해결

EC2 인스턴스에 SSH 접속을 시도했는데 'Permission denied (publickey)' 또는 'WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED' 에러가 발생했다면, 이 글에서 제시하는 해결책을 순서대로 적용하면 됩니다. 대부분의 경우 known_hosts 파일의 충돌이나 PEM 키 파일의 권한 설정 문제가 원인이며, 근본적인 해결을 위해서는 SSH 보안 설정까지 점검해야 합니다.


SSH Permission denied publickey 에러 해결 완벽 가이드 - EC2 접속 문제 5분 안에 해결




1. 'WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED' 에러 원인과 해결

이 경고는 로컬 머신의 ~/.ssh/known_hosts 파일에 저장된 원격 호스트의 SSH 키와 현재 접속하려는 서버의 키가 일치하지 않을 때 발생합니다. 주요 원인은 다음과 같습니다:

  • 인스턴스 재생성: 같은 IP 주소에 새로운 EC2 인스턴스를 생성한 경우
  • 호스트 키 재생성: 서버에서 SSH 설정을 변경하거나 호스트 키를 재생성한 경우
  • IP 주소 재사용: 클라우드 환경에서 Elastic IP를 재할당받은 경우
  • Man-in-the-Middle 공격 가능성: 실제 보안 위협일 수도 있으므로 신뢰할 수 있는 환경인지 먼저 확인해야 합니다

해결 방법:

  1. known_hosts 파일 위치 확인
    • Windows: C:\Users\사용자명\.ssh\known_hosts
    • Mac/Linux: ~/.ssh/known_hosts
  2. 충돌하는 엔트리 삭제
    에러 메시지에 표시된 라인 번호(예: line 22)를 텍스트 에디터로 직접 삭제하거나, 다음 명령어를 사용합니다:
    ssh-keygen -R ec2-XX-XX-XX-XX.ap-northeast-2.compute.amazonaws.com
  3. 재접속 후 새 키 수락
    다시 SSH 접속을 시도하면 새로운 호스트 키를 수락할지 묻는 메시지가 나타나며, yes를 입력하면 정상 접속됩니다.

프로 팁: 반복적으로 인스턴스를 생성/삭제하는 개발 환경이라면 ssh-keyscan으로 호스트 키를 미리 받아 known_hosts에 등록하거나, Terraform/Ansible 등의 자동화 도구에서 known_hosts 관리를 표준화하는 것을 권장합니다.

2. PEM 키 파일 권한 설정 (chmod 400)

SSH는 보안상의 이유로 개인 키 파일(.pem)에 대한 엄격한 권한 제한을 요구합니다. 다른 사용자가 키 파일을 읽거나 수정할 수 있다면 접속이 거부됩니다.

chmod 400의 의미:

  • 4 (읽기): 파일 소유자에게만 읽기 권한 부여
  • 0 (권한 없음): 그룹 및 기타 사용자의 모든 권한 제거
  • 권한은 8진수로 표현되며, 첫 번째 숫자가 소유자, 두 번째가 그룹, 세 번째가 기타 사용자를 나타냅니다

Linux/Mac에서 권한 설정:

chmod 400 BakeryServer.pem

Windows에서 권한 설정:

  1. PEM 파일을 우클릭 → 속성 → 보안 탭
  2. 고급 → 상속 사용 안 함 → 모든 상속된 권한 제거
  3. 추가 → 보안 주체 선택 → 현재 사용자만 추가
  4. 읽기 권한만 체크하고 적용

SSH 접속 시 키 파일 명시:

ssh -i /path/to/BakeryServer.pem ubuntu@ec2-XX-XX-XX-XX.ap-northeast-2.compute.amazonaws.com

주의사항: chmod 600(읽기+쓰기)도 작동하지만, 보안 모범 사례는 chmod 400(읽기 전용)입니다. 키 파일이 실수로 수정되는 것을 방지할 수 있습니다.

3. 서버 측 SSH 보안 강화 설정

클라이언트 측 문제를 해결했다면, 서버의 /etc/ssh/sshd_config 파일을 수정하여 SSH 보안을 강화해야 합니다. 기본 설정은 보안에 취약하므로 프로덕션 환경에서는 반드시 다음 항목들을 점검하십시오.

필수 보안 설정:

  • 포트 변경: 기본 22번 포트 대신 2200 등 비표준 포트 사용
    Port 2200
  • Root 로그인 차단:
    PermitRootLogin no
  • 암호 인증 차단 및 공개키 인증만 허용:
    PasswordAuthentication no
    PubkeyAuthentication yes
    PermitEmptyPasswords no
  • 세션 타임아웃 설정:
    ClientAliveInterval 600
    ClientAliveCountMax 3
    (10분간 활동 없으면 3회 확인 후 연결 종료)
  • 로그인 시도 제한:
    MaxAuthTries 5
    LoginGraceTime 30
    (5회 실패 시 차단, 30초 내 미로그인 시 강제 종료)

authorized_keys 파일 설정:

  1. 서버에서 파일 생성:
    touch ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
  2. 클라이언트에서 공개키 확인:
    cat ~/.ssh/server-key.pub
  3. 출력된 공개키 내용을 서버의 ~/.ssh/authorized_keys에 붙여넣기

설정 반영:

sudo systemctl restart sshd

고급 팁: 특정 사용자만 특정 IP에서 접속하도록 제한하려면 sshd_config에 다음과 같이 추가합니다:

AllowUsers deploy@192.168.1.100 admin@10.0.0.0/8

4. 긴급 우회 방법 (비추천)

개발 환경에서 일시적으로 호스트 키 검증을 우회해야 한다면 다음 옵션을 사용할 수 있습니다:

ssh -o StrictHostKeyChecking=no -i BakeryServer.pem ubuntu@ec2-XX-XX-XX-XX

경고: 이 방법은 Man-in-the-Middle 공격에 취약하므로 절대 프로덕션 환경에서 사용하지 마십시오. 테스트 목적으로만 제한적으로 활용하고, 문제 해결 후에는 반드시 정상적인 호스트 키 검증 방식으로 복구해야 합니다.

요약 및 Action Item

SSH 접속 에러는 대부분 known_hosts 파일의 호스트 키 충돌 또는 PEM 키 파일의 권한 문제에서 발생합니다. ssh-keygen -R 호스트명으로 충돌 엔트리를 제거하고, chmod 400으로 키 파일 권한을 설정하면 즉시 해결됩니다. 서버 측에서는 sshd_config의 보안 설정(포트 변경, Root 로그인 차단, 공개키 인증 강제)을 반드시 적용하여 무차별 대입 공격을 차단해야 합니다.

지금 바로 실행할 것: 현재 사용 중인 모든 EC2 인스턴스의 PEM 키 파일 권한을 chmod 400으로 설정하고, /etc/ssh/sshd_config에서 PasswordAuthentication이 no로 설정되어 있는지 확인하십시오. 암호 인증이 활성화되어 있다면 당장 비활성화하고 SSH를 재시작해야 합니다.


#함께 읽으면 좋은 글

Nginx 502 Bad Gateway 에러 해결 완벽 가이드 Reverse Proxy 설정 점검 체크리스트 : 바로보기

댓글