EC2 인스턴스에 액세스하려고 하면 "권한 거부(publickey)" 또는 "인증 실패, 권한 거부" 오류가 발생합니다. 이 오류를 해결하려면 어떻게 해야 합니까?

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

Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 액세스하려고 하면 "권한 거부(publickey)" 또는 "인증 실패, 권한 거부" 오류가 발생합니다. 이 오류를 해결하려면 어떻게 해야 합니까?

간략한 설명

"권한 거부(publickey)" 및 "인증 실패, 권한 거부" 오류는 다음과 같은 경우에 발생합니다.

  • AMI에 잘못된 사용자 이름을 사용하여 연결하려고 할 경우
  • 인스턴스에서의 권한이 올바르지 않은 경우
  • authorized_keys 파일에 잘못된 SSH 퍼블릭 키(.pub) 파일이 있는 경우

해결 방법

AMI에 올바른 사용자 이름을 사용하고 있는지 확인

올바른 사용자 이름의 목록은 인스턴스 연결 문제 해결 – 오류: 서버에서 키 거부 또는 지원되는 인증 방법이 없음을 참조하십시오.

인스턴스에서 권한이 올바르고 authorized_keys 파일에 올바른 SSH 퍼블릭 키가 있는지 확인

이러한 작업을 수행하는 방법으로는 다음 세 가지가 있습니다.

방법 1: AWS Systems Manager Session Manager를 사용하여 인스턴스에 로그인한 후 수정

이 방법은 권한을 업데이트하고 authorized_keys 파일에 사용자의 SSH 퍼블릭 키를 삽입하는 방법입니다.

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

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

2.    세션을 시작합니다.

3.    ls -ld 명령을 사용하여 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-------)여야 합니다.

다음은 ls -ld 명령과 그 결과 출력의 예시입니다. 이 예시에서 ec2-user는 사용자 이름입니다. 각 AMI에 따라 사용자 이름을 변경하십시오.

$ ls -ld /home/ec2-user/
drwx------ 3 ec2-user ec2-user 4096 Apr  1 08:31 /home/ec2-user/

4.    로컬 컴퓨터에서 SSH 퍼블릭 키를 확인합니다.

5.    출력에 SSH 퍼블릭 키의 서명이 없으면 authorized_keys 파일을 업데이트하여 SSH 키를 허용합니다. 다음 예시에서 예시 키는 사용자의 SSH 퍼블릭 키로 바꿉니다.

$ echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/ec2-user/.ssh/authorized_keys

6.    권한을 수정하려면 EC2 인스턴스에서 다음 명령을 실행합니다.

$ 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

7.    세션을 종료합니다.

8.    SSH를 사용하여 인스턴스에 연결합니다.

방법 2: AWSSupport-TroubleshootSSH 자동화 절차 실행

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

방법 3: 사용자 데이터 스크립트를 사용하여 SSH 권한을 복구하고 authorized_keys 파일에 올바른 SSH 퍼블릭 키 추가

중요

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

1.    Amazon EC2 콘솔을 엽니다.

2.    탐색 창에서 [인스턴스]를 선택한 다음 시작하려는 인스턴스를 선택합니다.

3.    인스턴스를 중지합니다.

4.    [작업], [인스턴스 설정], [사용자 데이터 보기/변경]을 차례로 선택합니다.

5.    다음의 사용자 데이터 스크립트를 [사용자 데이터 보기/변경] 대화 상자로 복사하고 [저장]을 선택합니다.

--//
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
--//

6.    로컬 컴퓨터에서 SSH 퍼블릭 키를 확인합니다.

7.    출력에 SSH 퍼블릭 키의 서명이 없으면 5단계에서 생성한 사용자 데이터 스크립트에 올바른 키를 추가합니다(서명이 일치하는 경우 이 단계를 건너뛸 수 있음). 다음 예와 같이 사용자 데이터 스크립트에 SSH 퍼블릭 키를 추가합니다. 예시 키는 사용자의 SSH 퍼블릭 키로 바꿉니다.

--//
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
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/ec2-user/.ssh/authorized_keys
--//

9.    인스턴스를 시작합니다.

참고: 앞의 사용자 데이터 스크립트는 인스턴스를 재부팅할 때마다 실행되도록 설정되어 있습니다. 인스턴스에 대한 액세스 권한을 다시 얻은 후에는 사용자 데이터 스크립트를 제거하십시오.

사용자 데이터를 제거하려면:

  • 이 단원의 1~4단계를 완료합니다.
  • [사용자 데이터 보기/변경] 대화 상자에서 사용자 데이터 스크립트를 삭제합니다.