SSH를 사용하여 EC2 인스턴스에 연결하려고 할 때 "Server refused our key" 오류가 발생하는 이유는 무엇입니까?

최종 업데이트 날짜: 2020년 4월 1일

SSH를 사용하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 연결하려고 할 때 "Server refused our key" 오류가 발생합니다. 이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

Server refused our key 오류는 다음과 같이 여러 가지 이유로 발생합니다.

  • EC2 인스턴스에 연결할 때 AMI에 대해 잘못된 사용자 이름을 사용하고 있습니다.
  • 인스턴스에 권한 문제가 있거나 디렉터리가 누락되었습니다.
  • 인스턴스에 액세스하려는 사용자가 서버에서 삭제되었습니다.

해결 방법

AMI에 대해 올바른 사용자 이름을 사용하고 있는지 확인합니다.

올바른 사용자 이름 목록은 인스턴스 연결 문제 해결 – 오류: Server Refused our key 또는 No supported authentication methods available을 참조하십시오.

인스턴스에 대해 올바른 권한이 설정되어 있고 누락된 디렉터리가 없는지 확인합니다.

인스턴스에서 권한 및 디렉터리를 확인하는 방법에는 세 가지가 있습니다.

방법 1: AWS Systems Manager Session Manager를 사용하여 인스턴스에 로그인하고 권한 확인

참고: 이 방법을 사용하려면 SSM 에이전트가 필요합니다. Session Manager에 대한 자세한 내용과 전체 전제 조건 목록은 Session Manager 시작하기를 참조하십시오.

1.    AWS Systems Manager 콘솔을 엽니다.

2.    세션을 시작합니다.

3.    stat 명령을 사용하여 home 디렉터리에 있는 파일의 권한이 올바른지 확인합니다. 다음은 올바른 권한 목록입니다.

  • 예를 들어, Linux 홈 디렉터리(/home)는 (0755/drwxr-xr-x)여야 합니다.
  • 예를 들어, 사용자의 홈 디렉터리(/home/ec2-user/)는 (0700/drwx------)여야 합니다.
  • 예를 들어, .ssh 디렉터리 권한(/home/ec2-user/.ssh)은 (0700/drwx------)여야 합니다.
  • 예를 들어, authorized_keys 파일 권한(/home/ec2-user/.ssh/authorized_keys)은 (0600/-rw-------)여야 합니다.  

다음은 stat 명령과 결과 출력에 대한 예제입니다. 이 예제에서 ec2-user는 사용자 이름입니다. 각 AMI에 따라 사용자 이름을 변경합니다.

$ stat /home/ec2-user/
  File: '/home/ec2-user/'
  Size: 4096      	Blocks: 8          IO Block: 4096   directory
Device: 10301h/66305d	Inode: 18322       Links: 3
Access: (0700/drwx------)  Uid: (  500/ec2-user)   Gid: (  500/ec2-user)

4.    권한이 이전 값과 일치하지 않으면 다음 명령을 실행합니다.

$ sudo chown root:root /home
$ sudo chmod 755 /home
$ sudo chown ec2-user:ec2-user /home/ec2-user -R
$ sudo chmod 700 /home/ec2-user /home/ec2-user/.ssh
$ sudo chmod 600 /home/ec2-user/.ssh/authorized_keys

5.    세션을 종료합니다.

6.    SSH를 통해 인스턴스에 연결합니다.

방법 2: 오류의 원인이 되는 문제를 자동으로 수정

AWSSupport-TroubleshootSSH 자동화 문서 실행

AWSSupport-TroubleshootSSH 자동화 문서는 인스턴스에서 Amazon EC2Rescue 도구를 설치한 다음, SSH를 통해 Linux 시스템에 연결할 때 원격 연결 오류를 일으키는 문제를 검사하고 수정합니다. 자세한 내용은 AWSSupport-TroubleshootSSH 자동화 워크플로를 사용하여 SSH 연결 문제를 해결하려면 어떻게 해야 합니까?를 참조하십시오.

방법 3: 사용자 데이터를 사용하여 인스턴스에서 권한 수정

