배포 스크립트나 CI 러너에서 sudo가 비밀번호를 물어보며 멈추는 일이 있습니다. 그렇다고 NOPASSWD: ALL을 거는 건 그 계정이 사실상 무제한 root가 된다는 뜻입니다. 핵심은 꼭 필요한 명령에만 비밀번호 없이 허용하는 것입니다.
진단 — 지금 무엇이 허용돼 있나
해당 사용자가 어떤 sudo 권한을 가졌는지부터 봅니다.
로컬 터미널
sudo -l -U deploy # deploy 사용자가 비밀번호 없이 쓸 수 있는 명령 목록
(ALL) NOPASSWD: ALL 같은 줄이 보인다면 범위가 지나치게 넓은 상태입니다.
개념 — NOPASSWD는 명령 단위로 건다
sudoers 규칙은 사용자 호스트=(실행계정) 태그: 명령 형식입니다. NOPASSWD:는 그 뒤에 나열된 명령에 한해 인증을 생략합니다. 즉 명령 목록을 좁히면 위험 범위도 같이 좁아집니다.
OUTPUT
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp
이 줄은 "deploy는 myapp 재시작만 비밀번호 없이 가능"하다는 의미입니다. 다른 명령은 여전히 인증이 필요합니다.
단계 — visudo로 안전하게 작성
설정 파일은 반드시 visudo로 엽니다. 문법 오류가 있으면 저장을 막아주기 때문에, 직접 편집하다 sudo 자체가 깨지는 사고를 예방합니다.
| 할 일 | 방법 | 이유 |
|---|---|---|
| 별도 파일 사용 | visudo -f /etc/sudoers.d/deploy | 메인 파일 오염 방지 |
| 명령은 절대경로 | /usr/bin/systemctl ... | 경로 위조·PATH 우회 차단 |
| 인자까지 고정 | restart myapp만 허용 | 임의 서비스 조작 차단 |
| 와일드카드 신중 | * 남용 금지 | 의도치 않은 명령 통과 방지 |
- 전용 파일을 만들어 규칙을 한곳에 둡니다.
로컬 터미널
visudo -f /etc/sudoers.d/deploy
-
명령은 반드시 절대경로로 적고, 가능하면 인자까지 못박습니다.
which systemctl로 실제 경로를 확인한 뒤 넣으세요. -
저장 후 문법을 검증합니다.
로컬 터미널
visudo -c # 전체 sudoers 문법 검사
sudo -l -U deploy # 의도대로 적용됐는지 재확인
visudo -c 출력에 parsed OK가 보이면 정상입니다.
흔한 실수
- 상대경로(
systemctl)로 적으면 PATH 조작으로 가짜 명령이 실행될 수 있습니다. 항상 절대경로. NOPASSWD: /usr/bin/vi처럼 셸 탈출이 가능한 명령을 허용하면, 그 안에서 임의 명령을 돌려 사실상 root가 됩니다. 에디터·find·tar등은 특히 주의.- 파일 권한은
0440이어야 합니다. 권한이 틀리면 sudo가 해당 규칙을 무시합니다.
체크리스트
로컬 터미널
visudo -f /etc/sudoers.d/deploy # 전용 파일에서 편집
visudo -c # 문법 검증 (parsed OK 확인)
sudo -l -U deploy # 적용 결과 확인
ls -l /etc/sudoers.d/deploy # 권한 0440 확인
권한·인증 같은 리눅스 보안의 기본기를 명령어로 직접 끊어보며 익히려면 리눅스 트랙에서 회원가입 없이 무료로 실습할 수 있습니다.