Linux 로그 경로 정리 · 37/50 · Part 4. journald / rsyslog / auditd
선행 학습 → 09. Linux 로그와 보안 이벤트의 관계 · Linux 시스템 보안 기초 시리즈
이번 글 → auditd 구조 이해
이어서 → 38. audit.log 경로와 구조
지금까지 본 로그는 대부분 프로그램이 스스로 남기는 기록이었습니다. 프로그램이 로그를 남기지 않거나(대부분의 명령), 공격자가 로그 기능을 끄면 기록이 없습니다. auditd는 다릅니다. 커널이 시스템 콜 수준에서 기록하므로 프로그램의 협조가 필요 없습니다.
핵심 요약
- 커널 audit 서브시스템이 규칙에 맞는 이벤트를 만들고, auditd가
/var/log/audit/audit.log에 기록한다.- 규칙이 없으면 기록도 없다 → 규칙 설계가 곧 가시성
- 핵심 필드 auid: 최초 로그인 사용자 ID. sudo/su 후에도 변하지 않는다.
| 용어 | 설명 |
|---|---|
| kernel audit | 커널 내부 감사 기능. 시스템 콜 진입/종료, 파일 접근을 규칙과 비교 |
| auditd | 커널이 보낸 레코드를 받아 파일로 기록하는 사용자 공간 데몬 |
| audit rules | 무엇을 기록할지 정의 (auditctl, /etc/audit/rules.d/*.rules) |
| syscall | 프로그램이 커널에 요청하는 동작 (execve=실행, openat=열기, connect=연결 …) |
| audit record | 한 줄의 기록 (type=SYSCALL, EXECVE, PATH, CWD …) |
| event | 같은 msg=audit(시각:일련번호) 를 공유하는 레코드 묶음 |
| auid | audit UID — 로그인 시 PAM(pam_loginuid)이 설정, 이후 불변 |
| uid / euid | 현재 실제/유효 사용자 (sudo 후 0) |
| exe / comm | 실행 파일 경로 / 프로세스 이름(16자) |
| pid / ppid / ses | 프로세스, 부모, 로그인 세션 |
| key (-k) | 규칙에 붙인 이름 — 검색·SIEM 룰의 기준 |

Process (deploy → sudo → root 셸) ── syscall(execve, openat, connect ...)
↓
Kernel audit ── rules 비교 (auditctl -l)
↓ 일치 시 레코드 생성 (netlink)
auditd ──▶ /var/log/audit/audit.log
│ (auditd.conf: log_format, max_log_file, num_logs)
└─▶ audisp 플러그인 (syslog 전송, af_unix → SIEM 에이전트)
auid가 중요한 이유:
deploy 로그인 → auid=1001 uid=1001
sudo /bin/bash → auid=1001 uid=0 ← "root가 했다"가 아니라 "deploy로 들어온 사람이 root로 했다"
useradd ... → auid=1001 uid=0
cron 이 실행 → auid=unset(4294967295) ← 로그인 세션이 아닌 데몬/cron 실행
| 항목 | 경로 / 명령 | 비고 |
|---|---|---|
| 감사 로그 | /var/log/audit/audit.log | auditd.conf 의 log_file |
| 데몬 설정 | /etc/audit/auditd.conf | 실습 Rocky 9.8 기본: log_format = ENRICHED, max_log_file = 8, num_logs = 5, max_log_file_action = ROTATE |
| 영구 규칙 | /etc/audit/rules.d/*.rules → augenrules --load | /etc/audit/audit.rules 는 생성 결과 |
| 현재 규칙 | auditctl -l | |
| 상태 | auditctl -s | enabled, lost, backlog |
| 설치 | Rocky 기본 설치 / Ubuntu apt install auditd |
ENRICHED 형식은 원시 레코드 끝에 UID→이름 등의 해석값을 덧붙여, 다른 서버에서 분석해도 사용자 이름을 알 수 있게 합니다.
systemctl is-active auditd
auditctl -s # enabled 1 이면 동작, lost 가 증가하면 레코드 유실
auditctl -l # 현재 규칙 ("No rules" = 기본값, 실행 가시성 없음)
grep -E '^(log_file|log_format|max_log_file|num_logs|max_log_file_action|space_left_action|disk_full_action) ' /etc/audit/auditd.conf
ls /etc/audit/rules.d/
# 로그인 세션의 auid 확인
cat /proc/self/loginuid # 현재 셸의 auid
sudo cat /proc/self/loginuid # sudo 후에도 같은 값

위 이미지는 Rocky Linux 9.8 실습 환경에서 감사 규칙 파일을 실제로 확인한 결과입니다.
| 필드 | 값 예 | 질문 |
|---|---|---|
auid | 1001 (deploy) | 누가 로그인해서 시작했나? |
uid / euid | 0 | 어떤 권한으로 실행했나? |
ses | 12 | 어느 로그인 세션인가? (logind 세션 번호와 연결) |
exe | /usr/bin/curl | 무엇을 실행했나? (경로 위장 확인) |
comm | curl | 프로세스 이름 (위조 가능) |
pid / ppid | 4188 / 4151 | 프로세스 트리 |
tty | pts1 | 대화형 원격 세션인가? ((none) = 비대화형) |
key | exec_log | 어떤 규칙에 걸렸나? |
| 정상 | 의심 |
|---|---|
| auditd active, 규칙 로드됨 | auditd 중지 / auditctl -D (규칙 전체 삭제) / -e 0 (비활성) |
lost 0 | lost 증가 (부하·공격으로 레코드 유실) |
| 운영자 auid로 관리 명령 | 서비스 계정 auid의 셸 실행 |
cron 실행은 auid=unset | 로그인 사용자 auid가 비정상 시간 실행 |
규칙 끝에 -e 2 를 두면 재부팅 전까지 규칙 변경이 불가능(immutable)해져, 공격자가 규칙을 지우는 것을 막을 수 있습니다(변경하려면 재부팅 필요 — 운영 영향 검토).
/var/log/audit/audit.log 를 log_format audit 로 수집하고, 기본 룰 80700(Audit: Messages grouped)을 기반으로 key별 커스텀 룰을 만든다(47편 실측).auid 로 사람을 특정 → 인증 로그로 출발지 IP 확인.-e 2" 포함.[ ] kernel audit / auditd / rules / record / event 구분
[ ] auditd.conf 기본값 확인
[ ] auditctl -s 로 enabled / lost 확인
[ ] auditctl -l 로 규칙 확인
[ ] auid 와 uid 차이 설명 (loginuid 실습)
[ ] 규칙 삭제·비활성화 공격과 -e 2 대응 설명
msg=audit(시각:번호) 레코드들이 하나의 이벤트다.| 구분 | 글 |
|---|---|
| ◀ 이전 글 | 36. 원격 Syslog와 중앙 로그 서버 |
| ▶ 다음 글 | 38. audit.log 경로와 구조 |
| 시리즈 | Linux 로그 경로 정리 전체 보기 |
| 선행 시리즈 | 리눅스 시스템 기초 · 파일 · 권한 · 사용자 관리 · 서비스 · 프로세스 관리 · Linux 시스템 보안 기초 |