리눅스 sudo 명령어 사용법 - 권한 위임과 sudoers 설정 정리
이 명령어를 언제 쓰는가
패키지를 설치하거나 /etc 아래 설정을 고치거나 서비스를 재시작할 때, root로 직접 로그인하지 않고 필요한 순간에만 권한을 빌리기 위해 쓴다.
운영 서버에서 root 계정으로 상주하는 것은 사고 원인 추적을 불가능하게 만든다. sudo는 "누가 언제 무슨 명령을 실행했는지"를 로그로 남기기 때문에, 여러 명이 붙는 서버라면 sudo를 쓰는 것이 사실상 원칙이다.
기본 형식
sudo [옵션] 명령 [인자...]
- 처음 실행할 때 본인 계정의 비밀번호를 묻는다. root 비밀번호가 아니다.
- 한 번 인증하면 기본 15분(
timestamp_timeout) 동안 같은 터미널에서 다시 묻지 않는다. - 사용할 수 있는 계정은 Ubuntu/Debian에서는
sudo그룹, RHEL/CentOS/Rocky에서는wheel그룹 소속이다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
-i | root 로그인 셸로 전환(환경변수·홈까지 root 기준) | sudo -i |
-s | root 셸로 전환하되 현재 환경을 유지 | sudo -s |
-u 사용자 | root가 아닌 다른 계정으로 실행 | sudo -u postgres psql |
-l | 내가 sudo로 쓸 수 있는 명령 목록 확인 | sudo -l |
-k | 인증 캐시를 즉시 만료(다음에 다시 물음) | sudo -k |
-E | 현재 환경변수를 유지한 채 실행(허용된 경우만) | sudo -E ./install.sh |
-v | 명령 없이 인증만 갱신(긴 스크립트 앞에) | sudo -v |
실전 예제
1. 내가 뭘 할 수 있는지 먼저 본다. 새 서버를 인계받았을 때 가장 먼저 치는 명령이다.
$ sudo -l
User deploy may run the following commands on web01:
(ALL) NOPASSWD: /bin/systemctl restart myapp
(ALL) /usr/bin/journalctl
2. DB 관리 계정으로 갈아타서 작업한다. PostgreSQL은 OS 계정 인증을 쓰므로 이 형태가 표준이다.
sudo -u postgres psql -c '\l'
3. 리다이렉션이 필요한 파일 쓰기. 아래 첫 줄은 실패한다. 리다이렉션은 sudo가 아니라 현재 셸이 처리하기 때문이다.
# 안 됨: bash: /etc/sysctl.d/99-custom.conf: Permission denied
sudo echo 'vm.swappiness=10' > /etc/sysctl.d/99-custom.conf
# 됨
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-custom.conf
# 이어붙일 때
echo 'net.core.somaxconn=1024' | sudo tee -a /etc/sysctl.d/99-custom.conf
4. 특정 명령만 비밀번호 없이 허용하도록 설정한다. 배포 스크립트나 CI에서 서비스 재시작만 필요할 때 쓰는 방식이다. 반드시 visudo로 편집한다.
sudo visudo -f /etc/sudoers.d/deploy
내용은 다음과 같이 적는다. 명령은 절대 경로로, 범위는 최소한으로 한다.
deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp, /bin/systemctl status myapp
파일 권한은 0440이어야 하며, visudo -c로 문법을 검사할 수 있다.
5. 누가 무엇을 했는지 확인한다. 로그 위치는 배포판에 따라 다르다.
# Ubuntu/Debian
sudo grep sudo /var/log/auth.log
# RHEL/CentOS/Rocky
sudo grep sudo /var/log/secure
# systemd 저널을 쓴다면
sudo journalctl -t sudo --since today
함정과 주의점
sudoers를 일반 편집기로 고치면 서버에서 잠길 수 있다. 문법 오류가 있으면 sudo 자체가 동작을 거부하고, root 로그인이 막혀 있으면 복구 콘솔 외에는 손쓸 방법이 없다. 반드시visudo(또는visudo -f)로 편집한다. 저장 시 문법 검사를 통과해야만 반영된다.sudo cmd > file은 권한이 올라가지 않는다. sudo가 실행하는 것은cmd뿐이고, 리다이렉션은 원래 셸의 권한으로 일어난다.tee를 쓰거나sudo sh -c 'cmd > file'로 감싼다.- NOPASSWD 범위를 넓게 주면 root를 그냥 내주는 것과 같다.
NOPASSWD: /bin/su,NOPASSWD: ALL은 물론이고vi,find,tar,python처럼 내부에서 다른 명령을 실행할 수 있는 도구를 허용하면 그것으로 root 셸을 얻을 수 있다. 인자까지 고정한 좁은 명령만 허용한다. - 와일드카드는 생각보다 헐겁다.
deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart *는 임의의 서비스를 재시작할 수 있게 만든다. 서비스 이름을 명시한다. sudo -i로 들어간 뒤 오래 머무르지 않는다. root 셸 안에서 친 명령은 개별 sudo 로그가 남지 않아 추적이 끊긴다.
함께 보면 좋은 명령어
visudo— sudoers를 안전하게 편집하는 유일한 방법.su— 계정 자체를 전환한다. 대상 계정의 비밀번호가 필요하다는 점이 sudo와 다르다.id— 지금 어떤 권한으로 실행 중인지 확인한다.journalctl -t sudo— sudo 사용 이력을 추적한다.