중요!

  • 인스턴스가 인스턴스 스토어를 지원하거나 데이터를 포함하는 인스턴스 스토어 볼륨일 경우, EC2 인스턴스를 정지하고 다시 시작해야 하는 절차를 수행하지 마십시오. 이 복구 절차를 수행하려면 인스턴스를 중지하고 시작해야 합니다. 이렇게 하면 인스턴스 스토어 볼륨의 데이터가 유실됩니다. 자세한 내용은 인스턴스의 루트 디바이스 유형 확인을 참조하십시오.
  • 인스턴스가 Amazon EC2 Auto Scaling 그룹의 일부이거나 Amazon EMR, AWS CloudFormation, AWS Elastic Beanstalk 등과 같이 AWS Auto Scaling을 사용하는 서비스에서 인스턴스를 시작한 경우 인스턴스를 중단하면 인스턴스가 종료될 수 있습니다. 이 시나리오에서 인스턴스 종료는 Auto Scaling 그룹에 대한 인스턴스 축소 보호 설정에 따라 달라집니다. 인스턴스가 Auto Scaling 그룹의 일부인 경우, 문제 해결 단계를 시작하기 전에 Auto Scaling 그룹에서 일시적으로 인스턴스 제거합니다.
  • 인스턴스를 중지하고 다시 시작하면 인스턴스의 퍼블릭 IP 주소가 변경됩니다. 외부 트래픽을 인스턴스로 라우팅할 때에는 퍼블릭 IP 주소 대신, 탄력적 IP 주소를 사용하는 것이 모범 사례입니다.
  • 인스턴스의 루트 디바이스가 인스턴스 스토어 볼륨인 경우 사용자 데이터를 사용하여 SSH 키를 변경할 수 없습니다. 자세한 내용은 인스턴스의 루트 디바이스 유형 확인을 참조하십시오.
  • 인스턴스의 사용자 데이터 업데이트는 cloud-init 명령을 지원하는 모든 배포에 적용됩니다. 이 지침을 수행하려면 cloud-init를 설치 및 구성해야 합니다. cloud-init SSH 모듈에 대한 자세한 내용은 Configure ssh and ssh keys를 참조하십시오.

1.    Amazon EC2 콘솔을 열고 사용자의 인스턴스를 선택하십시오.

2.    [작업]을 선택하고 [인스턴스 상태]를 선택한 다음, [중지]를 선택합니다.

참고: [중지]가 비활성화된 경우 인스턴스가 이미 중지되었거나 해당 루트 디바이스가 인스턴스 스토어 볼륨입니다.

3.    [작업]을 선택하고 [인스턴스 설정]을 선택하고 [사용자 데이터 보기/변경]을 선택합니다.

4.    다음 스크립트를 [사용자 데이터] 필드에 복사한 다음, [저장]을 선택합니다. 전체 스크립트를 복사하고 공백을 추가하지 마십시오.

참고: 다음 스크립트는 사용자 이름으로 ec2-user를 사용합니다. ec2-userAMI의 사용자 이름으로 변경합니다.

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
chown root:root /home
chmod 755 /home
chown ec2-user:ec2-user /home/ec2-user -R
chmod 700 /home/ec2-user /home/ec2-user/.ssh
chmod 600 /home/ec2-user/.ssh/authorized_keys
--// 

5.    인스턴스를 시작한 다음, SSH를 통해 인스턴스에 연결합니다.

참고: 기본적으로 사용자 데이터 스크립트는 인스턴스당 한 번 실행됩니다. 이 절차는 인스턴스를 재부팅, 중지 또는 시작할 때마다 퍼블릭 키를 추가하도록 기본 동작을 변경합니다. 기본 동작을 복원하려면 사용자 지정 사용자 데이터를 제거합니다. 인스턴스를 처음 부팅한 후 사용자 데이터를 실행할 수 있도록 보안을 구현하는 방법을 고려하는 것이 좋습니다. ModifyInstanceAttribute API 메서드를 사용하여 인스턴스의 사용자 데이터를 수정할 수 있습니다. 이 메서드에 대한 액세스를 제한하려면 AWS Identity and Access Management(IAM) 정책을 사용합니다.

사용자가 서버에서 삭제되었는지 확인

인스턴스에 액세스하려는 사용자가 서버에서 삭제된 경우 사용자를 새 사용자로 다시 추가합니다. 자세한 내용은 Amazon EC2 Linux 인스턴스에 SSH 액세스 권한이 있는 새 사용자 계정을 추가하려면 어떻게 해야 합니까?를 참조하십시오.