Linux 로그 경로 정리 · 44/50 · Part 5. 로그 관리와 무결성
선행 학습 → 43. Linux 로그 무결성 · 10. Linux 로그를 읽을 때 주의할 점 · 기초 26. sed 활용
이번 글 → 로그 삭제·변조 흔적 분석
이어서 → 45. 로그 보존 정책과 증거 보존
"로그가 비어 있다 → 공격자가 지웠다"는 가장 흔하고 가장 위험한 결론입니다. 로그 공백은 로테이션, 재부팅, 서비스 중단, 디스크 부족, 단순한 한가한 시간대 때문일 수도 있습니다. 이번 글은 삭제·변조를 가설로 세우고 증거로 검증하는 방법을 실습합니다.
핵심 요약
- 판단 3요소: (1) 다른 소스에는 있다 · (2) 변조 행위 기록이 있다 · (3) 대안 가설이 배제된다
- 교차 소스: 중앙 사본, journal, audit, wtmp/btmp, shell history, 파일 메타데이터
- 결론 문장은 "무엇이, 어느 구간이, 어떤 근거로" 삭제되었는지 구체적으로 쓴다.
| 변조 기법 (T1070) | 남는 흔적 | 확인 소스 |
|---|---|---|
특정 줄 삭제 (sed -i) | 파일 inode 변경(sed는 새 파일로 교체), 크기 감소 | audit EXECVE/PATH, stat, 중앙 사본 |
파일 비우기 (> file, truncate) | 크기 0, mtime 변경 | audit, stat |
파일 삭제 (rm, shred) | rsyslog가 열린 파일에 계속 기록(삭제된 inode) | ls -l /proc/<rsyslog pid>/fd |
저널 삭제 (--vacuum, rm *.journal) | 부팅 목록 축소 | --list-boots, audit |
| 셸 히스토리 삭제 | .bash_history 없음/축소 | audit(rm), 파일 시각 |
| 로깅 중지 | 서비스 stop 기록 | journal _PID=1, audit |
| wtmp/utmp 편집 | last 와 인증 로그 불일치 | secure/auth.log, audit USER_LOGIN |

로컬: /var/log/secure (또는 auth.log), /var/log/audit/audit.log, /var/log/journal/, /var/log/wtmp
~/.bash_history, /root/.bash_history
원격: 중앙 로그 서버 /var/log/remote/<host>/..., SIEM
상태: /var/lib/logrotate/logrotate.status, /proc/<rsyslog pid>/fd
모든 비교는 수집한 사본으로 수행합니다(원본에 sed -i·vim 금지).
# 1) 로컬 vs 중앙: 로컬에 없는 줄
comm -13 <(sort local/secure) <(sort central/secure) | wc -l
comm -13 <(sort local/secure) <(sort central/secure) | awk '{print $1,$2,$3}' | sort | sed -n '1p;$p' # 누락 구간
# 2) 변조 행위 기록 (audit)
ausearch -if audit.log -k log_tamper -i
ausearch -if audit.log -m EXECVE -i | grep -E 'sed|truncate|shred|rm .*log|history|vacuum'
# 3) 대안 가설 배제
cat logrotate.status | grep secure # 순환 시각
journalctl -D journal/ --list-boots # 재부팅
journalctl -D journal/ -u rsyslog -o short-iso | grep -Ei 'stop|start' # 로깅 중단
df -h /var/log # (라이브) 디스크 풀
# 4) 논리 모순 찾기: 로그인 기록 없는 sudo
grep 'sudo:' local/secure | awk '{print $6}' | sort -u # sudo 사용자
grep 'Accepted' local/secure | awk '{print $9}' | sort -u # 로그인 기록이 있는 사용자
# 5) (라이브) 삭제됐지만 열려 있는 로그 파일
ls -l /proc/$(pidof rsyslogd)/fd 2>/dev/null | grep deleted

위 이미지는 이 시리즈의 실습 시나리오 데이터(직접 작성한 가상 로그) 를 대상으로 Rocky Linux 9.8 실습 환경에서 실제로 실행한 비교 결과입니다. 시나리오: 공격자가 sed -i /203.0.113.45/d /var/log/secure 로 자신의 IP가 포함된 줄을 삭제, 중앙 로그 서버에는 전송된 사본이 남아 있음.
| 증거 | 값 | 의미 |
|---|---|---|
| 줄 수 | 로컬 11 / 중앙 84 | 로컬에서 73줄 누락 |
| 누락 구간 | 09-20 02:13:05 ~ 02:15:07 | 무차별 대입 + 로그인 성공 구간 |
| 로컬 모순 | sudo: deploy ... COMMAND=/bin/bash 는 있는데 deploy 로그인 기록 없음 | 선택적 삭제 흔적 |
| audit EXECVE | sed -i /203.0.113.45/d /var/log/secure | 삭제 명령 그 자체 |
| audit SYSCALL | auid=deploy uid=root ses=12 tty=pts1 | 탈취 계정 세션에서 root로 실행 |
| 대안 가설 | 순환·재부팅·서비스 중단 기록 없음 (시나리오 조건) | 배제 |
결론 문장 예: "09-20 02:23:40 KST, deploy 계정(ses=12)으로 로그인한 사용자가 root 권한으로 sed 를 실행해 로컬 /var/log/secure 에서 203.0.113.45 관련 73줄(02:13:05~02:15:07)을 삭제했다. 근거: 중앙 사본 비교, audit log_tamper 레코드, 로컬 로그의 논리 모순."
| 단정하면 안 되는 경우 | 확인 방법 |
|---|---|
| 새벽 시간 로그가 적음 | 평소 같은 시간대 건수와 비교 |
| 로그 파일이 작아짐 | 순환 시각 확인 |
| 특정 기간 전체 공백 | 재부팅·rsyslog 중지·디스크 풀 확인 |
| 히스토리 파일 없음 | 셸 설정(HISTFILE, HISTSIZE=0) 확인 |
100210 (audit key log_tamper, level 12, MITRE T1070.002)로 실제 경보 발생을 확인했습니다(47편 wazuh-logtest 실측).[ ] 삭제·변조 기법 7가지와 흔적 매핑
[ ] 로컬 vs 중앙 사본 차이 추출 (comm)
[ ] audit 로 변조 명령·주체 확인
[ ] 대안 가설(순환·재부팅·중단·디스크) 배제
[ ] 로그 내부 논리 모순 찾기
[ ] 근거 3개를 포함한 결론 문장 작성
| 구분 | 글 |
|---|---|
| ◀ 이전 글 | 43. Linux 로그 무결성 |
| ▶ 다음 글 | 45. 로그 보존 정책과 증거 보존 |
| 시리즈 | Linux 로그 경로 정리 전체 보기 |
| 선행 시리즈 | 리눅스 시스템 기초 · 파일 · 권한 · 사용자 관리 · 서비스 · 프로세스 관리 · Linux 시스템 보안 기초 |