#!/bin/bash
# 실습 #20 ③ — FIM (파일 무결성) + auth.log 분석 룰
# - syscheck: /etc, /usr/bin 실시간(inotify) 감시. 변경되면 즉시 alert.
# - SSH 무차별 대입 패턴: 기본 룰 5712 가 매칭 → severity 10 alert.
# - 본 실습은 agent 측 ossec.conf 의 syscheck 블록 활성화 + 변조·로그인 실패 재현.
set -e

DIR="$(cd "$(dirname "$0")" && pwd)"

# 1) syscheck drop-in (실시간 감시 디렉터리 확장)
SRC_OSSEC="$DIR/configs/03_ossec_syscheck.xml"
TARGET=/var/ossec/etc/ossec.conf

# 기존 ossec.conf 백업
sudo cp "$TARGET" "$TARGET.bak.$(date +%Y%m%d%H%M%S)"

# syscheck 블록을 통째로 교체할 게 아니라, 추가 디렉터리만 한 번 append
if ! sudo grep -q "/var/www/html-lab" "$TARGET"; then
    # </syscheck> 직전에 추가 라인 삽입
    sudo python3 - "$TARGET" "$SRC_OSSEC" <<'PY'
import sys, re
target, src = sys.argv[1], sys.argv[2]
extra = open(src).read()
data  = open(target).read()
# 마지막 </syscheck> 직전에 삽입
patched = re.sub(r'</syscheck>', extra + '\n</syscheck>', data, count=1)
open(target, 'w').write(patched)
PY
    echo "→ ossec.conf 에 lab 디렉터리 추가."
fi

# 2) lab 디렉터리 준비 + agent 재시작
sudo mkdir -p /var/www/html-lab
sudo systemctl restart wazuh-agent
sleep 3

# 3) FIM 변조 시뮬
echo
echo "=== FIM 변조 시뮬 ==="
sudo bash -c 'echo "TAMPERED $(date)" >> /etc/lab-fim-canary'
sudo bash -c 'echo "<h1>defaced</h1>" > /var/www/html-lab/index.html'
sudo chmod 4755 /tmp/lab-suspicious 2>/dev/null || { sudo touch /tmp/lab-suspicious; sudo chmod 4755 /tmp/lab-suspicious; }

# 즉시 inotify 실시간 알람 + realtime=no 인 경우 다음 주기에 알람
echo
echo "→ 1~2분 안에 manager 대시보드에 syscheck 알람 발생 예상"

# 4) 로컬 ossec.log 에서 syscheck 이벤트 확인
echo
echo "=== /var/ossec/logs/ossec.log (syscheck 라인) ==="
sudo grep -iE "syscheck|integrity" /var/ossec/logs/ossec.log | tail -10 || \
    echo "(아직 로그 없음 — 30초 후 다시)"

# 5) SSH 실패 시뮬 — 로컬에서 wrong password 로그 발생시키기
#    (별도 외부 머신에서 ssh attempt 하면 더 깔끔하지만, 단일 VM 에선 로컬 흉내)
echo
echo "=== SSH brute force 패턴 흉내 (auth.log 에 Failed password 기록) ==="
for i in 1 2 3 4 5; do
    logger -p auth.warn -t sshd "Failed password for invalid user labtest from 192.0.2.${i} port 4444 ssh2"
done
sleep 2

echo
echo "=== auth.log Failed password 매칭 (decoder + rule 5712) ==="
sudo grep "Failed password" /var/log/auth.log | tail -5 || true

# 6) Wazuh 룰 매칭 확인
echo
echo "=== alerts.log (manager 측에서 더 정확) ==="
echo "→ manager 머신에서:"
echo "   sudo tail -f /var/ossec/logs/alerts/alerts.log"
echo "   → \"SSH insecure connection attempt (scan)\" / brute force 알람"

cat <<'EOF'

대시보드 확인:
  https://<MANAGER-IP>/
    Modules → Security events → Filter rule.id:550..554 (FIM)
    Modules → Security events → Filter rule.id:5712 (SSH brute force)

기본 룰 ID:
  550   : syscheck file integrity changed
  554   : syscheck file added
  5712  : sshd brute force
  5715  : sshd authentication failed

운영 활용:
  - rule.level >= 10 자동 알람
  - MITRE ATT&CK 매핑으로 SOC playbook 연계
EOF
