Linux 로그 경로 정리 · 31/50 · Part 4. journald / rsyslog / auditd

선행 학습 → 02. Linux 로그가 생성되는 과정 · 기초 48. Linux 로그와 journalctl
이번 글 → systemd-journald 이해
이어서 → 32. journalctl 기본 사용법

1. 들어가며

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가 직접 붙이는 신뢰 필드

2. 핵심 개념

용어의미
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 컨테이너 이미지에는 없어 휘발성이었습니다. 같은 배포판이라도 설치 방식에 따라 다르므로 반드시 확인합니다.

3. 로그 생성 구조

journald 저장 구조 (휘발 vs 영구)

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 로 읽어감)

4. 실제 로그 경로

/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                    사용자별 저널

5. 명령어 실습

# 저장 방식 확인
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

6. 로그 예시

실제 실행 결과 — Rocky Linux 9.8 · root@rocky9-lab — journal 저장 상태

위 이미지는 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                       ← 일반 사용자가 기록

7. 로그 필드 분석

필드신뢰분석 활용
SYSLOG_IDENTIFIER✗표시용 태그 — 위조 가능
MESSAGE✗본문
_COMM / _EXE✓실제 기록 프로세스 — 가짜 로그 판별
_UID / _GID✓기록 주체 권한
_SYSTEMD_UNIT✓서비스 단위 필터
_BOOT_ID✓부팅 구분
__REALTIME_TIMESTAMP✓μs 단위 UTC epoch

8. 보안관점

정상의심
영구 저널, 여러 부팅 기록운영 서버인데 휘발성 → 재부팅 전 이력 없음
--verify PASS손상/봉인 실패 → 저널 파일 조작 가능성
_COMM=sshd 인 sshd 로그SYSLOG_IDENTIFIER=sshd 인데 _COMM=logger
SystemMaxUse 적정매우 작게 설정 → 오래된 로그 빠르게 삭제
저널 디렉터리 유지journalctl --vacuum-time=1s, --rotate 흔적 (셸 히스토리·audit)

9. SOC 관점

  • 수집: Wazuh 4.x는 <log_format>journald</log_format> 로 저널을 직접 수집할 수 있다(47편, 에이전트 기본 설정에서 확인).
  • Triage: 가짜 로그 주입 의심 시 _COMM/_EXE 확인.
  • Investigation: rsyslog 파일이 비어 있거나 변조됐을 때 저널이 2차 소스.
  • Hardening: 영구 저장 + 원격 전송 + (가능하면) Seal 적용.

10. 실습 체크리스트

[ ] Storage 설정과 /var/log/journal 존재 확인
[ ] volatile / persistent 차이 설명
[ ] --list-boots 로 보관 범위 확인
[ ] 신뢰 필드와 위조 가능 필드 구분
[ ] journalctl --verify 실행
[ ] 영구 저장 전환 절차 이해

11. 핵심 정리

  • journald는 거의 모든 로그가 처음 거치는 수집기다.
  • Storage=auto 에서는 /var/log/journal 존재 여부가 영구/휘발성을 결정한다.
  • 언더스코어 필드는 위조할 수 없어 가짜 로그 판별에 쓴다.
  • 휘발성 저널은 재부팅과 함께 사라지므로 사고 대응 시 재부팅을 피한다.
  • journalctl --verify 와 Seal로 저널 무결성을 점검할 수 있다.

12. 다음 편 연결

구분글
◀ 이전 글30. Linux 로그 경로 자동 탐색 스크립트
▶ 다음 글32. journalctl 기본 사용법
시리즈Linux 로그 경로 정리 전체 보기
선행 시리즈리눅스 시스템 기초 · 파일 · 권한 · 사용자 관리 · 서비스 · 프로세스 관리 · Linux 시스템 보안 기초
profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글