
서비스 · 프로세스 관리 45 / 50 · Part 5. 보안과 SOC
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (systemd로 부팅한 Docker 격리 컨테이너, 테스트 계정analyst)
33·34·36편에서 cron과 at의 구조를, 39편에서 자동 실행 경로 전체를 점검하는 방법을 다뤘다. 39편의 방식은 "지금 무엇이 있는가"를 보여 주지만, "원래와 달라진 것은 무엇인가" 는 알려 주지 않는다. 특히 새 파일이 아니라 기존 패키지 파일에 한 줄이 추가된 경우 는 목록만 봐서는 눈에 띄지 않는다.
이번 글에서는 예약 작업 파일의 기준 해시, 패키지 검증(rpm -V), 파일 수정 시각 이라는 세 가지 근거로 변경을 탐지하고, 변경 내용을 확인한 뒤 원래 상태로 복구·재검증하는 절차를 실습한다.
| 근거 | 비교 대상 | 강점 | 한계 |
|---|---|---|---|
| 기준 해시 | 관리자가 수집한 해시 | 사용자 crontab까지 포함 가능 | 기준을 만든 시점이 정상이어야 함 |
| 패키지 검증 | 배포 패키지 DB | 설치 후 한 번도 기준을 만들지 않아도 사용 가능 | 패키지 밖 파일(사용자 crontab, 새 cron.d 파일)은 대상 아님 |
| 파일 시각 | 기준 파일 생성 시각 | 빠르게 후보 추림 | 시각은 조작될 수 있음 |
세 근거는 서로 약점을 보완한다. 같은 파일을 여러 근거가 가리키면 확신이 높아진다.
| 위치 | 기호 | 의미 |
|---|---|---|
| 1 | S | 크기 다름 |
| 2 | M | 권한·파일 종류 다름 |
| 3 | 5 | 내용 해시 다름 |
| 8 | T | 수정 시각 다름 |
| 6·7 | U, G | 소유자·그룹 다름 |
| 파일 앞 | c | 설정 파일 (관리자 수정이 허용되는 파일) |
설정 파일(c)은 관리자가 고칠 수 있는 파일이라 rpm -V 결과가 곧 이상은 아니다. 변경 관리 기록과 대조 해야 한다. Ubuntu에서는 debsums -c, dpkg --verify가 같은 역할을 한다.

[기준] find (cron 관련 경로) -type f → sha256sum → cron.sha256
rpm -V cronie cronie-anacron crontabs → 변경 없음 확인
[변경] (가정) 0hourly 에 한 줄 추가 · analyst crontab 등록 · at 예약
[탐지] sha256sum -c → 0hourly FAILED
find -newer → 0hourly, /var/spool/cron/analyst
rpm -V → S.5....T. c /etc/cron.d/0hourly
atq → 대기 작업 1건
[확인] rpm -qf · tail → 추가된 줄 확인
[복구] 추가된 줄 제거 → rpm -V(시각만 다름) · sha256sum -c(일치)
# 1) 기준 해시와 패키지 상태
mkdir -p /var/lib/soc-baseline && cd /var/lib/soc-baseline
find /etc/crontab /etc/cron.d /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly \
/etc/anacrontab /var/spool/cron -type f -exec sha256sum {} + 2>/dev/null | sort -k2 > cron.sha256
rpm -V cronie cronie-anacron crontabs && echo "패키지 파일 변경 없음"
# 2) 변경 발생 (승인되지 않은 변경을 가정한 무해한 logger 항목)
echo '*/5 * * * * root /usr/bin/logger lab-change-test' >> /etc/cron.d/0hourly
echo '0 3 * * * /usr/bin/logger lab-user-job' | crontab -u analyst -
echo 'logger lab-at-test' | at now + 4 hours
# 3) 탐지
sha256sum -c cron.sha256 --quiet
find /etc/crontab /etc/cron.d /etc/cron.hourly ... /var/spool/cron -type f -newer cron.sha256
rpm -V cronie cronie-anacron crontabs
atq
# 4) 확인과 복구
rpm -qf /etc/cron.d/0hourly; tail -2 /etc/cron.d/0hourly
sed -i '/lab-change-test/d' /etc/cron.d/0hourly
rpm -V cronie; sha256sum -c /var/lib/soc-baseline/cron.sha256 --quiet && echo "기준 해시와 일치"
crontab -u analyst -r; atrm $(atq | cut -f1)




