cron 이 새벽 세 시에 curl 을 했다 · 남는 자리와 남지 않는 자리 · 실습
남는 자리와 남지 않는 자리를 가른다
이 실습은 VM 에서 돕니다
우분투 24.04 VM 한 대입니다. root 이고 커널 권한이 있어서 감사 규칙을 실제로
올릴 수 있습니다. 실습 파드에는 capability 가 하나도 없어 auditctl 이 아예
동작하지 않기 때문에 이 실습만 VM 으로 돕니다. 처음 뜨는 데 1~2분 걸립니다.
목표
커널 감사 규칙을 직접 걸고, 사건을 일부러 일으키고, 그 기록을 꺼내 읽습니다.
같은 사건을 저널 쪽에서 다시 찾아 두 기록이 무엇을 각각 갖고 있는지 보고,
마지막으로 감시하지 않는 자리를 찾아 그것을 덮습니다.
왜 중요한가
탐지 규칙을 쓰기 전에 답해야 하는 질문이 있습니다 — 그 사건이 애초에 어딘가에
기록되는가. 리눅스에서 커널 감사는 기본으로 거의 아무것도 남기지 않습니다.
규칙을 걸어 둔 경로와 시스콜만 봅니다. 그래서 "로그를 다 모으고 있는데 답이
없다" 는 상황이 생깁니다.
여기서 배우는 것은 명령어가 아니라 범위 감각입니다. 내 규칙이 무엇을 보고
무엇을 안 보는지 말할 수 있으면, 사건이 났을 때 "기록이 없다" 와 "그 자리를 안
보고 있었다" 를 구별할 수 있습니다. 이 둘은 전혀 다른 처방으로 이어집니다.
단계
1. auditctl -s 와 서비스 상태를 /root/det/01-status.txt 에 저장하세요.
2. /etc/cron.d 를 쓰기·속성 변경에 대해 감시하는 규칙을 키 cron_change 로 /etc/audit/rules.d/labhub.rules 에 적고 커널에 올리세요.
3. 64비트 execve 중 실행 파일이 /usr/bin/curl 인 것만 잡는 규칙을 키 outbound_exec 로 같은 파일에 더하고 올리세요.
4. /etc/cron.d/nightly-report 를 만들어 curl 을 부르게 하고, curl 을 손으로 한 번 실행한 뒤 무엇을 했는지 /root/det/04-trigger.txt 에 적으세요.
5. ausearch -k outbound_exec -i 의 마지막 사건을 /root/det/05-evidence.txt 에 저장하고 그 아래에 pid=·exe=·key= 세 값을 적으세요.
6. 저널에서 cron 의 실행 기록을 JSON 으로 뽑아 /root/det/06-cron.json 에 저장하세요. 이 VM 에서 매분 도는 작업(labhub-metrics)의 실행 줄이 들어 있어야 합니다.
7. /usr/local/bin/labhub-helper.sh 를 만들어 실행 비트를 주고, cron_change 키로는 그 기록이 남지 않는다는 것을 확인해 /root/det/07-blindspot.txt 에 명령·결과·이유를 적으세요.
8. /usr/local/bin 을 키 persistence 로 감시하는 규칙을 더해 올리고, 파일을 한 번 더 고쳐 기록이 남는 것을 /root/det/08-closed.txt 에 확인하세요.
9. 이 호스트의 탐지 범위를 /root/det/09-report.md 에 ## 무엇이 남는가·## 무엇이 남지 않는가·## 규칙 목록·## 다음에 할 일 네 절로 쓰세요.
참고
- 규칙을 손으로
auditctl에 넣으면 재부팅에 사라집니다./etc/audit/rules.d/에 적고augenrules --load로 올리세요. 올라간 것은auditctl -l로 봅니다. ausearch는-i없이는 uid 와 시스콜이 숫자로 나옵니다. 읽을 때는-i를 붙이세요.- 저널을 기계가 읽게 뽑으려면
journalctl -t CRON -o json --since "-30 min"처럼-o json을 씁니다. - 7단계에서 키를 나누는 이유: 8단계에서 같은 키를 쓰면 7단계의 관찰이 뒤집힙니다. 새 자리는 새 키로 덮습니다.
- 흔한 실수: 규칙을 올리기 전에 파일을 만드는 것. 감사는 규칙이 올라간 뒤의 일만 봅니다.
단계 9개
- 무엇이 켜져 있는지
- 예약 작업 디렉터리를 감시한다
- 무엇이 실행됐는가
- 사건을 일으킨다
- 기록을 꺼내 읽는다
- 같은 사건을 저널에서
- 감시하지 않는 자리
- 빈 자리를 덮는다
- 탐지 범위를 문서로