파일 · 권한 · 사용자 관리 49 / 50 · Part 5. 권한 상승과 Linux 보안
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 19. sudo와 su · 48. Linux 로그와 journalctl
48편에서 백도어 계정과 이상 권한을 찾았다. 이제 질문은 "언제, 누가 이것을 만들었는가" 다. 답은 로그에 있다.
이번 글에서는 권한 상승·계정 변경 행위가 로그에 어떻게 남는지 분석한다. 핵심은 무엇이 남고 무엇이 안 남는가 를 정확히 아는 것이다.
"로그가 항상 남는다"는 오해는 위험하다. chmod 4755 /bin/cp로 SUID 백도어를 심어도 /var/log/secure에는 흔적이 없다. 이 한계를 이해하고 auditd로 보완하는 것이 이번 글의 목표다.
| 배포판 | 인증·권한 로그 |
|---|---|
| Rocky/RHEL | /var/log/secure |
| Ubuntu/Debian | /var/log/auth.log |
systemd journal(journalctl)에도 함께 기록된다.
| 행위 | 기본 로그 | 보완 |
|---|---|---|
| sudo | O (명령 단위) | - |
| su | △ 세션만 | auditd |
| useradd/usermod/userdel | O | - |
| passwd | O | - |
| chmod/chown | X | auditd |
| SUID 설정 | X | auditd |
| 파일 생성·삭제 | X | auditd/FIM |
권한 변경(chmod)·파일 조작은 syslog에 남지 않는다. 이를 기록하려면 auditd 규칙이 필요하다.
# 권한·소유자 변경 감시
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid>=1000 -k perm_mod
# 민감 파일 감시
-w /etc/passwd -p wa -k passwd_change

로그 분석의 힘은 행위를 체인으로 연결 하는 데 있다. 공격자가 sudo로 useradd를 실행하고, 그 계정을 wheel에 넣었다면:
sudo: analyst : COMMAND=/sbin/useradd -M hacker — 누가 useradd를 실행했는가useradd[..]: new user: name=hacker, UID=1001 — 어떤 계정이 생겼는가usermod[..]: add hacker to group wheel — 관리자 그룹에 편입세 로그를 시간순으로 연결하면 "analyst가 hacker 계정을 만들어 wheel에 넣었다"는 공격 흐름이 재구성된다. 인증 실패 로그(1 incorrect password attempt)는 무차별 대입 시도의 근거가 된다.
하지만 chmod 4755 /bin/cp(SUID 백도어)는 이 로그들에 없다. sudo로 실행했다면 COMMAND=/bin/chmod 4755 /bin/cp는 남지만, 직접 root가 실행했다면 아무 흔적이 없다. 그래서 권한 변경 추적에는 auditd가 필수다.
analyst가 sudo로 계정 생성·그룹 편입·SUID 설정을 수행하고, 인증 실패도 발생시킨 뒤 로그를 분석한다. 테스트 환경이다.
# (analyst 가 수행한 행위 — 로그 생성)
# sudo useradd -M hacker
# sudo usermod -aG wheel hacker
# sudo chmod 4755 /bin/cp
# sudo -k; echo wrongpw | sudo -S id → 인증 실패
# (root 로 로그 분석)
# 1) sudo 성공/실패 로그
grep -E 'sudo:.*(COMMAND|incorrect password|authentication failure)' /var/log/secure | tail -8
# 2) 계정 생성·그룹 변경
grep -E 'useradd|new user|usermod|added.*to group' /var/log/secure | tail -6
# 3) 인증 실패 (무차별 대입 근거)
grep -E 'incorrect password|authentication failure' /var/log/secure | tail -3
# 4) chmod 는 기본 로그에 없음
ls -l /bin/cp # SUID 설정됐지만 secure 에는 chmod 자체 기록 없음

