파일 · 권한 · 사용자 관리 41 / 50 · Part 5. 권한 상승과 Linux 보안
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 19. sudo와 su
Part 5 「권한 상승과 Linux 보안」을 시작한다. Part 4까지 계정과 그룹을 다뤘다면, Part 5는 그 계정들이 어떻게 더 높은 권한을 얻는가, 그리고 그것을 어떻게 점검·탐지하는가 를 다룬다. SOC 분석가의 핵심 업무 영역이다.
첫 글은 일반 사용자가 root 권한을 얻는 두 방법, su와 sudo 의 비교다. 둘의 가장 중요한 차이는 기능이 아니라 추적성 이다.
sudo는 누가, 언제, 어떤 명령을 root로 실행했는지 명령 단위로 로그에 남긴다.su는 root 셸을 연 시점 만 남고, 그 안에서 실행한 명령은 기본 로그에 남지 않는다.권한 상승 흔적을 추적하려면 이 로그 형식을 정확히 읽을 줄 알아야 한다. 이번 글에서 실제 로그로 확인한다.
| 구분 | su / su - | sudo |
|---|---|---|
| 요구 비밀번호 | 대상 계정(root) 의 비밀번호 | 본인 비밀번호 |
| 권한 범위 | 대상 계정의 셸 전체 | sudoers에서 허용한 명령만 |
| 로그 | 세션 시작·종료 | 명령마다 기록 |
| root 비밀번호 공유 | 필요 | 불필요 |
| 환경 | su -: 대상 계정 로그인 환경 | env_reset으로 초기화 |
| 형태 | 동작 |
|---|---|
su root | root로 전환, 현재 환경 일부 유지 |
su - root | root의 로그인 환경 으로 전환 (PATH·홈 등) |
그래서 Ubuntu는 기본적으로 root 비밀번호를 설정하지 않아 su로 root가 될 수 없고 sudo만 쓴다. RHEL 계열도 sudo를 권장한다.

