Linux 로그 경로 정리 · 14/50 · Part 2. RHEL / Rocky Linux 로그 경로
선행 학습 → 13. /var/log/secure 분석 · 기초 38. cron 작업 스케줄링
이번 글 → /var/log/cron 분석
이어서 → 15. /var/log/maillog 분석
cron은 공격자가 가장 즐겨 쓰는 지속성(Persistence) 수단입니다(MITRE ATT&CK T1053.003). 재부팅 후에도, 계정 비밀번호가 바뀐 후에도 정해진 시각마다 악성 코드를 다시 실행하기 때문입니다. 기존 기초 38편이 cron 사용법이었다면, 여기서는 cron이 남기는 로그로 지속성을 탐지합니다.
핵심 요약
/var/log/cron=cron.*→ 실행(CROND CMD) 과 변경(crontab REPLACE/EDIT) 이 모두 남는다.- 로그에는 "무엇을 실행했나"는 있지만 "crontab 내용 전체"는 없다 → 파일을 함께 본다.
- 새로 나타난 CMD, 숨김 경로(
/.xxx), 5분 주기 반복은 강한 신호다.
| 로그 문자열 | 기록 주체 | 의미 |
|---|---|---|
CROND[PID]: (user) CMD (command) | crond | 해당 사용자 권한으로 명령 실행 |
crontab[PID]: (user) BEGIN EDIT (user) / END EDIT | crontab -e | 대화형 편집 |
crontab[PID]: (user) REPLACE (user) | crontab 파일 설치 | crontab file 로 통째 교체 |
crontab[PID]: (root) LIST (user) | crontab -l | 조회 |
run-parts[PID]: (/etc/cron.hourly) starting ... | run-parts | 정기 디렉터리 실행 |
anacron[PID]: Job 'cron.daily' started | anacron | 일 단위 작업 실행 |
CROND[PID]: (CRON) ORPHAN (no passwd entry) | crond | 삭제된 사용자의 crontab 잔존 |

[변경] crontab -e / crontab file ──▶ /var/spool/cron/<user> 기록 ──▶ log: crontab[...] (REPLACE|EDIT)
[변경] vi /etc/crontab, /etc/cron.d/* ──▶ 파일만 바뀜, crontab 로그 없음 (!)
↓
[실행] crond 매 분 점검 ──▶ 조건 일치 ──▶ log: CROND[...] (user) CMD (...)
↓
journald ──(cron facility)──▶ rsyslog ──▶ /var/log/cron
주의: /etc/crontab 이나 /etc/cron.d/ 를 에디터로 직접 수정하면 crontab 명령 로그가 남지 않습니다. 이 경우 실행 로그(CROND CMD) 와 파일 변경 시각, auditd -w /etc/cron.d 룰 이 증거가 됩니다.
| 대상 | Rocky / RHEL | Ubuntu / Debian |
|---|---|---|
| cron 로그 | /var/log/cron | 기본: /var/log/syslog (cron.log 규칙 주석 처리) |
| 사용자 crontab | /var/spool/cron/<user> | /var/spool/cron/crontabs/<user> |
| 시스템 crontab | /etc/crontab, /etc/cron.d/ | 동일 |
| 정기 디렉터리 | /etc/cron.{hourly,daily,weekly,monthly} | 동일 |
C=/var/log/cron
# 실행된 명령 목록 (빈도순) — 평소와 다른 CMD 찾기
grep 'CMD (' $C | sed -E 's/.*\((\w+)\) CMD \((.*)\)$/\1 | \2/' | sort | uniq -c | sort -rn | head -20
# crontab 변경 이력
grep -E 'crontab\[.*\((REPLACE|BEGIN EDIT|END EDIT|DELETE)' $C
# 의심 패턴: 숨김 경로, /tmp, /dev/shm, 네트워크 도구
grep 'CMD (' $C | grep -E '/\.[a-z]|/tmp/|/dev/shm|curl|wget|bash -i|nc '
# 로그와 파일 대조 (현재 crontab 내용)
ls -la --time-style=full-iso /var/spool/cron/ /etc/cron.d/
cat /var/spool/cron/root 2>/dev/null

위 이미지는 Rocky Linux 9.8 실습 환경의 실제 실행 결과입니다.
아래는 실습 시나리오 로그(가상 데이터) 입니다.
[실습 시나리오 로그 · 가상 데이터]
Sep 20 02:01:01 web01 CROND[2903]: (root) CMD (run-parts /etc/cron.hourly)
Sep 20 02:17:05 web01 crontab[4231]: (root) REPLACE (root)
Sep 20 02:20:01 web01 CROND[4420]: (root) CMD (/usr/local/bin/.syscheck >/dev/null 2>&1)
Sep 20 02:25:01 web01 CROND[4425]: (root) CMD (/usr/local/bin/.syscheck >/dev/null 2>&1)
Sep 20 02:30:01 web01 CROND[4430]: (root) CMD (/usr/local/bin/.syscheck >/dev/null 2>&1)
| 필드 | 값 | 해석 |
|---|---|---|
| 변경 방식 | REPLACE | 대화형 편집이 아닌 파일로 통째 교체 — 스크립트 자동화 흔적 |
| 대상 사용자 | (root) | root crontab 변경 |
| 실행 경로 | /usr/local/bin/.syscheck | 점(.)으로 시작하는 숨김 파일 |
| 출력 처리 | >/dev/null 2>&1 | 흔적 최소화 |
| 주기 | 02:20, 02:25, 02:30 | 5분 간격 (*/5) |
| 정상 | 의심 |
|---|---|
run-parts /etc/cron.hourly, 백업·로그 정리 | 처음 등장한 CMD |
변경관리 일정에 맞춘 END EDIT | 원격 세션 중 REPLACE |
| 절대경로의 알려진 스크립트 | 숨김 파일, /tmp, /dev/shm, `curl |
| 일 1회 | 1~5분 주기 반복 (비콘/채굴 유지) |
crontab REPLACE 에 대해 2833 "Root's crontab entry changed." (level 8)를 발생시킵니다(47편 실측). auditd -w /var/spool/cron -p wa -k cron_mod 를 추가하면 변경 주체(auid) 까지 확인됩니다(40편).secure 에 원격 세션이 있었는가?[ ] CROND CMD / crontab REPLACE·EDIT 문자열 구분
[ ] 실행 명령 빈도 집계로 신규 CMD 탐지
[ ] crontab 변경 이력 조회
[ ] /etc/cron.d 직접 수정 시 로그 공백 이해
[ ] 로그와 /var/spool/cron 파일 대조
[ ] Ubuntu 에서 cron 로그 위치 차이 설명
/var/log/cron 에는 실행(CMD)과 변경(REPLACE/EDIT)이 함께 남는다.REPLACE 는 파일을 통째로 설치한 흔적으로 자동화된 공격에서 흔하다.syslog 에 섞인다.| 구분 | 글 |
|---|---|
| ◀ 이전 글 | 13. /var/log/secure 분석 |
| ▶ 다음 글 | 15. /var/log/maillog 분석 |
| 시리즈 | Linux 로그 경로 정리 전체 보기 |
| 선행 시리즈 | 리눅스 시스템 기초 · 파일 · 권한 · 사용자 관리 · 서비스 · 프로세스 관리 · Linux 시스템 보안 기초 |