텍스트 원본(실제 출력):
[root@rocky9-lab ~]# echo "=== sudo 성공/실패 로그 ==="
=== sudo 성공/실패 로그 ===
[root@rocky9-lab ~]# grep -E 'sudo:.*(COMMAND|authentication failure|incorrect password)' /var/log/secure | tail -8
Sep 24 15:08:20 rocky9-lab sudo: analyst : PWD=/home/analyst ; USER=root ; COMMAND=/sbin/useradd -M hacker
Sep 24 15:08:20 rocky9-lab sudo: analyst : PWD=/home/analyst ; USER=root ; COMMAND=/bin/bash -c 'echo hacker:NewP@ss1 | chpasswd'
Sep 24 15:08:20 rocky9-lab sudo: analyst : PWD=/home/analyst ; USER=root ; COMMAND=/sbin/usermod -aG wheel hacker
Sep 24 15:08:20 rocky9-lab sudo: analyst : PWD=/home/analyst ; USER=root ; COMMAND=/bin/chmod 4755 /bin/cp
Sep 24 15:08:20 rocky9-lab sudo: pam_unix(sudo:auth): authentication failure; logname= uid=1000 euid=0 tty= ruser=analyst rhost= user=analyst
Sep 24 15:08:22 rocky9-lab sudo: analyst : 1 incorrect password attempt ; PWD=/home/analyst ; USER=root ; COMMAND=/bin/id
[root@rocky9-lab ~]# echo "=== 계정 생성·그룹 변경 로그 ==="
=== 계정 생성·그룹 변경 로그 ===
[root@rocky9-lab ~]# grep -E 'useradd|new user|usermod|added.*to group|new group' /var/log/secure | tail -6
Sep 24 15:08:20 rocky9-lab sudo: analyst : PWD=/home/analyst ; USER=root ; COMMAND=/sbin/useradd -M hacker
Sep 24 15:08:20 rocky9-lab useradd[110]: new group: name=hacker, GID=1001
Sep 24 15:08:20 rocky9-lab useradd[110]: new user: name=hacker, UID=1001, GID=1001, home=/home/hacker, shell=/bin/bash, from=none
Sep 24 15:08:20 rocky9-lab sudo: analyst : PWD=/home/analyst ; USER=root ; COMMAND=/sbin/usermod -aG wheel hacker
Sep 24 15:08:20 rocky9-lab usermod[139]: add 'hacker' to group 'wheel'
Sep 24 15:08:20 rocky9-lab usermod[139]: add 'hacker' to shadow group 'wheel'
[root@rocky9-lab ~]# echo "=== 인증 실패 로그 (무차별 대입 탐지 근거) ==="
=== 인증 실패 로그 (무차별 대입 탐지 근거) ===
[root@rocky9-lab ~]# grep -E 'incorrect password|authentication failure' /var/log/secure | tail -3
Sep 24 15:08:20 rocky9-lab sudo: pam_unix(sudo:auth): authentication failure; logname= uid=1000 euid=0 tty= ruser=analyst rhost= user=analyst
Sep 24 15:08:22 rocky9-lab sudo: analyst : 1 incorrect password attempt ; PWD=/home/analyst ; USER=root ; COMMAND=/bin/id
[root@rocky9-lab ~]# echo "=== 권한 변경 흔적 (chmod 는 기본 로그에 안 남음 → auditd 필요) ==="
=== 권한 변경 흔적 (chmod 는 기본 로그에 안 남음 → auditd 필요) ===
[root@rocky9-lab ~]# ls -l /bin/cp
-rwsr-xr-x 1 root root 144400 Sep 11 01:13 /bin/cp
[root@rocky9-lab ~]# echo " ↑ SUID 설정됨. 하지만 secure 로그엔 chmod 자체는 없음(auditd 규칙 필요)"
↑ SUID 설정됨. 하지만 secure 로그엔 chmod 자체는 없음(auditd 규칙 필요)
| 로그 | 해석 |
|---|---|
sudo: analyst : ... COMMAND=/sbin/useradd -M hacker | analyst가 sudo로 계정 생성 |
sudo: ... COMMAND=/sbin/usermod -aG wheel hacker | wheel 그룹 편입 |
sudo: ... COMMAND=/bin/chmod 4755 /bin/cp | sudo 경유 chmod는 COMMAND로 남음 |
useradd[108]: new user: name=hacker, UID=1001 | 계정 생성 상세 |
usermod[130]: add 'hacker' to group 'wheel' | 관리자 그룹 편입 흔적 |
sudo: analyst : 1 incorrect password attempt | 인증 실패 → 무차별 대입 근거 |
ls -l /bin/cp → -rwsr-xr-x | SUID 설정됨. 하지만 chmod 자체는 secure에 없음 (sudo 경유가 아니었다면 흔적 없음) |
핵심은 마지막 항목이다. /bin/cp에 SUID가 붙었지만, chmod가 직접 실행됐다면 secure 로그에는 없다. 이번 실습은 sudo 경유였기에 COMMAND로 남았지만, root가 직접 chmod했다면 auditd 없이는 추적 불가 다.
| 주제 | 내용 |
|---|---|
| 로그 한계 인식 | chmod·chown·파일 조작은 기본 로그에 없다 |
| auditd 필수 | 권한 변경·SUID 설정·민감 파일 접근 감시 |
| 로그 위변조 방어 | 로그를 원격 전송(10편). 로컬 로그는 root가 삭제 가능 |
| su 보완 | su 세션 내 명령은 auditd execve로 |
| 시간 동기화 | NTP로 여러 서버 로그 시각 일치 |
auditd 핵심 규칙:
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-a always,exit -F arch=b64 -S chmod,chown,fchmod,fchown -F auid>=1000 -k perm_mod
[수집] Rocky /var/log/secure, Ubuntu /var/log/auth.log + auditd + journal → SIEM
↓
[상관분석] sudo(COMMAND) + useradd(new user) + usermod(group) 를 시간순 연결
↓
[탐지 규칙] · 짧은 시간 내 계정 생성 + 관리자 그룹 편입
· 인증 실패 다수 후 성공 (무차별 대입)
· UID 0 계정 생성 (new user ... UID=0)
· auditd: SUID 설정(chmod), 민감 파일 변경
↓
[Evidence] 로그의 user·COMMAND·시각·IP → 공격 타임라인
↓
[Response] 계정 잠금, 권한 원복, 로그 보존, 침입 경로 차단
| 관점 | 내용 |
|---|---|
| 상관분석 | 개별 로그가 아니라 행위 체인으로 공격 재구성 |
| 로그 공백 | chmod 등은 auditd 없으면 공백. 미탐 구간 인지 |
| 원격 전송 | 로그 위변조 대비 필수(10편) |
| 실수 | 결과 | 예방 |
|---|---|---|
| "로그는 다 남는다" 가정 | chmod 등 추적 실패 | auditd 설정 |
| 로컬 로그만 신뢰 | root가 삭제 가능 | 원격 전송 |
| su 세션 내 명령 미감사 | 추적 공백 | auditd execve |
| 시간 미동기화 | 상관분석 오류 | NTP |
| 개별 로그만 확인 | 공격 흐름 놓침 | 상관분석 |
[ ] sudo 로그의 COMMAND 를 확인했다
[ ] useradd/usermod 로그로 계정 생성·그룹 편입을 추적했다
[ ] 인증 실패 로그를 확인했다
[ ] chmod 가 기본 로그에 안 남는 것을 확인했다
[ ] auditd 규칙의 필요성을 이해했다
[ ] 로그 원격 전송이 필요한 이유를 안다
/var/log/secure, Ubuntu /var/log/auth.log에 남는다.execve로 보완한다.시리즈의 마지막 글 「50. Linux 파일·권한·사용자 보안관제 실습」 에서는 지금까지 배운 모든 것을 하나의 침해 시나리오로 연결한다. 웹 계정 침투 → 웹셸 → sudo 오설정 권한 상승 → 백도어 계정 → SUID 백도어 → 로그 탐지 → 증거 수집 → 초동 대응까지, 공격과 대응 전 과정 을 실습한다.