
AWS EC2 리눅스 인스턴스에서 실수로 중요한 파일 권한을 잘못 바꿔서 root나 sudo 접근이 완전히 막히는 상황, 경험해 보신 분들 많으실 겁니다.
예를 들어 chmod -s /usr/bin/su를 잘못 실행해서 setuid 비트가 사라지면, 더 이상 su나 sudo를 통해 root 권한을 얻을 수 없게 됩니다.
이런 최악의 상황에서도 EC2는 Cloud-Init의 사용자 데이터(User Data) 기능을 이용하면 인스턴스 재부팅 전에 복구 스크립트를 강제로 실행할 수 있습니다.
인스턴스를 중지 → 사용자 데이터 입력 → 재시작 → 복구 완료 → 사용자 데이터 삭제 순서로 진행하면 됩니다.
복구가 필요한 대표적인 상황 예시
- chmod -s /usr/bin/su → setuid 비트 사라짐 (su 명령어로 root 전환 불가)
- chmod 700 /etc/sudoers 또는 sudoers 파일 권한/소유자 변경
- /etc/sudoers.d/ 디렉토리 내 파일 삭제 또는 권한 오류
- root 계정 패스워드 모름 + sudo 불가
- sshd_config 잘못 수정해서 SSH root 로그인 불가 + 일반 사용자 sudo 불가
※ 이런 경우 Systems Manager Session Manager도 안 되고,
EC2 Instance Connect도 sudo가 필요해서 막히는 경우가 많습니다.
Cloud-Init을 이용한 복구 절차 (단계별)
- EC2 인스턴스 중지
AWS 콘솔 → EC2 → 인스턴스 선택 → 인스턴스 상태 → 중지 - 작업 → 사용자 데이터 수정
인스턴스 선택 → 작업(Actions) → 인스턴스 설정 → 사용자 데이터 편집(Edit user data) - 아래 YAML 형식으로 사용자 데이터 입력
(멀티파트 MIME 형식으로 cloud-config + 쉘 스크립트 결합) - EC2 인스턴스 시작
시작 후 1~2분 정도 기다린 뒤 SSH로 다시 접속 시도 - 복구 확인 후 사용자 데이터 삭제
다시 사용자 데이터 편집 → 내용 전체 삭제 → 저장
(삭제 안 하면 매 부팅마다 스크립트가 반복 실행됩니다)
실제 사용할 Cloud-Init 사용자 데이터 예제
(su setuid 복구 예시)
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash
chmod +s /usr/bin/su
echo "su setuid bit 복구 완료" >> /var/log/cloud-init-output.log
--//--
※ 위 스크립트는 cloud_final_modules에 scripts-user, always를 추가하여 매 부팅마다 실행되도록 강제합니다.
복구 후에는 반드시 사용자 데이터를 지워주세요.
다른 복구 사례별 간단 스크립트 예시
- sudoers 권한 복구
chmod 440 /etc/sudoers
chown root:root /etc/sudoers - root 패스워드 강제 설정
echo 'root:임시비밀번호' | chpasswd - sshd 재시작 및 PermitRootLogin yes 설정
sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
systemctl restart sshd
이 방법은 EC2가 살아있는 한 거의 복구 가능합니다.
(단, EBS 볼륨이 암호화되어 있고 키를 분실한 경우는 별도 복구가 필요할 수 있습니다.)
관련 궁금한 부분 있으시면, 댓글 부탁드립니다. 감사합니다!