시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 6/50편 (전체 056/450)
학습 단계: 1단계 · 기본 개념
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
root 권한 사용은 막는 것만으로 끝나지 않습니다. 운영에는 root 권한이 필요하므로, 관제의 목표는 "평소 누가, 언제, 어떤 경로로, 얼마나 root를 쓰는가" 를 알고 그 패턴에서 벗어나는 사용을 찾는 것입니다.
root 권한 사용 경로 행위자 식별 방법
① 직접 로그인(콘솔·SSH) → 불가(모두 root) → 원칙적으로 차단 (A영역 008편)
② sudo → sudo 로그의 사용자, audit auid
③ su → su 로그 "by 사용자", audit auid
④ 데몬·cron·systemd → auid=unset(4294967295) → 부모 프로세스·유닛으로 판단
분석 축: 누가(auid) × 언제(시간대) × 무엇(명령) × 얼마나(건수·세션 길이)
| 명령 | 용도 |
|---|---|
sudo aureport -x --summary -i | 실행 파일별 실행 건수 |
sudo ausearch -k root_exec -i --start week-ago | root로 실행된 명령(A영역 030편 키) |
sudo aureport --login --summary -i | 로그인 요약 |
grep 'USER=root' /var/log/secure | awk ... | sudo 사용자별 root 실행 건수 |
grep 'session opened for user root' /var/log/secure | su·sudo로 열린 root 세션 |
# 1) sudo로 root 명령을 실행한 사용자별 건수 (최근 로그 파일 기준)
sudo grep 'USER=root ; COMMAND=' /var/log/secure | awk '{for(i=1;i<=NF;i++) if($i==":"){print $(i-1); break}}' | sort | uniq -c | sort -rn
# 2) 시간대별 분포 (몇 시에 root를 쓰는가)
sudo grep 'USER=root ; COMMAND=' /var/log/secure | awk '{split($3,t,":"); print t[1]"시"}' | sort | uniq -c
# 3) auid 기준 root 실행 요약 (audit)
sudo ausearch -k root_exec -i --start week-ago 2>/dev/null | grep -oE 'auid=[^ ]+' | sort | uniq -c | sort -rn
# 4) 데몬 경로 root 실행 중 셸 실행 찾기 (auid unset + bash/sh)
sudo ausearch -m EXECVE -i --start today 2>/dev/null | grep -B2 'a0=bash\|a0=sh' | grep 'auid=unset' | head
Ubuntu는 /var/log/auth.log를 사용합니다. 로그 회전 파일(secure-*)까지 포함하려면 zgrep이나 cat secure*로 범위를 넓힙니다.
[sudo 사용자별 root 실행 — 최근 7일]
84 admin1
6 devops
[시간대]
21 09시
30 10시
25 14시
14 16시
root 사용이 관리자(admin1)에 집중되고, 업무 시간대에 분포한 이 모습이 이 서버의 root 사용 기준선입니다.
[10월 2일]
163 devops
[시간대]
95 02시
68 03시
[데몬 경로 root 셸]
type=SYSCALL ... ppid=1188 auid=unset uid=root comm=bash exe=/usr/bin/bash
devops가 하루 163건, 그것도 새벽 2~3시에 집중 → 기준선 대비 수십 배root 사용 이상을 판단할 때 보는 로그 조합입니다(가상의 예시 로그).
Oct 2 02:11:30 rocky9-web01 sudo[11701]: devops : TTY=pts/1 ; PWD=/home/devops ; USER=root ; COMMAND=/bin/bash
Oct 2 02:11:30 rocky9-web01 sudo[11701]: pam_unix(sudo-i:session): session opened for user root(uid=0) by devops(uid=1002)
Oct 2 03:42:15 rocky9-web01 sudo[11701]: pam_unix(sudo-i:session): session closed for user root
| 관찰 | 해석 |
|---|---|
COMMAND=/bin/bash | root 셸 진입 — 이후 명령은 sudo 로그에 개별로 남지 않음(A영역 007편) |
session opened ~ closed | root 세션 1시간 31분 지속 |
| 같은 PID(11701) | 열림·닫힘을 PID로 짝지어 세션 길이 계산 |
평소 관리자들의 root 세션이 수 분 단위라면, 1시간 반짜리 새벽 root 세션은 그 자체로 이상 지표입니다. 세션 안의 명령은 auditd root_exec(ses 기준)로 재구성합니다.
<group name="local,syssec_b,privilege,">
<!-- 같은 사용자의 sudo root 실행이 30분 내 50회 이상 (빈도 기반) -->
<rule id="101050" level="10" frequency="50" timeframe="1800">
<if_matched_sid>5402</if_matched_sid>
<same_user />
<description>단시간 내 sudo root 실행 급증: $(dstuser)</description>
</rule>
<rule id="101051" level="12">
<if_group>audit</if_group>
<field name="audit.auid">^4294967295$|^unset$</field>
<field name="audit.euid">^0$</field>
<match>comm="bash"|comm="sh"</match>
<description>로그인 세션 없는 root 셸 실행(데몬 경유 가능성)</description>
</rule>
</group>
same_user가 sudo 로그에서 어떤 필드를 비교하는지, audit 디코더가 auid를 숫자로 주는지 이름으로 주는지는 wazuh-logtest로 확인한 뒤 조정합니다.
| 구분 | 핵심 내용 |
|---|---|
| 경로 | 직접 로그인(차단) · sudo · su · 데몬(auid unset) |
| 분석 축 | 누가(auid) × 언제 × 무엇 × 얼마나(건수·세션 길이) |
| 기준선 | 사용자별·시간대별 root 실행 건수, root 세션 길이 |
| 이상 신호 | 급증, 새벽 집중, 긴 root 세션, 데몬 경유 root 셸 |
| 면접 포인트 | "root 사용 자체가 아니라 평소 패턴에서 벗어난 사용을 본다" |
다음 편 057. 계정 · 인증 보안 — sudo 사용 로그 분석 심화 에서는 sudo 로그를 명령·작업 디렉터리·TTY까지 읽는 sudo 사용 로그 분석 심화를 다룹니다.
이전 편: 055. 계정 · 인증 보안 — UID·GID 범위 정책과 login.defs
📚 시리즈 전체 보기: 시스템 보안 · 취약점