sudo 명령을 사용하면 주기적으로 패스워드를 묻는게 번거로워서 조치하려고 한다.
이 참에 무심코 사용하던 sudo 명령과 관련 파일을 정확하게 정리하고 넘어간다.
su 명령
Switch User 혹은 Substitute User의 약자로,
말 그대로 잠시 사용자를 전환한다.
정확히는 현재 이용중인 셸 위에 '대상 사용자 이름으로' 새로운 셸을 실행하며,
exit 명령을 통해 새 셸을 종료하고 기존 셸로 복귀 가능하다.
sudo 명령
단순히 root 권한으로 무언가를 실행하는 명령이 아닌,
타 사용자(혹은 그룹)의 이름으로 일회성 명령을 실행하기 위한 명령이다.
맥락 상 아래와 같이 이해할 수 있다.sudo = su + do = Switch User then Do once
단순히 su의 일회성 동작이라고 하기엔 사용자 전환 방식이 다르다.
- su: 대상 사용자의 패스워드를 입력해야 전환
- sudo: 허가명단(/etc/sudoers)에 등록되어 있어야 전환
/etc/sudoers 파일
sudo 명령 실행 권한을 지정하는 일종의 허가명단이다.
어떤 사용자가 누구의 이름을 빌려 무엇을 실행할 수 있는지 작성한다.
구체적으로 다음 5가지 항목을 작성한다.
1. 누가
사용자이름 혹은 '%그룹이름' 형식.
그룹이름을 적을 경우, 해당 그룹의 모든 구성원들에게 적용된다.
2. 어디에서
권한규칙을 적용할 hostname으로,
어느 컴퓨터에서만 적용한다는 의미로 사용됨.
한 대의 컴퓨터만 관리한다면 큰 의미 없는 필드이지만,
여러 노드를 두고 sudoer를 중앙집중식으로 관리할 때 유용하게 사용할 수 있다.
ALL을 적으면 모든 노드에서 sudo 실행 가능하다.
3. (선택) 누구의 이름으로
sudo를 실행한 사용자가 어떤 사용자의(혹은 어떤 그룹의) 이름을 빌려 명령을 실행할 수 있는지 지정한다.
즉, 전환할 수 있는 사용자/그룹의 후보이다.
다음과 같이 다양한 형식으로 작성할 수 있다.
(user1:group1): user1과 group1 이름을 빌릴 수 있음(user1): user1 사용자의 이름을 빌릴 수 있음(:group1): group1 그룹의 이름을 빌릴 수 있음(user1, user2:group1, group2): user1, user2 사용자와 group1, group2 이름을 빌릴 수 있음(ALL:ALL): 모든 사용자 및 모든 그룹의 이름을 빌릴 수 있음미지정: root 사용자와 root(또는 wheel) 그룹의 이름을 빌릴 수 있음
4. 특수옵션 (Tag)
sudo 실행 시 적용할 옵션으로, '옵션명:'의 형식으로 작성한다.
(1) 실행 시 패스워드를 물을 것인지
PASSWD: 기본값. 물음.NOPASSWD: 묻지 않음.
(2) 실행한 사용자의 환경변수를 그대로 적용할건지
NOSETENV: 기본값. 적용하지 않고 시스템 기본 환경변수만 사용하여 명령 실행.SETENV: 사용자의 환경변수를 적용하여 명령 실행.
(3) sudo로 실행한 프로세스에서 또 다른 프로세스를 실행할 수 있는지
EXEC: 기본값. 실행 가능.NOEXEC: 실행 불가. 보안 강화 시 적용을 검토할 수 있음.
NOEXEC와 보안 위험에 대해서는 말미에 다시 언급한다.
(4) sudo로 실행한 명령행과 실행프로그램의 stdin, stderr, stdout을 모두 로그로 남길 것인지
LOG\_INPUT: stdin을 로그로 남김.LOG\_OUTPUT: stdout, stderr를 로그로 남김.
5. 실행 가능 명령
실행 가능한 프로그램들을 지정하며,
콤마로 이어붙인 프로그램 경로를 작성한다.
권한 전체 문장 예시
위 5가지 요소를 한 줄에 작성하며, 다음과 같은 형식으로 작성된다.
# wheel 그룹의 구성원들은 모든 사용자 및 그룹의 이름으로 모든 명령을 실행할 수 있다.
%wheel ALL=(ALL) ALL
# normal 그룹의 구성원들은 root의 이름을 빌릴 수 있지만, 시스템 종료 명령만 실행할 수 있다.
%normal localhost=/sbin/shutdown -h now
# bob 사용자는 모든 사용자 및 그룹의 이름으로 모든 명령을 실행할 수 있고, 이 때 패스워드를 묻지 않는다.
bob ALL=(ALL:ALL) NOPASSWD: ALLvisudo 명령
/etc/sudoers 파일을 직접 편집하는 대신,
visudo 명령을 통해 편집함으로써 문법적 실수와 동시수정 문제를 방지할 수 있다.
특히, 문법적 오류가 있는 경우 sudo 기능 자체가 먹통이 되므로 visudo를 통해 문법 검사를 함께 진행하기를 강력히 권한다.
NOEXEC 태그 미적용 시 위험 요소
sudo 명령을 통해 root 이름으로 특정 프로그램을 실행했다.
프로그램 동작 도중 잠시 셸로 빠져나갈 수 있는데, 이를 탈옥(Shell Escape)이라고 한다.
가령, vi 실행 중 :!sh 를 입력하면 셸로 빠져나가는데,
이 때의 셸은 sudo로 획득한 사용자의 권한을 가진 셸이다.

이를 방지하기 위해 sudoers 파일에 다음과 같이 vi에 대한 NOEXEC 규칙을 추가할 수 있다.
user1 ALL=(ALL) NOEXEC: /usr/bin/vi'Linux' 카테고리의 다른 글
| 안쓰는 디스크를 리눅스 NFS로 사용하기: Ubuntu 24.04 (0) | 2025.10.07 |
|---|---|
| Hard Link; 하드링크 (0) | 2025.09.02 |