- 출처 / 참고: 리눅스 시스템 보안 및 계정 권한 복구 가이드
명령어:
pkexec chmod 0440 /etc/sudoers,visudo -c,chmod 440,su -
키워드: Sudoers World Writable, Syntax Error, Visudo Check, File Permissions, Emergency Recovery
사용처: 잘못된 chmod 명령으로 sudo 실행 불가 시, /etc/sudoers 문법 오류로 일반 사용자의 root 권한 승격이 차단되었을 때 복구
실행예제
# 1. sudo 실행 시 world writable 권한 오류 발생 확인
$ sudo ls -l /root
sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
# 2. 현재 /etc/sudoers 및 /etc/sudoers.d 디렉터리의 권한 상태 확인
$ ls -l /etc/sudoers /etc/sudoers.d
-rwxrwxrwx 1 root root 3181 Sep 22 13:45 /etc/sudoers
/etc/sudoers.d:
total 4
-rwxrwxrwx 1 root root 958 Sep 22 13:45 90-cloud-init-users
# 3. sudoers 파일 구문(Syntax) 오류 상태 점검 (root 세션 또는 문법 검사 시)
# 오류 메시지 예시:
# >>> /etc/sudoers: syntax error near line 28 <<<
# sudo: parse error in /etc/sudoers near line 28
# sudo: no valid sudoers sources found, quitting
스크립트
#!/usr/bin/env bash
#
# /etc/sudoers 권한 복구 및 문법 오류 검증 스크립트 (root 세션 또는 pkexec 환경에서 실행)
#
set -euo pipefail
echo "=== [1] 실행 권한 확인 (Root 권한 필수) ==="
if [ "$(id -u)" -ne 0 ]; then
echo "오류: 이 스크립트는 root 권한으로 실행되어야 합니다."
echo "sudo가 작동하지 않는 경우 'su -' 또는 'pkexec bash <스크립트>'를 사용하십시오."
exit 1
fi
echo "=== [2] /etc/sudoers 및 /etc/sudoers.d 권한 및 소유권 원복 ==="
# 소유자를 root:root로 복원
chown -R root:root /etc/sudoers /etc/sudoers.d
# sudoers 메인 파일 권한을 0440 (r--r-----)으로 제한
chmod 0440 /etc/sudoers
# sudoers.d 디렉터리 권한을 0750, 하위 설정 파일들을 0440으로 제한
if [ -d /etc/sudoers.d ]; then
chmod 0750 /etc/sudoers.d
find /etc/sudoers.d -type f -exec chmod 0440 {} +
fi
echo "=== [3] sudoers 파일 문법 검증 (visudo -c) ==="
if visudo -c; then
echo "=== [4] 문법 검사 통과: sudoers 파일이 유효합니다. ==="
else
echo "경고: 문법 검사에 실패했습니다. 즉시 'visudo'를 실행하여 오류 라인을 수정하십시오."
exit 2
fi
echo "=== [5] sudo 명령 테스트 ==="
sudo -k
sudo -l -U root
echo "=== [완료] /etc/sudoers 권한 및 구문 복구가 성공적으로 완료되었습니다. ==="
해설
- 에러 원인 분석:
- 보안 메커니즘 차단:
sudo유틸리티는 보안상 매우 엄격한 권한 검사를 수행합니다./etc/sudoers파일이나/etc/sudoers.d/디렉터리가 소유자 외에 수정 가능한 상태(world writable, 예:777또는666)가 되면, 악의적인 사용자의 변조를 방지하기 위해 즉시 모든 sudo 명령 실행을 거부합니다. - 구문(Syntax) 오류: 일반 텍스트 편집기(
vi,nano등)로/etc/sudoers를 직접 수정하다가 오타나 포맷 실수가 발생하면 파싱 에러가 발생하여 권한 승격 플러그인 초기화가 실패합니다.
- 보안 메커니즘 차단:
- 복구 절차 및 핵심 로직:
- 권한 제한 (
chmod 0440):/etc/sudoers의 표준 권한은 소유자(root)와 그룹(root)만 읽기 가능하고 쓰기가 불가능한0440(-r--r-----)이어야 합니다. - sudo가 막혔을 때의 우회 진입:
su -: root 비밀번호가 설정되어 있다면 root 셸로 직접 전환하여 권한을 수정합니다.pkexec활용: GUI/Polkit이 설치된 배포판(Ubuntu 데스크톱/일부 서버)에서는pkexec chmod 0440 /etc/sudoers를 통해 PolicyKit 인증으로 권한을 원복할 수 있습니다.- 단일 사용자 모드 / 복구 모드: root 암호가 없거나 잠겨있는 경우 재부팅 후 GRUB 메뉴에서
init=/bin/bash또는 복구 모드(Recovery Mode)로 부팅하여 권한을 복구합니다.
visudo -c문법 검사: 파일을 직접 덮어쓰기 전에 구문 오류를 사전에 감지하여 시스템 잠금 상태를 방지합니다.
- 권한 제한 (
주의사항
- 직접 편집 금지 (
visudo사용 필수):/etc/sudoers를 편집할 때는 절대로nano나 일반vim으로 열지 말고 반드시visudo명령어를 사용해야 합니다.visudo는 저장 시점에 문법 오류를 자동으로 감지하여 오류가 있을 경우 저장을 차단해 줍니다.
/etc/sudoers.d/디렉터리 파일 주의:/etc/sudoers.d/내에 생성하는 추가 설정 파일 역시 반드시 소유권root:root, 권한0440을 유지해야 합니다. 또한 파일명에 마침표(.)나 물결표(~)가 포함되면sudo가 해당 설정을 무시하므로 네이밍 규칙에 주의해야 합니다.
- 작업 시 셸 세션 유지:
- sudo 관련 설정을 변경하거나 복구할 때는 현재 열려 있는 root 터미널 세션을 닫지 말고, 다른 터미널 창을 열어
sudo -v또는 일반 명령어가 정상 작동하는지 완전히 검증한 후 기존 세션을 종료해야 잠김 현상을 방지할 수 있습니다.
- sudo 관련 설정을 변경하거나 복구할 때는 현재 열려 있는 root 터미널 세션을 닫지 말고, 다른 터미널 창을 열어