Linux 로그 경로 정리 · 42/50 · Part 5. 로그 관리와 무결성
선행 학습 → 41. logrotate 이해 · 기초 23. head와 tail
이번 글 → 로그 로테이션과 보안관제
이어서 → 43. Linux 로그 무결성
로그 로테이션은 운영에는 필수지만 분석가에게는 함정입니다. grep 'Failed' /var/log/secure 결과가 0건이라고 공격이 없었던 것이 아니라, 어제 밤 순환되어 secure-20260920 로 넘어갔을 수 있습니다.
핵심 요약
- 순환 후 과거 로그는 다른 이름·압축 파일에 있다 →
zgrep 파일*이 기본- 실시간 관찰은
tail -F(이름 추적),tail -f는 순환 후 옛 파일에 머문다.copytruncate방식은 짧은 유실 구간이 생길 수 있다.- 사고 발견이 늦으면 로컬 로그는 이미 삭제되었을 수 있다 → 중앙 수집본 필수.
| 문제 | 원인 | 대응 |
|---|---|---|
| 파일명 변경 | secure → secure-YYYYMMDD / auth.log.1 | 와일드카드 secure* |
| 압축 | compress → .gz | zgrep, zcat -f |
| 오래된 로그 삭제 | rotate N 초과 | 중앙 수집·장기 아카이브 |
tail -f 끊김 | 파일 디스크립터 추적 | tail -F (--follow=name --retry) |
| 순환 시점 유실 | copytruncate | 가능하면 create + postrotate HUP |
| 시간 경계 | 사고가 순환 시각에 걸침 | 인접 순환 파일 모두 검색 |
| 수집 에이전트 | 순환 시 중복·누락 | 에이전트의 파일 추적 방식 확인 (inode 기반) |

Rocky : /var/log/secure, /var/log/secure-20260913, /var/log/secure-20260920 ...
Ubuntu: /var/log/auth.log, /var/log/auth.log.1, /var/log/auth.log.2.gz ... .4.gz
audit : /var/log/audit/audit.log, audit.log.1 ~ audit.log.4
journal: /var/log/journal/<id>/system@....journal (아카이브)
# 1) 사고 시간대가 어느 파일에 있는지: 각 파일의 첫/마지막 줄 시각
for f in /var/log/secure*; do echo "$f : $(head -1 "$f" | cut -c1-15) ~ $(tail -1 "$f" | cut -c1-15)"; done
for f in /var/log/auth.log*; do echo "$f : $(zcat -f "$f" | head -1 | cut -c1-32) ~ $(zcat -f "$f" | tail -1 | cut -c1-32)"; done 2>/dev/null
# 2) 순환 포함 검색
zgrep -h 'Failed password' /var/log/secure* /var/log/auth.log* 2>/dev/null | wc -l
# 3) 실시간 관찰은 -F
tail -F /var/log/secure
# 4) audit 순환 파일 포함 검색
ausearch -if /var/log/audit/audit.log.1 -k exec_log -i # 개별 파일
ausearch -k exec_log -i # 기본: 순환 파일(log_file.N)까지 자동 포함
실습: 격리된 디렉터리(/lab/rot)의 연습용 로그 파일에 별도 설정과 상태 파일(-s)을 써서 강제 순환을 3회 수행했습니다. 시스템 로그와 시스템 상태 파일은 건드리지 않습니다.
logrotate -f -s /lab/rot/state /lab/rot/rot.conf # 연습용 설정/상태 파일로만 실행

위 이미지는 Rocky Linux 9.8 실습 환경에서 연습용 파일로 강제 순환을 실제로 실행한 결과입니다.
| 관찰 | 의미 |
|---|---|
app.log.1 은 비압축, .2.gz·.3.gz 는 압축 | delaycompress 동작 — 직전 순환 파일은 아직 기록 중일 수 있어 압축을 미룸 |
grep -c 결과 1 | 현재 파일만 보면 4건 중 1건만 보임 |
zgrep -c 결과 파일별 1씩 | 순환 파일까지 보면 4건 모두 확인 |
app.log.3.gz 권한 -rw-r--r-- | 첫 순환 파일은 원래 파일 권한을 유지, 이후 create 0640 로 만든 파일은 0640 — 순환 파일 권한이 서로 다를 수 있음 |
| 정상 | 의심 |
|---|---|
| 순환 시각이 timer 시각과 일치 | 새벽 침해 직후 비정기 순환 (logrotate -f) |
| 순환 파일 개수 = rotate 값 | 개수 부족 (수동 삭제) |
| 순환 파일 첫/끝 시각이 이어짐 | 파일 사이 시간 공백 |
공격자는 logrotate -f 를 여러 번 실행해 정상 절차처럼 보이게 오래된 로그를 밀어낼 수 있습니다. audit EXECVE(exe=/usr/sbin/logrotate, auid가 로그인 사용자)와 status 파일 시각으로 확인합니다.
[ ] 순환 파일별 시작/끝 시각 확인
[ ] zgrep 으로 순환 포함 검색
[ ] tail -f / tail -F 차이 확인
[ ] copytruncate 유실 가능성 설명
[ ] 연습용 설정으로 강제 순환 실습
[ ] 강제 순환 악용 탐지 방법 설명
zgrep 파일*, 실시간 관찰은 tail -F 가 기본이다.delaycompress 때문에 직전 순환 파일만 비압축이다.| 구분 | 글 |
|---|---|
| ◀ 이전 글 | 41. logrotate 이해 |
| ▶ 다음 글 | 43. Linux 로그 무결성 |
| 시리즈 | Linux 로그 경로 정리 전체 보기 |
| 선행 시리즈 | 리눅스 시스템 기초 · 파일 · 권한 · 사용자 관리 · 서비스 · 프로세스 관리 · Linux 시스템 보안 기초 |