서비스 · 프로세스 관리 45 / 50 · Part 5. 보안과 SOC
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (systemd로 부팅한 Docker 격리 컨테이너, 테스트 계정 analyst)

1. 들어가며

33·34·36편에서 cron과 at의 구조를, 39편에서 자동 실행 경로 전체를 점검하는 방법을 다뤘다. 39편의 방식은 "지금 무엇이 있는가"를 보여 주지만, "원래와 달라진 것은 무엇인가" 는 알려 주지 않는다. 특히 새 파일이 아니라 기존 패키지 파일에 한 줄이 추가된 경우 는 목록만 봐서는 눈에 띄지 않는다.

이번 글에서는 예약 작업 파일의 기준 해시, 패키지 검증(rpm -V), 파일 수정 시각 이라는 세 가지 근거로 변경을 탐지하고, 변경 내용을 확인한 뒤 원래 상태로 복구·재검증하는 절차를 실습한다.


2. 핵심 개념

2-1. 세 가지 근거

근거비교 대상강점한계
기준 해시관리자가 수집한 해시사용자 crontab까지 포함 가능기준을 만든 시점이 정상이어야 함
패키지 검증배포 패키지 DB설치 후 한 번도 기준을 만들지 않아도 사용 가능패키지 밖 파일(사용자 crontab, 새 cron.d 파일)은 대상 아님
파일 시각기준 파일 생성 시각빠르게 후보 추림시각은 조작될 수 있음

세 근거는 서로 약점을 보완한다. 같은 파일을 여러 근거가 가리키면 확신이 높아진다.

2-2. rpm -V 출력 읽기

위치기호의미
1S크기 다름
2M권한·파일 종류 다름
35내용 해시 다름
8T수정 시각 다름
6·7U, G소유자·그룹 다름
파일 앞c설정 파일 (관리자 수정이 허용되는 파일)

설정 파일(c)은 관리자가 고칠 수 있는 파일이라 rpm -V 결과가 곧 이상은 아니다. 변경 관리 기록과 대조 해야 한다. Ubuntu에서는 debsums -c, dpkg --verify가 같은 역할을 한다.


3. 동작 원리

예약 작업 무결성 점검 — 세 가지 독립된 근거

[기준]   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(일치)

4. 명령어 실습

# 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)

5. 실행 결과

실제 실행 결과 — Rocky Linux 9.8 · root@rocky9-lab — 예약 작업 파일의 기준 해시 만들기

실제 실행 결과 — Rocky Linux 9.8 · root@rocky9-lab — 변경 발생 (승인되지 않은 작업 추가를 가정한 무해한 항목)

실제 실행 결과 — Rocky Linux 9.8 · root@rocky9-lab — 변경 탐지

실제 실행 결과 — Rocky Linux 9.8 · root@rocky9-lab — 변경 내용 확인과 복구

텍스트 원본(실제 출력):

[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

6. 결과 해석

관찰의미
기준 해시 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를 이용해야 한다.


7. 보안 관점

주제내용
기존 파일 변조새 파일은 목록 점검(39편)에 잘 보이지만, 기존 패키지 파일에 한 줄 추가는 해시·패키지 검증으로만 확실히 보인다
패키지 밖 영역사용자 crontab, 새로 만든 cron.d 파일은 rpm -V 대상이 아니다. 기준 해시·시각·39편 목록을 함께 쓴다
시각 조작파일 시각은 touch로 바꿀 수 있다. 시각은 후보를 추리는 용도이고, 판단은 해시로 한다
감사 연계48편의 -w /etc/cron.d -p wa 감사 규칙이 있으면 누가 언제 바꿨는지까지 확인할 수 있다
복구 확인복구 후 반드시 재검증(해시 일치)으로 끝낸다

8. 보안관제 관점

[정기 점검 — 일 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계정 소유자 확인, 서비스 계정이면 우선 조사

9. 실무에서 자주 발생하는 실수

실수결과예방
rpm -V만 실행사용자 crontab·새 파일 누락기준 해시·목록 병행
설정 파일(c) 변경을 모두 이상으로 보고과도한 오탐변경 관리 기록과 대조
재설치로 설정 파일 원복 시도수정본 유지 (실측)원본 비교 후 직접 수정
기준 해시를 서버에만 보관함께 변조 가능외부 사본
at 대기 작업 미확인예약된 실행 누락atq 포함

10. 실습 체크리스트

[ ] cron 관련 파일의 기준 해시를 만들었다
[ ] sha256sum -c · find -newer · rpm -V 세 근거로 변경을 탐지했다
[ ] rpm -V 출력 기호(S, 5, T, c)를 해석했다
[ ] atq 로 대기 중인 at 작업을 확인했다
[ ] 기존 패키지 파일에 추가된 한 줄을 찾아 원복했다
[ ] 원복 후 해시 일치로 재검증했다

11. 핵심 정리

  • 예약 작업 무결성은 기준 해시 · 패키지 검증 · 파일 시각 세 근거로 확인한다.
  • rpm -V는 기준이 없어도 쓸 수 있지만 패키지 밖 파일은 보지 못한다.
  • 기존 파일에 한 줄 추가된 변경은 목록 점검보다 해시 비교로 확실히 드러난다.
  • 설정 파일은 재설치로 원복되지 않을 수 있으므로 직접 비교·수정 후 재검증한다.
  • 변경 판단은 변경 관리 기록과 감사 로그(48편)로 완성한다.

12. 다음 편 예고

다음 글 「46. systemd unit 변경 점검」 에서는 같은 원칙을 systemd에 적용한다. systemd-delta, 패키지 소유 확인, 최근 수정 파일 검색으로 새 drop-in과 timer가 추가된 것 을 찾고, 서비스 설정에 실제로 반영된 값까지 확인한다.


참고 자료


시리즈 이동

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글