sudo는 root 소유 SUID 프로그램이다(28편). 그래서 일반 사용자가 실행해도 root 권한으로 동작하며, 다음 순서로 처리한다.
/etc/sudoers와 /etc/sudoers.d/*에서 실행자·명령에 맞는 규칙을 찾는다./var/log/secure(Ubuntu auth.log)와 journal에 남긴다.su는 PAM으로 대상 계정의 비밀번호 를 확인한 뒤 그 계정의 셸을 실행한다. 이후 셸 안의 명령은 su가 관여하지 않으므로 기록되지 않는다. su 이후 활동을 추적하려면 auditd의 execve 규칙이 필요하다. 이때 auid(감사 UID)는 원래 로그인 계정으로 유지 되므로, root 셸에서 실행된 명령도 원래 사용자에게 연결할 수 있다.
analyst에게 sudo 권한(ALL)을 부여한 테스트 환경이다. 격리된 컨테이너에서 진행한다.
# 1) sudo — 본인 비밀번호로 명령 단위 실행
echo 'Lab!2026' | sudo -S id
echo 'Lab!2026' | sudo -S cat /etc/shadow | head -1 # (실습 출력에서 해시는 생략 처리)
# 2) 내 sudo 권한 확인
sudo -l
# 3) (root 로) 로그 확인 — sudo 는 명령 단위
grep -E 'sudo|COMMAND' /var/log/secure | tail -4
# 4) su 로그 — 세션 시작만
grep -E 'su(\[|:)' /var/log/secure | tail -3


텍스트 원본(실제 출력):
[analyst@rocky9-lab ~]$ echo "=== sudo: 본인 비밀번호로 명령 단위 실행 ==="
=== sudo: 본인 비밀번호로 명령 단위 실행 ===
[analyst@rocky9-lab ~]$ echo 'Lab!2026' | sudo -S id 2>/dev/null
uid=0(root) gid=0(root) groups=0(root)
[analyst@rocky9-lab ~]$ echo 'Lab!2026' | sudo -S cat /etc/shadow 2>/dev/null | head -1 | sed -E 's/(\$6\$)[^:]+/\1<해시생략>/'
root:$6$<해시생략>:20720:0:99999:7:::
[analyst@rocky9-lab ~]$ echo "=== sudo -l : 내 권한 확인 ==="
=== sudo -l : 내 권한 확인 ===
[analyst@rocky9-lab ~]$ echo 'Lab!2026' | sudo -S -l 2>/dev/null | tail -3
User analyst may run the following commands on rocky9-lab:
(ALL) ALL
[root@rocky9-lab ~]# echo "=== sudo 로그 (명령 단위 기록) ==="
=== sudo 로그 (명령 단위 기록) ===
[root@rocky9-lab ~]# grep -E 'sudo|COMMAND' /var/log/secure | tail -4
Sep 24 15:02:10 rocky9-lab sudo: analyst : PWD=/home/analyst ; USER=root ; COMMAND=/bin/cat /etc/shadow
Sep 24 15:02:10 rocky9-lab sudo: pam_systemd(sudo:session): Failed to connect to system bus: No such file or directory
Sep 24 15:02:10 rocky9-lab sudo: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000)
Sep 24 15:02:10 rocky9-lab sudo: pam_unix(sudo:session): session closed for user root
[root@rocky9-lab ~]# echo "=== su 로그 (세션 시작만 기록, 내부 명령은 안 남음) ==="
=== su 로그 (세션 시작만 기록, 내부 명령은 안 남음) ===
[root@rocky9-lab ~]# grep -E 'su(\[|:)' /var/log/secure | tail -3 || echo "(su 로그 없음)"
Sep 24 15:02:10 rocky9-lab su: pam_unix(su-l:session): session closed for user analyst
Sep 24 15:02:10 rocky9-lab su: pam_systemd(su-l:session): Failed to connect to system bus: No such file or directory
Sep 24 15:02:10 rocky9-lab su: pam_unix(su-l:session): session opened for user root(uid=0) by (uid=0)
| 출력 | 해석 |
|---|---|
sudo -S id → uid=0(root) | sudo로 root 권한 명령 실행 |
sudo -S cat /etc/shadow → root:$6$<해시생략> | root 전용 파일 읽기 성공(해시는 실습 표시상 생략) |
sudo -l → (ALL) ALL | analyst가 모든 명령을 sudo로 실행 가능 |
로그 sudo: analyst : USER=root ; COMMAND=/bin/cat /etc/shadow | 누가·무엇을 실행했는지 명령 단위 기록 |
session opened for user root(uid=0) by (uid=1000) | uid 1000(analyst)이 root 세션을 열었다는 기록 |
su 로그 session opened ... by (uid=0) | su는 세션 시작만 남고 내부 명령은 없음 |
COMMAND=/bin/cat /etc/shadow가 핵심이다. sudo는 실행한 명령까지 로그에 남긴다. 반면 su는 "root 세션이 열렸다"까지만 남아, 그 안에서 무엇을 했는지는 별도 auditd 없이는 알 수 없다.
| 주제 | 내용 |
|---|---|
| sudo 우선 | 추적성·최소 권한·비밀번호 미공유 때문에 sudo 권장 |
| su 사용 시 | 반드시 auditd execve 규칙으로 root 셸 내 명령 감사(49편) |
| root 직접 로그인 차단 | PermitRootLogin no, root 비밀번호 미설정 |
| sudo 세션 캐시 | 5분간 재인증 생략. 공용 터미널에서 위험 → sudo -k로 초기화 |
| sudo 오설정 | NOPASSWD·범용 명령 허용은 권한 상승 경로(43편) |
공격자 관점: 공격자는 로그를 피하기 위해 su로 root 셸을 얻은 뒤 활동하려 한다. 그래서 su 세션 이후 auditd 감사가 없으면 관제 공백이 생긴다. sudo 강제 정책이 탐지에 유리하다.
[로그 위치] Rocky: /var/log/secure Ubuntu: /var/log/auth.log
↓
[정상 패턴] sudo: user : COMMAND=... (허용된 명령)
[이상 패턴] sudo 인증 실패 반복 / COMMAND 가 셸(/bin/bash) / 비정상 시간대
↓
[su 보완] su 세션 뒤 auditd execve 로 root 명령 추적 (auid 유지)
↓
[Evidence] sudo 로그의 user·COMMAND·시각, 로그인 IP(last, wtmp)
↓
[Response] 비인가 권한 상승 차단, sudoers 재검토, 계정 조사
| 관점 | 내용 |
|---|---|
| Detection | sudo 인증 실패, COMMAND=/bin/bash(셸 획득), 비정상 시간대 sudo |
| su 감사 | su 자체는 세션만 기록. auditd로 보완 |
| auid | 감사 UID는 su/sudo 후에도 원래 로그인 계정 유지 → 행위 귀속 |
| 실수 | 결과 | 예방 |
|---|---|---|
| root 비밀번호 공유 | 책임 추적 불가 | sudo로 개인 인증 |
| su만 사용, auditd 없음 | root 셸 내 명령 미기록 | sudo 권장 또는 auditd |
| sudo 캐시 방치 | 공용 터미널 오용 | sudo -k, timestamp_timeout |
sudo su - 습관 | 명령 단위 로그 이점 상실 | 개별 sudo 명령 |
| 로그 위치 혼동 | 수집 누락 | Rocky secure / Ubuntu auth.log |
[ ] sudo 가 본인 비밀번호를 요구하는 것을 확인했다
[ ] sudo -l 로 내 권한을 확인했다
[ ] sudo 로그에 COMMAND 가 남는 것을 확인했다
[ ] su 로그는 세션만 남는 것을 확인했다
[ ] su 이후 명령 추적에 auditd 가 필요함을 이해했다
[ ] 배포판별 로그 위치를 안다
su는 대상 비밀번호로 세션 전체, sudo는 본인 비밀번호로 명령 단위 권한을 얻는다./var/log/secure, Ubuntu /var/log/auth.log.다음 글 「42. sudoers와 sudo 권한 관리」 에서는 /etc/sudoers 문법을 해석하고, visudo가 문법 오류를 잡아 sudo 자체가 망가지는 사고를 막는 과정을 실습한다. 최소 권한으로 특정 명령만 허용하는 규칙을 작성한다.