sudo 명령을 실행할 때 EC2 인스턴스의 sudo 오류를 수정하려면 어떻게 해야 합니까?

5분 분량
0

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 주소를 사용하는 것이 좋습니다.

복구 인스턴스에 루트 디스크를 연결하려면 다음 단계를 완료합니다.

  1. 새 키 페어를 생성합니다.

  2. 원본 인스턴스의 루트 볼륨에 대한 볼륨 ID 및 디바이스 이름을 가져옵니다.

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

  4. 동일한 가용 영역에서 동일한 Linux 운영 체제 (OS) 버전을 사용하는 AMI(Amazon Machine Image)에서 복구 인스턴스를 시작합니다.

  5. 원본 인스턴스에서 루트 볼륨을 분리하고, 복구 인스턴스에 보조 볼륨으로 연결합니다.

  6. 새 SSH 키 페어로 복구 인스턴스에 연결합니다.

  7. 다음 명령을 실행하여 루트 사용자로 변경합니다.

    [ec2-user ~]$ sudo su
  8. 블록 디바이스 이름과 파티션을 식별하려면 복구 인스턴스에서 다음 명령을 실행합니다.

    [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 인스턴스 볼륨의 디바이스 이름을 참조하십시오.

  9. 작업 인스턴스에서 /etc/sudoers 파일을 백업으로 복사하려면 다음 명령을 실행합니다.

    [root ~]$ cp /etc/sudoers /mnt/etc/sudoers.bak
  10. /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
  1. 루트 볼륨을 마운트 해제하려면 다음 명령을 실행합니다.
[root ~]$ umount -fl /mnt
  1. 복구 인스턴스에서 보조 볼륨으로 연결된 루트 볼륨을 분리합니다. 이후 2단계의 디바이스 이름을 사용하여 원본 인스턴스에 다시 연결합니다.
  2. 원본 인스턴스를 시작한 다음 sudo 명령이 제대로 작동하는지 확인합니다.

사용자 데이터를 사용하여 파일 수정

참고: 다음 문제 해결 방법은 사용자 데이터 입력을 사용합니다. 이 방법을 사용하려면 루트 사용자의 암호를 설정해야 합니다.

사용자 데이터를 사용하여 파일을 수정하려면 다음 단계를 완료하십시오.

  1. Amazon EC2 콘솔을 엽니다.

  2. 탐색 창에서 인스턴스를 선택한 다음, 해당 인스턴스를 선택합니다.

  3. 인스턴스 상태를 선택한 다음, 인스턴스 중지를 선택합니다.

  4. **인스턴스 중지?**에서 중지를 선택합니다.

  5. 루트 사용자의 임시 암호를 설정합니다.
    예시:

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

    중요: 이 암호는 일반 텍스트를 사용하여 보안 암호를 전달하며 안전하지 않습니다. 문제 해결 단계를 완료한 후에는 루트 사용자의 임시 암호를 제거해야 합니다.

  6. 인스턴스를 시작한 다음 ec2-user로 로그인합니다.

  7. /etc/sudoers 파일에 액세스하려면 다음 pkexec 명령을 실행합니다.

    pkexec /usr/sbin/visudo
  8. 루트 사용자 암호를 입력한 다음 /etc/sudoers 파일을 수정합니다.

  9. sudo 명령을 실행하여 sudo가 제대로 작동하는지 확인합니다.

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

Amazon EC2 콘솔을 사용하여 루트 사용자 암호를 비롯한 사용자 데이터 값을 삭제하려면 다음 단계를 완료하십시오.

  1. Amazon EC2 콘솔을 엽니다.
  2. 탐색 창에서 인스턴스를 선택한 다음, 해당 인스턴스를 선택합니다.
  3. 작업을 선택하고 인스턴스 설정을 선택합니다.
  4. 사용자 데이터 편집을 선택한 다음 모든 사용자 데이터를 삭제합니다.

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로 바꾸십시오.

사용자 데이터를 삭제한 후 인스턴스를 시작합니다.

관련 정보

EC2 Linux 인스턴스에서 sudo 명령을 실행할 수 없는 이유는 무엇인가요?

AWS 공식
AWS 공식업데이트됨 한 달 전
댓글 없음