EC2 인스턴스에 액세스할 때 표시되는 "Permission denied (publickey)" 또는 "Authentication failed, permission denied" 오류 메시지를 어떻게 해결해야 합니까?
Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 액세스할 때 "Permission denied (publickey)" 또는 "Authentication failed, permission denied" 오류 메시지가 표시됩니다.
간략한 설명
Permission denied (publickey) 및 Authentication failed, permission denied 오류는 다음과 같은 이유로 발생합니다.
- 연결할 때 Amazon Machine Image(AMI)에 잘못된 사용자 이름을 사용합니다.
- 인스턴스의 OS(운영 체제)에 잘못된 파일 권한이 있습니다.
- authorized_keys 파일에 잘못된 SSH 공개 키(.pub) 파일이 있거나 키 없이 인스턴스를 시작했습니다.
- authorized_keys 파일 또는.ssh 폴더의 이름이 올바르지 않습니다.
- authorized_keys 파일 또는 .ssh 폴더가 삭제되었습니다.
- (Ubuntu 20.x만 해당) SSH 구성에서 AuthorizedKeysCommand 명령을 사용합니다.
해결 방법
AMI의 사용자 이름이 올바른지 확인
OS 내의 파일 권한이 올바르고 authorized_keys 파일에 올바른 SSH 공개 키가 있는지 확인
구성을 확인하려면 다음 방법 중 하나를 사용하십시오.
EC2 직렬 콘솔 사용
Linux용 EC2 직렬 콘솔을 활성화한 경우 콘솔을 사용하여 지원되는 Nitro 기반 인스턴스 유형의 문제를 해결할 수 있습니다. 직렬 콘솔은 네트워크 연결 없이 인스턴스에 연결됩니다. 사용자는 Amazon EC2 콘솔이나 AWS Command Line Interface(AWS CLI)를 사용해 직렬 콘솔에 액세스할 수 있습니다.
직렬 콘솔을 사용하기 전에 AWS 계정 수준에서 직렬 콘솔에 액세스 권한을 부여해야 합니다. 그런 다음 IAM 사용자에게 콘솔에 대한 액세스 권한을 부여하는 AWS Identity and Access Management(IAM) 정책을 생성합니다. 직렬 콘솔을 사용하는 각 인스턴스에는 최소 한 명의 암호 기반 사용자가 포함되어야 합니다. Linux용 EC2 직렬 콘솔 구성 방법을 자세히 알아보려면 EC2 직렬 콘솔 액세스 구성을 참조하십시오.
인스턴스에 연결할 수 없고 직렬 콘솔 액세스를 구성하지 않은 경우 다른 방법을 사용하여 구성을 확인하십시오.
참고: AWS CLI 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 문제 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
Systems Manager Session Manager 사용
참고: 이 방법을 사용하려면 SSM Agent를 설치해야 합니다. Systems Manager 사용에 관한 사전 요구 사항 목록은 1단계: Session Manager 사전 요구 사항 완료를 참조하십시오.
AWS Systems Manager Session Manager를 사용하여 인스턴스에 로그인하고 내용을 수정합니다. 다음 단계를 완료하십시오.
-
Systems Manager 콘솔을 엽니다.
-
ls -ld 명령을 사용하여 home 디렉터리에 있는 파일의 권한이 올바른지 확인합니다.
ls -ld /home/ec2-user/참고: ec2-user를 인스턴스 Amazon Machine Image(AMI)를 기반으로 하는 사용자 이름으로 바꾸십시오.
다음 예시와 유사한 출력이 표시됩니다.drwx------ 3 ec2-user ec2-user 4096 Apr 1 08:31 /home/ec2-user/다음 예시에서는 올바른 필수 권한 목록을 보여줍니다.
/home Linux home 디렉터리에 **(0755/drwxr-xr-x)**를 사용합니다.
/home/ec2-user/ 사용자의 home 디렉터리에 **(0700/drwx------)**를 사용합니다.
/home/ec2-user/.ssh .ssh 디렉터리 권한에 **(0700/drwx------)**를 사용합니다.
/home/ec2-user/.ssh/authorized_keys authorized_keys 파일 권한에 **(0600/-rw-------)**를 사용합니다. -
로컬 컴퓨터에서 SSH 공개 키를 사용하는지 확인합니다.
-
출력에 SSH 공개 키의 서명이 없는 경우 authorized_keys 파일을 업데이트하여 SSH 키를 허용합니다. 다음 명령을 실행합니다.
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/ec2-user/.ssh/authorized_keys참고: 예시 키를 SSH 공개 키로 바꾸십시오.
-
권한을 수정하려면 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
AWSSupport-TroubleshootSSH 자동화 런북 실행
AWSSupport-TroubleshootSSH를 사용하여 SSH를 통해 Linux 머신에 연결할 때 원격 연결 오류를 일으키는 문제를 확인하고 수정합니다. 자세한 내용은 SSH를 사용하여 EC2 인스턴스에 연결하려고 할 때 오류가 발생합니다를 참고하세요. AWSSupport-TroubleshootSSH 자동화 워크플로를 사용하여 SSH 연결 문제를 해결하려면 어떻게 해야 하나요?
사용자 데이터 스크립트를 사용하여 SSH 권한을 복구하고 authorized_keys 파일에 올바른 SSH 퍼블릭 키 추가
중요: 이 방법을 사용하려면 인스턴스를 중지해야 합니다. 인스턴스를 중지하면 다음과 같은 결과가 발생합니다.
- 인스턴스가 Amazon Elastic Block Storage(Amazon EBS) 인스턴스 스토어를 기반으로 하거나 데이터가 포함된 인스턴스 스토어 볼륨이 있는 경우 데이터가 손실됩니다.
- 인스턴스가 Amazon EC2 Auto Scaling 그룹에 속한 경우 인스턴스를 중지하면 Amazon EC2 Auto Scaling이 인스턴스를 완전히 종료할 수 있습니다. Amazon EMR, AWS CloudFormation 또는 AWS Elastic Beanstalk를 사용하여 시작하는 인스턴스는 Auto Scaling 그룹에 속할 수 있습니다. 이 경우 인스턴스 종료 여부는 Auto Scaling 그룹의 인스턴스 축소 보호 설정에 따라 달라집니다. 사용자의 인스턴스가 Auto Scaling 그룹의 일부인 경우, 이러한 단계를 완료하기 전에 Auto Scaling 그룹에서 인스턴스를 일시적으로 제거하십시오.
- 인스턴스의 퍼블릭 IP 주소가 변경됩니다. 외부 트래픽을 인스턴스로 라우팅할 때는 퍼블릭 IP 주소 대신 탄력적 IP 주소를 사용하는 것이 모범 사례입니다.
SSH 권한을 복구하려면 다음 단계를 완료하십시오.
-
Amazon EC2 콘솔을 엽니다.
-
탐색 창에서 Instances(인스턴스)를 선택한 다음 시작하려는 인스턴스를 선택합니다.
-
Actions(작업)를 선택하고 Instance settings(인스턴스 설정)를 선택합니다.
-
Edit User Data(사용자 데이터 편집)를 선택합니다.
-
Edit user data(사용자 데이터 편집)에 다음 사용자 데이터 스크립트를 입력합니다.
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 OS_USER=os-user chown root:root /home chmod 755 /home chown $OS_USER:$OS_USER /home/$OS_USER -R chmod 700 /home/$OS_USER chmod 700 /home/$OS_USER/.ssh chmod 600 /home/$OS_USER/.ssh/authorized_keys --//참고: os-user를 인스턴스 시작에 사용한 AMI와 연결된 사용자 이름으로 바꿉니다.
-
Save(저장)를 선택합니다.
-
로컬 컴퓨터에서 SSH 공개 키를 사용하는지 확인합니다.
-
SSH 공개 키의 서명이 출력에 없는 경우 사용자 데이터 스크립트에 키를 추가하십시오. 서명이 일치하면 다음 단계를 진행하십시오.
SSH 공개 키가 있는 사용자 데이터 스크립트의 예시:
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 OS_USER=os-user chown root:root /home chmod 755 /home chmod 700 /home/$OS_USER chmod 700 /home/$OS_USER/.ssh chmod 600 /home/$OS_USER/.ssh/authorized_keys echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/$OS_USER/.ssh/authorized_keys chown $OS_USER:$OS_USER /home/$OS_USER -R --//
참고: 이전 사용자 데이터 스크립트는 인스턴스를 재부팅할 때마다 실행되도록 설정되어 있습니다. 인스턴스에 다시 액세스한 후 사용자 데이터 스크립트를 제거합니다.
(Ubuntu 20.x만 해당) AuthorizedKeysCommand의 SSH 구성 확인
Ubuntu 20.x에서 EC2 Instance Connect는 기본적으로 설치됩니다. SSH 인증을 위해 AuthorizedKeysCommand 및 AuthorizedKeysCommandUser 설정을 구성할 때 EC2 Instance Connect 설치 시 이러한 설정이 업데이트되지 않습니다. 따라서 EC2 Instance Connect를 사용할 수 없습니다. 이 문제를 해결하려면 SSH 구성에서 AuthorizedKeysCommand 및 AuthorizedKeysCommandUser를 제거하십시오.
관련 정보
SSH를 사용하여 Amazon EC2 Linux 인스턴스에 연결할 때 발생하는 문제를 해결하려면 어떻게 해야 합니까?
개인 키를 잃어버렸습니다. 인스턴스에 연결하려면 어떻게 해야 합니까?
처음 인스턴스를 시작한 후 SSH 키 페어를 분실한 경우 Amazon EC2 인스턴스에 연결하려면 어떻게 해야 합니까?

