Linux 로그 경로 정리 · 19/50 · Part 2. RHEL / Rocky Linux 로그 경로
선행 학습 → 12. /var/log/messages 분석 · 서비스 · 프로세스 관리 시리즈
이번 글 → Rocky Linux 서비스 이벤트 추적
이어서 → 20. Rocky Linux 로그 기반 초동조사
cron과 함께 공격자가 자주 쓰는 지속성 수단이 systemd 서비스 등록(MITRE T1543.002)입니다. 정상 서비스처럼 보이는 이름으로 유닛 파일을 만들고 enable 하면 재부팅마다 자동 실행됩니다.
핵심 요약
- 흐름:
systemctl→ systemd(PID 1) → 서비스 프로세스 → journald →/var/log/messages- 로그만으로는 "누가
systemctl enable했는지" 알기 어렵다 → audit 필요.- 증거 3축: 유닛 파일(내용·시각) · 서비스 로그(Started/Reloading) · 실행 주체(audit)
| 항목 | 위치 | 보안 의미 |
|---|---|---|
| 시스템 유닛 (패키지) | /usr/lib/systemd/system/ | 패키지가 설치 (rpm으로 검증 가능) |
| 관리자 유닛 | /etc/systemd/system/ | 수동 생성 — 공격자 유닛의 주 위치 |
| 사용자 유닛 | ~/.config/systemd/user/ | 사용자 권한 지속성 |
| enable 링크 | /etc/systemd/system/multi-user.target.wants/ | 부팅 자동 시작 |
| drop-in | /etc/systemd/system/<unit>.d/*.conf | 기존 정상 서비스의 ExecStart 덮어쓰기 |

관리자/공격자: vi /etc/systemd/system/x.service ; systemctl daemon-reload ; systemctl enable --now x
│ │ │
│ (audit -w 룰 있을 때) ▼ ▼
│ systemd: "Reloading." systemd: "Created symlink ..." , "Started x.service"
▼ └────────────── journald ───────────────┘
audit.log (auid, exe=systemctl) │
├─▶ journalctl -u x
└─▶ rsyslog ──▶ /var/log/messages
/var/log/messages systemd 의 Started / Stopped / Reloading
journalctl -u <unit> 특정 서비스 로그
journalctl _PID=1 systemd 자체 메시지
/var/log/audit/audit.log systemctl 실행 주체 (EXECVE 룰), 유닛 디렉터리 감시 (-w 룰)
/etc/systemd/system/ 유닛 파일
# 1) 최근 생성·수정된 유닛 파일 (관리자 영역)
find /etc/systemd/system /usr/lib/systemd/system -name '*.service' -newermt '-3 days' -printf '%TY-%Tm-%Td %TH:%TM %p\n' | sort
# 2) 패키지 소속이 아닌 유닛 (rpm 이 모르는 파일)
for f in /etc/systemd/system/*.service; do rpm -qf "$f" >/dev/null 2>&1 || echo "NOT-PKG: $f"; done
# 3) 유닛 내용과 실행 경로
systemctl cat <unit>
systemctl show <unit> -p ExecStart -p FragmentPath -p ActiveEnterTimestamp
# 4) 로그로 등록·기동 시점 확인
journalctl _PID=1 --since today -o short-iso | grep -E 'Reloading|Created symlink|Started' | tail
journalctl -u <unit> -o short-iso --no-pager | head
# 5) 누가 systemctl 을 실행했나 (audit EXECVE 룰이 있을 때)
ausearch -c systemctl -ts today -i | grep -E '^type=(SYSCALL|EXECVE)' | tail -6

위 이미지는 Rocky Linux 9.8 실습 환경의 실제 실행 결과입니다.
아래는 판단 설명용 예시 로그입니다.
[예시 로그]
Sep 20 02:18:30 web01 systemd[1]: Reloading.
Sep 20 02:18:31 web01 systemd[1]: Created symlink /etc/systemd/system/multi-user.target.wants/syscheck.service → /etc/systemd/system/syscheck.service.
Sep 20 02:18:31 web01 systemd[1]: Started syscheck.service - System Check.
| 로그 | 알 수 있는 것 | 알 수 없는 것 |
|---|---|---|
Reloading. | 유닛 설정이 다시 읽힘 | 무엇이 바뀌었는지 |
Created symlink ... wants/ | enable 됨 (부팅 자동 시작) | 누가 실행했는지 |
Started syscheck.service | 기동 시각, 설명(Description) | 실제 실행 파일 → systemctl cat |
"알 수 없는 것"을 채우는 것이 audit(주체)과 유닛 파일(내용)입니다.
| 정상 | 의심 |
|---|---|
rpm -qf 로 패키지 소속 확인됨 | 패키지에 속하지 않는 유닛 |
ExecStart=/usr/sbin/... | ExecStart=/tmp/..., /usr/local/bin/.xxx, bash -c "curl ..." |
변경관리 시간 Reloading | 원격 세션 직후 Reloading → Created symlink |
| 서비스 이름과 설명 일치 | 정상 서비스 흉내(dbus-org.freedesktop... 류) |
/etc/systemd/system 감시, audit -w /etc/systemd/system -p wa -k systemd_mod.ExecStart 경로의 파일 해시·생성 시각.connect, ss -tnp).systemctl disable --now 전에 유닛 파일·실행 파일·로그를 보존한다.[ ] 유닛 파일 위치 3곳과 의미 설명
[ ] 최근 생성 유닛 탐색
[ ] 패키지 비소속 유닛 탐색
[ ] Reloading / Created symlink / Started 로그 조회
[ ] ExecStart 경로 검증
[ ] audit 로 systemctl 실행 주체 확인
messages 로 기록된다.Created symlink ... wants 는 부팅 자동 시작 등록의 흔적이다.ExecStart 경로는 지속성 신호다.| 구분 | 글 |
|---|---|
| ◀ 이전 글 | 18. Rocky Linux 인증 이벤트 추적 |
| ▶ 다음 글 | 20. Rocky Linux 로그 기반 초동조사 |
| 시리즈 | Linux 로그 경로 정리 전체 보기 |
| 선행 시리즈 | 리눅스 시스템 기초 · 파일 · 권한 · 사용자 관리 · 서비스 · 프로세스 관리 · Linux 시스템 보안 기초 |