파일 · 권한 · 사용자 관리 41 / 50 · Part 5. 권한 상승과 Linux 보안
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정 analyst)
기초편 연계: 「리눅스 시스템 기초」 19. sudo와 su

1. 들어가며

Part 5 「권한 상승과 Linux 보안」을 시작한다. Part 4까지 계정과 그룹을 다뤘다면, Part 5는 그 계정들이 어떻게 더 높은 권한을 얻는가, 그리고 그것을 어떻게 점검·탐지하는가 를 다룬다. SOC 분석가의 핵심 업무 영역이다.

첫 글은 일반 사용자가 root 권한을 얻는 두 방법, su와 sudo 의 비교다. 둘의 가장 중요한 차이는 기능이 아니라 추적성 이다.

  • sudo는 누가, 언제, 어떤 명령을 root로 실행했는지 명령 단위로 로그에 남긴다.
  • su는 root 셸을 연 시점 만 남고, 그 안에서 실행한 명령은 기본 로그에 남지 않는다.

권한 상승 흔적을 추적하려면 이 로그 형식을 정확히 읽을 줄 알아야 한다. 이번 글에서 실제 로그로 확인한다.


2. 핵심 개념

2-1. su와 sudo 비교

구분su / su -sudo
요구 비밀번호대상 계정(root) 의 비밀번호본인 비밀번호
권한 범위대상 계정의 셸 전체sudoers에서 허용한 명령만
로그세션 시작·종료명령마다 기록
root 비밀번호 공유필요불필요
환경su -: 대상 계정 로그인 환경env_reset으로 초기화

2-2. su와 su -

형태동작
su rootroot로 전환, 현재 환경 일부 유지
su - rootroot의 로그인 환경 으로 전환 (PATH·홈 등)

2-3. 왜 sudo를 권장하는가

  1. root 비밀번호 미공유: 각자 본인 비밀번호로 인증. root 비밀번호를 여러 명이 알 필요가 없다.
  2. 최소 권한: sudoers에서 허용한 명령만 실행 가능(42편).
  3. 추적성: 명령 단위 로그.

그래서 Ubuntu는 기본적으로 root 비밀번호를 설정하지 않아 su로 root가 될 수 없고 sudo만 쓴다. RHEL 계열도 sudo를 권장한다.


3. 동작 원리

su vs sudo — 핵심 차이는 추적성

sudo는 root 소유 SUID 프로그램이다(28편). 그래서 일반 사용자가 실행해도 root 권한으로 동작하며, 다음 순서로 처리한다.

  1. /etc/sudoers와 /etc/sudoers.d/*에서 실행자·명령에 맞는 규칙을 찾는다.
  2. 규칙이 있으면 PAM으로 본인 비밀번호 를 확인한다(성공 시 기본 5분간 재입력 생략).
  3. 환경변수를 초기화하고 대상 계정(root)으로 명령을 실행한다.
  4. 결과를 /var/log/secure(Ubuntu auth.log)와 journal에 남긴다.

su는 PAM으로 대상 계정의 비밀번호 를 확인한 뒤 그 계정의 셸을 실행한다. 이후 셸 안의 명령은 su가 관여하지 않으므로 기록되지 않는다. su 이후 활동을 추적하려면 auditd의 execve 규칙이 필요하다. 이때 auid(감사 UID)는 원래 로그인 계정으로 유지 되므로, root 셸에서 실행된 명령도 원래 사용자에게 연결할 수 있다.


4. 명령어 실습

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

5. 실행 결과

실제 실행 결과 — Rocky Linux 9.8 · analyst@rocky9-lab — sudo 실행과 권한 확인

실제 실행 결과 — Rocky Linux 9.8 · root@rocky9-lab — sudo 로그 vs su 로그

텍스트 원본(실제 출력):

[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)

6. 결과 해석

출력해석
sudo -S id → uid=0(root)sudo로 root 권한 명령 실행
sudo -S cat /etc/shadow → root:$6$<해시생략>root 전용 파일 읽기 성공(해시는 실습 표시상 생략)
sudo -l → (ALL) ALLanalyst가 모든 명령을 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 없이는 알 수 없다.


7. 보안 관점

주제내용
sudo 우선추적성·최소 권한·비밀번호 미공유 때문에 sudo 권장
su 사용 시반드시 auditd execve 규칙으로 root 셸 내 명령 감사(49편)
root 직접 로그인 차단PermitRootLogin no, root 비밀번호 미설정
sudo 세션 캐시5분간 재인증 생략. 공용 터미널에서 위험 → sudo -k로 초기화
sudo 오설정NOPASSWD·범용 명령 허용은 권한 상승 경로(43편)

공격자 관점: 공격자는 로그를 피하기 위해 su로 root 셸을 얻은 뒤 활동하려 한다. 그래서 su 세션 이후 auditd 감사가 없으면 관제 공백이 생긴다. sudo 강제 정책이 탐지에 유리하다.


8. 보안관제 관점

[로그 위치]  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 재검토, 계정 조사
관점내용
Detectionsudo 인증 실패, COMMAND=/bin/bash(셸 획득), 비정상 시간대 sudo
su 감사su 자체는 세션만 기록. auditd로 보완
auid감사 UID는 su/sudo 후에도 원래 로그인 계정 유지 → 행위 귀속

9. 실무에서 자주 발생하는 실수

실수결과예방
root 비밀번호 공유책임 추적 불가sudo로 개인 인증
su만 사용, auditd 없음root 셸 내 명령 미기록sudo 권장 또는 auditd
sudo 캐시 방치공용 터미널 오용sudo -k, timestamp_timeout
sudo su - 습관명령 단위 로그 이점 상실개별 sudo 명령
로그 위치 혼동수집 누락Rocky secure / Ubuntu auth.log

10. 실습 체크리스트

[ ] sudo 가 본인 비밀번호를 요구하는 것을 확인했다
[ ] sudo -l 로 내 권한을 확인했다
[ ] sudo 로그에 COMMAND 가 남는 것을 확인했다
[ ] su 로그는 세션만 남는 것을 확인했다
[ ] su 이후 명령 추적에 auditd 가 필요함을 이해했다
[ ] 배포판별 로그 위치를 안다

11. 핵심 정리

  • su는 대상 비밀번호로 세션 전체, sudo는 본인 비밀번호로 명령 단위 권한을 얻는다.
  • 핵심 차이는 추적성: sudo는 명령마다 로그, su는 세션만.
  • 추적성·최소 권한·비밀번호 미공유 때문에 sudo를 권장 한다.
  • su 사용 시 auditd로 root 셸 내 명령을 감사한다(auid로 행위 귀속).
  • 로그는 Rocky /var/log/secure, Ubuntu /var/log/auth.log.
  • sudo 인증 실패·셸 획득·비정상 시간대를 탐지한다.

12. 다음 편 예고

다음 글 「42. sudoers와 sudo 권한 관리」 에서는 /etc/sudoers 문법을 해석하고, visudo가 문법 오류를 잡아 sudo 자체가 망가지는 사고를 막는 과정을 실습한다. 최소 권한으로 특정 명령만 허용하는 규칙을 작성한다.


참고 자료


시리즈 이동

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글