텍스트 원본(실제 출력):
[root@rocky9-lab ~]# mkdir -p /var/lib/soc-baseline && cd /var/lib/soc-baseline
[root@rocky9-lab soc-baseline]# find /etc/crontab /etc/cron.d /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly /etc/anacrontab /var/spool/cron -type f -exec sha256sum {} + 2>/dev/null | sort -k2 > cron.sha256; cat cron.sha256 | awk '{print substr($1,1,12)"…", $2}'
bb6371d86936… /etc/anacrontab
ad03f0fdb025… /etc/cron.d/0hourly
21f8f224c065… /etc/cron.hourly/0anacron
59e73f377833… /etc/crontab
[root@rocky9-lab soc-baseline]# rpm -V cronie cronie-anacron crontabs && echo "패키지 파일 변경 없음"
.......T. c /etc/cron.d/0hourly
[root@rocky9-lab ~]# echo '*/5 * * * * root /usr/bin/logger lab-change-test' >> /etc/cron.d/0hourly
[root@rocky9-lab ~]# echo '0 3 * * * /usr/bin/logger lab-user-job' | crontab -u analyst -
[root@rocky9-lab ~]# echo 'logger lab-at-test' | at now + 4 hours 2>&1 | tail -1
job 7 at Thu Sep 24 17:42:00 2026
[root@rocky9-lab ~]# sleep $((62 - $(date +%S)))
[root@rocky9-lab ~]# cd /var/lib/soc-baseline; sha256sum -c cron.sha256 --quiet 2>&1
/etc/cron.d/0hourly: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
[root@rocky9-lab soc-baseline]# find /etc/crontab /etc/cron.d /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly /var/spool/cron -type f -newer cron.sha256 2>/dev/null
/etc/cron.d/0hourly
/var/spool/cron/analyst
[root@rocky9-lab soc-baseline]# rpm -V cronie cronie-anacron crontabs
S.5....T. c /etc/cron.d/0hourly
[root@rocky9-lab soc-baseline]# atq
7 Thu Sep 24 17:42:00 2026 a root
[root@rocky9-lab ~]# rpm -qf /etc/cron.d/0hourly; tail -2 /etc/cron.d/0hourly
cronie-1.5.7-16.el9.x86_64
01 * * * * root run-parts /etc/cron.hourly
*/5 * * * * root /usr/bin/logger lab-change-test
[root@rocky9-lab ~]# sed -i '/lab-change-test/d' /etc/cron.d/0hourly; rpm -V cronie && echo "0hourly 원복 완료"; sha256sum -c /var/lib/soc-baseline/cron.sha256 --quiet && echo "기준 해시와 일치"
.......T. c /etc/cron.d/0hourly
기준 해시와 일치
[root@rocky9-lab ~]# crontab -u analyst -r; atrm $(atq | cut -f1); atq | wc -l
0
| 관찰 | 의미 |
|---|---|
| 기준 해시 4개 파일 (anacrontab, 0hourly, 0anacron, crontab) | 최소 설치 Rocky의 cron 관련 파일 전체. 사용자 crontab은 아직 없다 |
rpm -V → 변경 없음 | 설치 이후 cron 패키지 파일이 수정되지 않았다 |
sha256sum -c → /etc/cron.d/0hourly: FAILED | 기준 이후 내용이 바뀐 파일 |
find -newer → 0hourly, /var/spool/cron/analyst | 해시에 없던 새 파일(사용자 crontab) 도 시각 기준으로 잡았다 |
rpm -V → S.5....T. c /etc/cron.d/0hourly | 크기·내용·시각이 패키지 원본과 다르다. 기준 해시가 없어도 잡을 수 있는 근거 |
atq → job 7 (root) | 파일 해시로는 보이지 않는 대기 중인 at 작업 |
rpm -qf → cronie-1.5.7-16.el9 | 변경된 파일은 cronie 패키지 소유다 |
tail -2 → 원래 줄 아래 */5 * * * * root ... lab-change-test | 기존 패키지 파일 끝에 추가된 한 줄 이 변경 내용이다 |
복구 후 rpm -V → .......T. | 내용·크기는 원본과 같고 수정 시각만 다르다. 변경 흔적은 남는다 |
복구 후 sha256sum -c → 기준 해시와 일치 | 내용이 기준 상태로 돌아왔다 |
처음에는
dnf reinstall cronie로 복구하려 했지만, 설정 파일(c)은 재설치해도 관리자 수정본이 유지 되어 원복되지 않았다. 설정 파일은 원본 비교 후 직접 수정하거나.rpmnew를 이용해야 한다.
| 주제 | 내용 |
|---|---|
| 기존 파일 변조 | 새 파일은 목록 점검(39편)에 잘 보이지만, 기존 패키지 파일에 한 줄 추가는 해시·패키지 검증으로만 확실히 보인다 |
| 패키지 밖 영역 | 사용자 crontab, 새로 만든 cron.d 파일은 rpm -V 대상이 아니다. 기준 해시·시각·39편 목록을 함께 쓴다 |
| 시각 조작 | 파일 시각은 touch로 바꿀 수 있다. 시각은 후보를 추리는 용도이고, 판단은 해시로 한다 |
| 감사 연계 | 48편의 -w /etc/cron.d -p wa 감사 규칙이 있으면 누가 언제 바꿨는지까지 확인할 수 있다 |
| 복구 확인 | 복구 후 반드시 재검증(해시 일치)으로 끝낸다 |
[정기 점검 — 일 1회]
sha256sum -c /var/lib/soc-baseline/cron.sha256 --quiet
find <cron 경로> -type f -newer /var/lib/soc-baseline/cron.sha256
rpm -V cronie cronie-anacron crontabs (Ubuntu: dpkg --verify cron)
atq
↓
[변경 발견] rpm -qf · diff (원본 대비) · stat (시각) · 감사 로그(48편)
↓
[판단] 변경 관리 기록에 있는가? → 있으면 기준 갱신 / 없으면 증거 사본 보관 후 원복
↓
[재검증] 해시 일치 확인 → 티켓 종료
| 결과 | 조치 |
|---|---|
| 해시 FAILED + 승인 기록 있음 | 기준 해시 갱신, 기록 |
| 해시 FAILED + 승인 기록 없음 | 사본 보존 → 감사 로그로 주체 확인 → 원복 |
| 새 사용자 crontab | 계정 소유자 확인, 서비스 계정이면 우선 조사 |
| 실수 | 결과 | 예방 |
|---|---|---|
rpm -V만 실행 | 사용자 crontab·새 파일 누락 | 기준 해시·목록 병행 |
설정 파일(c) 변경을 모두 이상으로 보고 | 과도한 오탐 | 변경 관리 기록과 대조 |
| 재설치로 설정 파일 원복 시도 | 수정본 유지 (실측) | 원본 비교 후 직접 수정 |
| 기준 해시를 서버에만 보관 | 함께 변조 가능 | 외부 사본 |
| at 대기 작업 미확인 | 예약된 실행 누락 | atq 포함 |
[ ] cron 관련 파일의 기준 해시를 만들었다
[ ] sha256sum -c · find -newer · rpm -V 세 근거로 변경을 탐지했다
[ ] rpm -V 출력 기호(S, 5, T, c)를 해석했다
[ ] atq 로 대기 중인 at 작업을 확인했다
[ ] 기존 패키지 파일에 추가된 한 줄을 찾아 원복했다
[ ] 원복 후 해시 일치로 재검증했다
rpm -V는 기준이 없어도 쓸 수 있지만 패키지 밖 파일은 보지 못한다.다음 글 「46. systemd unit 변경 점검」 에서는 같은 원칙을 systemd에 적용한다. systemd-delta, 패키지 소유 확인, 최근 수정 파일 검색으로 새 drop-in과 timer가 추가된 것 을 찾고, 서비스 설정에 실제로 반영된 값까지 확인한다.