- 공유 링크 만들기
- X
- 이메일
- 기타 앱
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 공격 가능성: 실제 보안 위협일 수도 있으므로 신뢰할 수 있는 환경인지 먼저 확인해야 합니다
해결 방법:
- known_hosts 파일 위치 확인
- Windows:
C:\Users\사용자명\.ssh\known_hosts - Mac/Linux:
~/.ssh/known_hosts
- Windows:
- 충돌하는 엔트리 삭제
에러 메시지에 표시된 라인 번호(예: line 22)를 텍스트 에디터로 직접 삭제하거나, 다음 명령어를 사용합니다:ssh-keygen -R ec2-XX-XX-XX-XX.ap-northeast-2.compute.amazonaws.com
- 재접속 후 새 키 수락
다시 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에서 권한 설정:
- PEM 파일을 우클릭 → 속성 → 보안 탭
- 고급 → 상속 사용 안 함 → 모든 상속된 권한 제거
- 추가 → 보안 주체 선택 → 현재 사용자만 추가
- 읽기 권한만 체크하고 적용
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 파일 설정:
- 서버에서 파일 생성:
touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
- 클라이언트에서 공개키 확인:
cat ~/.ssh/server-key.pub
- 출력된 공개키 내용을 서버의
~/.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 설정 점검 체크리스트 : 바로보기
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글
댓글 쓰기