Linux 로그 경로 정리 · 31/50 · Part 4. journald / rsyslog / auditd
선행 학습 → 02. Linux 로그가 생성되는 과정 · 기초 48. Linux 로그와 journalctl
이번 글 → systemd-journald 이해
이어서 → 32. journalctl 기본 사용법
Part 4는 로그를 만드는 쪽(journald · rsyslog · auditd)을 깊게 봅니다. 그 출발점이 systemd-journald입니다. 현대 Linux에서 거의 모든 로그는 먼저 journald를 통과합니다. rsyslog 파일이 지워져도 저널이 남아 있다면 복원할 수 있고, 반대로 저널이 휘발성이면 재부팅과 함께 사라집니다.
핵심 요약
- journald = 커널·syslog·서비스 stdout/stderr·audit(일부)를 모으는 1차 수집기
- 저장:
Storage=auto기본 →/var/log/journal이 있으면 영구, 없으면/run/log/journal(휘발성)_PID,_UID,_COMM,_EXE,_SYSTEMD_UNIT등 언더스코어 필드는 journald가 직접 붙이는 신뢰 필드
| 용어 | 의미 |
|---|---|
| journald | 로그 수집·저장 데몬 (systemd-journald.service) |
| journal | 저장된 바이너리 로그 파일 (*.journal) |
| volatile journal | 메모리 기반 /run/log/journal/<machine-id>/ — 재부팅 시 소멸 |
| persistent journal | 디스크 /var/log/journal/<machine-id>/ — 재부팅 후에도 유지 |
| Storage= | volatile / persistent / auto(기본) / none |
| 신뢰 필드 | _로 시작, 클라이언트가 위조 불가 (_PID, _UID, _EXE …) |
| Seal (FSS) | Forward Secure Sealing — 저널 변조 탐지용 봉인 (journalctl --setup-keys) |
실습 환경 확인 결과: Rocky 9.8(systemd 252)과 Ubuntu 24.04 모두 journald.conf 기본값은 #Storage=auto, #Seal=yes, #ForwardToSyslog=no (주석 = 컴파일 기본값). Ubuntu 24.04 실습 환경에는 /var/log/journal(그룹 systemd-journal)이 존재해 영구 저장, Rocky 9.8 컨테이너 이미지에는 없어 휘발성이었습니다. 같은 배포판이라도 설치 방식에 따라 다르므로 반드시 확인합니다.

kernel (kmsg) ───────────┐
syslog() / /dev/log ─────┤
서비스 stdout/stderr ─────┼──▶ systemd-journald ──▶ 필드 부여(_PID,_UID,_EXE,_SYSTEMD_UNIT, _BOOT_ID ...)
sd_journal_send() ───────┤ │
audit (일부 레코드) ───────┘ ├─ Storage=auto & /var/log/journal 존재 → persistent
├─ 아니면 → /run/log/journal (volatile)
└─▶ rsyslog (RHEL: imjournal 로 읽어감)
/etc/systemd/journald.conf 설정 (Storage, SystemMaxUse, MaxRetentionSec, Seal ...)
/etc/systemd/journald.conf.d/*.conf 드롭인 설정 (배포판·관리자 변경은 여기서 확인)
/run/log/journal/<machine-id>/ 휘발성 저널
/var/log/journal/<machine-id>/ 영구 저널
├─ system.journal 현재 시스템 저널
├─ system@....journal 순환(아카이브)된 저널
└─ user-1000.journal 사용자별 저널
# 저장 방식 확인
grep -E '^\s*#?\s*Storage' /etc/systemd/journald.conf /etc/systemd/journald.conf.d/*.conf 2>/dev/null
ls -ld /var/log/journal /run/log/journal 2>/dev/null
journalctl --disk-usage
journalctl --list-boots | head -5 # 영구면 여러 부팅, 휘발성이면 현재 부팅만
# 신뢰 필드 확인
journalctl -u sshd -n 1 -o verbose 2>/dev/null | grep -E '^\s+_(PID|UID|GID|COMM|EXE|CMDLINE|SYSTEMD_UNIT|BOOT_ID|HOSTNAME)='
# 저널 무결성 검사 (손상/봉인 검증)
journalctl --verify 2>&1 | tail -5
# (변경관리 승인 후) 영구 저장 전환 — 로그 파일이 아닌 저장 위치를 만드는 작업
# mkdir -p /var/log/journal && systemd-tmpfiles --create --prefix /var/log/journal && systemctl restart systemd-journald

위 이미지는 Rocky Linux 9.8 실습 환경에서 저널 저장 상태를 실제로 확인한 결과입니다.
아래는 신뢰 필드와 위조 가능 필드를 구분하기 위한 예시 출력입니다.
[예시 출력: logger -t sshd "Accepted password for root" 로 만든 가짜 로그]
SYSLOG_IDENTIFIER=sshd ← 위조 가능 (logger -t 로 지정)
MESSAGE=Accepted password for root
_COMM=logger ← 신뢰 필드: 실제 기록 프로세스는 logger
_EXE=/usr/bin/logger
_UID=1001 ← 일반 사용자가 기록
| 필드 | 신뢰 | 분석 활용 |
|---|---|---|
SYSLOG_IDENTIFIER | ✗ | 표시용 태그 — 위조 가능 |
MESSAGE | ✗ | 본문 |
_COMM / _EXE | ✓ | 실제 기록 프로세스 — 가짜 로그 판별 |
_UID / _GID | ✓ | 기록 주체 권한 |
_SYSTEMD_UNIT | ✓ | 서비스 단위 필터 |
_BOOT_ID | ✓ | 부팅 구분 |
__REALTIME_TIMESTAMP | ✓ | μs 단위 UTC epoch |
| 정상 | 의심 |
|---|---|
| 영구 저널, 여러 부팅 기록 | 운영 서버인데 휘발성 → 재부팅 전 이력 없음 |
--verify PASS | 손상/봉인 실패 → 저널 파일 조작 가능성 |
_COMM=sshd 인 sshd 로그 | SYSLOG_IDENTIFIER=sshd 인데 _COMM=logger |
SystemMaxUse 적정 | 매우 작게 설정 → 오래된 로그 빠르게 삭제 |
| 저널 디렉터리 유지 | journalctl --vacuum-time=1s, --rotate 흔적 (셸 히스토리·audit) |
<log_format>journald</log_format> 로 저널을 직접 수집할 수 있다(47편, 에이전트 기본 설정에서 확인)._COMM/_EXE 확인.[ ] Storage 설정과 /var/log/journal 존재 확인
[ ] volatile / persistent 차이 설명
[ ] --list-boots 로 보관 범위 확인
[ ] 신뢰 필드와 위조 가능 필드 구분
[ ] journalctl --verify 실행
[ ] 영구 저장 전환 절차 이해
Storage=auto 에서는 /var/log/journal 존재 여부가 영구/휘발성을 결정한다.journalctl --verify 와 Seal로 저널 무결성을 점검할 수 있다.| 구분 | 글 |
|---|---|
| ◀ 이전 글 | 30. Linux 로그 경로 자동 탐색 스크립트 |
| ▶ 다음 글 | 32. journalctl 기본 사용법 |
| 시리즈 | Linux 로그 경로 정리 전체 보기 |
| 선행 시리즈 | 리눅스 시스템 기초 · 파일 · 권한 · 사용자 관리 · 서비스 · 프로세스 관리 · Linux 시스템 보안 기초 |