sudo 명령을 실행할 때 EC2 인스턴스의 sudo 오류를 수정하려면 어떻게 해야 합니까?
Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 /etc/sudoers 파일을 편집 또는 삭제했습니다. 이후 sudo 명령을 실행할 때 구문 또는 sudo 오류가 발생합니다.
간략한 설명
/etc/sudoers 파일을 삭제하거나 잘못 구성하면 다음과 같은 구문 또는 sudo 오류가 발생합니다.
- "/etc/sudoers:abc:x: syntax error"
- "sudo: unable to open /etc/sudoers: No such file or directory"
- "sudo: no valid sudoers sources found, quitting"
- "sudo: error initializing audit plugin sudoers_audit"
이러한 오류 중 하나가 발생하면 사용자 또는 사용자 그룹에 시스템 리소스에 대한 액세스 권한을 부여할 수 없습니다. /etc/sudoers 파일을 수정하려면 복구 인스턴스에 루트 디스크를 연결합니다. 복구 인스턴스에 루트 디스크를 연결할 수 없는 경우 사용자 데이터를 사용하여 파일을 수정하십시오.
해결 방법
AWS Command Line(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
복구 인스턴스에 루트 디스크 연결
복구 인스턴스에 루트 디스크를 연결하여 /etc/sudoers 파일을 수정하는 것이 바람직합니다.
전제 조건: 인스턴스를 중지 또는 재시작할 때 인스턴스 스토어 볼륨의 데이터가 지워집니다. 유지하려는 인스턴스 스토어 볼륨의 모든 데이터를 백업하십시오. 자세한 내용은 루트 디바이스 유형을 참조하십시오. 또한 인스턴스를 중지하거나 시작할 때 인스턴스의 퍼블릭 IP 주소가 변경됩니다. 외부 트래픽을 인스턴스로 라우팅하는 경우 퍼블릭 IP 주소 대신 탄력적 IP 주소를 사용하는 것이 좋습니다.
복구 인스턴스에 루트 디스크를 연결하려면 다음 단계를 완료합니다.
-
동일한 가용 영역에서 동일한 Linux 운영 체제 (OS) 버전을 사용하는 AMI(Amazon Machine Image)에서 복구 인스턴스를 시작합니다.
-
새 SSH 키 페어로 복구 인스턴스에 연결합니다.
-
다음 명령을 실행하여 루트 사용자로 변경합니다.
[ec2-user ~]$ sudo su
-
블록 디바이스 이름과 파티션을 식별하려면 복구 인스턴스에서 다음 명령을 실행합니다.
[root ~]$ lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 8G 0 disk └─xvda1 202:1 0 8G 0 part / xvdf 202:80 0 101G 0 disk └─xvdf1 202:81 0 101G 0 part xvdg 202:96 0 30G 0 disk
위의 예시에서 /dev/xvda와 /dev/xvdf 볼륨 디바이스 이름은 파티셔닝된 볼륨이고, /dev/xvdg는 파티셔닝된 볼륨이 아닙니다.
볼륨이 파티셔닝된 경우 다음 명령을 실행하여 원시 디바이스(/dev/xvdf) 대신 파티션(/dev/xvdf1)을 마운트합니다.[root ~]$ mount -o nouuid /dev/xvdf1 /mnt
AWS Nitro System 기반 인스턴스를 사용하는 경우 볼륨 디바이스 이름은 /dev/nvme[0-26]n1과 비슷합니다. 인스턴스가 NVMe를 사용하여 Nitro System을 기반으로 구축된 경우 /mnt 디렉터리에 파티션을 마운트합니다. lsblk 명령으로 식별한 디바이스 이름을 사용합니다.
[root ~]$ mount -o nouuid /dev/nvme1n1p1 /mnt
자세한 내용은 Amazon EC2 인스턴스 볼륨의 디바이스 이름을 참조하십시오.
-
작업 인스턴스에서 /etc/sudoers 파일을 백업으로 복사하려면 다음 명령을 실행합니다.
[root ~]$ cp /etc/sudoers /mnt/etc/sudoers.bak
-
/mnt 디렉터리에 chroot 환경을 생성하려면 다음 명령을 실행합니다.
[root ~]$ for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt
위 예제에서 /dev, /proc, /sys 및 /run 디렉터리는 원래 루트 파일 시스템에서 바인드 마운트되었습니다. 이를 통해 chroot 환경 내에서 실행되는 프로세스가 시스템 디렉토리에 액세스할 수 있습니다. /etc/sudoers 파일을 편집하려면 chroot 환경에서 visudo 명령을 실행합니다.
[root ~]$ visudo
참고: sudoers 파일을 편집하려면 visudo 명령을 실행해야 합니다. visudo 명령은 sudoers 파일을 잠급니다.
이전 명령에서 오류가 발생하면 다음 diff 명령을 실행하여 /etc/sudoers 파일을 새 파일인 /etc/sudoers.bak와 비교합니다.
[root ~]$ diff /etc/sudoers /etc/sudoers.bak
참고: 파일을 편집하기 전에 사용자 지정 변경을 하지 않았다면 /etc/sudoers.bak 파일을 /etc/sudoers에 복원하십시오. chroot 환경을 종료하려면 다음 명령을 실행합니다.
[root ~]$ exit
- 루트 볼륨을 마운트 해제하려면 다음 명령을 실행합니다.
[root ~]$ umount -fl /mnt
- 복구 인스턴스에서 보조 볼륨으로 연결된 루트 볼륨을 분리합니다. 이후 2단계의 디바이스 이름을 사용하여 원본 인스턴스에 다시 연결합니다.
- 원본 인스턴스를 시작한 다음 sudo 명령이 제대로 작동하는지 확인합니다.
사용자 데이터를 사용하여 파일 수정
참고: 다음 문제 해결 방법은 사용자 데이터 입력을 사용합니다. 이 방법을 사용하려면 루트 사용자의 암호를 설정해야 합니다.
사용자 데이터를 사용하여 파일을 수정하려면 다음 단계를 완료하십시오.
-
Amazon EC2 콘솔을 엽니다.
-
탐색 창에서 인스턴스를 선택한 다음, 해당 인스턴스를 선택합니다.
-
인스턴스 상태를 선택한 다음, 인스턴스 중지를 선택합니다.
-
**인스턴스 중지?**에서 중지를 선택합니다.
-
루트 사용자의 임시 암호를 설정합니다.
예시: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 chpasswd <<<"root:root" --//
중요: 이 암호는 일반 텍스트를 사용하여 보안 암호를 전달하며 안전하지 않습니다. 문제 해결 단계를 완료한 후에는 루트 사용자의 임시 암호를 제거해야 합니다.
-
인스턴스를 시작한 다음 ec2-user로 로그인합니다.
-
/etc/sudoers 파일에 액세스하려면 다음 pkexec 명령을 실행합니다.
pkexec /usr/sbin/visudo
-
루트 사용자 암호를 입력한 다음 /etc/sudoers 파일을 수정합니다.
-
sudo 명령을 실행하여 sudo가 제대로 작동하는지 확인합니다.
Amazon EC2 콘솔을 사용하여 루트 사용자 암호를 비롯한 사용자 데이터 값을 삭제하려면 다음 단계를 완료하십시오.
- Amazon EC2 콘솔을 엽니다.
- 탐색 창에서 인스턴스를 선택한 다음, 해당 인스턴스를 선택합니다.
- 작업을 선택하고 인스턴스 설정을 선택합니다.
- 사용자 데이터 편집을 선택한 다음 모든 사용자 데이터를 삭제합니다.
AWS CLI 인터페이스를 사용하여 루트 사용자 암호를 비롯한 사용자 데이터 값을 삭제하려면 다음 modify-instance-attribute 명령을 실행합니다.
aws ec2 modify-instance-attribute --instance-id example-instance-id --user-data Value=""
참고: example-instance-id를 인스턴스 ID로 바꾸십시오.
사용자 데이터를 제거했는지 확인하려면 다음 describe-instance-attribute 명령을 실행합니다.
aws ec2 describe-instance-attribute --instance-id example-instance-id --attribute userData
참고: example-instance-id를 인스턴스 ID로 바꾸십시오.
사용자 데이터를 삭제한 후 인스턴스를 시작합니다.
관련 정보
관련 콘텐츠
- 질문됨 2년 전lg...
- 질문됨 2년 전lg...
- 질문됨 일 년 전lg...
- AWS 공식업데이트됨 일 년 전
- AWS 공식업데이트됨 일 년 전