ระบบตรวจจับความเสี่ยงจาก security log แบบ realtime + RAG ที่ self-host ได้ทั้งหมด รันได้แม้ออฟไลน์
ทำอะไร และต่างจาก demo เดิมอย่างไร
ROGLAG รับ log (อัปโหลด CSV หรือ stream เข้ามา) → classify ด้วย rule ทันที (brute force, port scan, web attack, priv esc, data exfil, C2 beacon) → เก็บลง database → push เข้าหน้าเว็บแบบ realtime ผ่าน WebSocket → ถามตอบด้วย RAG ภาษาไทยได้
OPENROUTER_API_KEY เพื่อให้ตอบ RAG สวยขึ้น (มี fallback เสมอ)เลือกได้ 3 แบบ — แนะนำ Docker สำหรับคนอื่นที่อยากรันต่อ
docker compose up --build
# เปิด http://localhost:8000
คำสั่งเดียวได้ทั้ง API + PostgreSQL พร้อม volume เก็บข้อมูลถาวร
docker compose up api-sqlite --build
# เปิด http://localhost:8000
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8000
# เปิด http://localhost:8000 (ใช้ SQLite ที่ ./data/lograg.db อัตโนมัติ)
OPENROUTER_API_KEY ใน .env (ดู .env.example) แล้วติ๊ก "ใช้ LLM" ในแท็บ Ask
ปุ่ม burst สร้าง log จำลองหลากหลาย ไม่ซ้ำทุกครั้ง ยิงเข้า pipeline จริง เห็นใน feed ทันที
สตรีม mock log ต่อเนื่องตาม rate/interval ที่ตั้ง เพื่อจำลองทราฟฟิกจริงสำหรับทดสอบ
สร้างไฟล์ CSV ใหม่ที่สุ่มไม่ซ้ำ (unseeded) ดาวน์โหลดไปทดสอบ upload ได้
อัปโหลด CSV → classify ทุกแถว realtime → เทียบความแม่นยำกับ label เดิม (ถ้ามี)
แสดง event เข้ามาสดๆ สีตาม severity + เหตุผลการตรวจจับ + MITRE
รวม critical event เป็น alert (group ตาม IP/user) พร้อม runbook แนะนำ
ถามภาษาไทยเกี่ยวกับ log ที่เก็บไว้ — keyword retrieval + สรุป (local หรือ LLM)
สัดส่วน category / severity / risk rate แบบ realtime
โค้ดหลัก: app/ingest.py (parse+classify+store) · app/realtime.py (WebSocket manager + stream) · app/rag.py (retrieval+answer) · app/main.py (routes)
| Method | Path | หน้าที่ |
|---|---|---|
| GET | /health | สถานะระบบ (storage, llm_ready, ws_clients, stream_running) |
| GET | /api/stats | สถิติ category/severity/source/top_ips |
| GET | /api/logs?limit&offset&category&severity&source&q | query log ที่เก็บไว้ |
| GET | /api/alerts?limit | critical alerts ที่ group แล้ว |
| POST | /api/ask | RAG Q&A — body: {question, use_llm, model, limit} |
| POST | /api/ingest/csv | อัปโหลดไฟล์ CSV (multipart file) → ตรวจจับ + broadcast |
| GET | /api/generate/csv?count&profile | ดาวน์โหลด CSV สุ่มใหม่ (profile: mixed/attack/realistic) |
| POST | /api/mock/emit?count&profile | ยิง mock burst เข้าระบบ realtime |
| POST | /api/mock/stream/start?rate&interval&profile | เริ่มสตรีม mock ต่อเนื่อง |
| POST | /api/mock/stream/stop | หยุดสตรีม |
| WS | /ws | realtime feed — รับ {type:event|summary|hello} |
# ยิง mock 50 event แบบ attack-heavy
curl -X POST "http://localhost:8000/api/mock/emit?count=50&profile=attack"
# ถาม RAG
curl -X POST http://localhost:8000/api/ask \
-H "Content-Type: application/json" \
-d '{"question":"มี brute force จาก ip ไหนบ้าง"}'
# อัปโหลด CSV
curl -X POST http://localhost:8000/api/ingest/csv -F "file=@roglag_logs.csv"
คอลัมน์ที่ระบบอ่าน — ต้องมีอย่างน้อย message (ใช้ตรวจจับ) หรือ source
timestamp,source,category,severity,message,src_ip,dst_ip,user,dst_port,path,action
message = ข้อความ log ดิบ → ใช้ ตรวจจับ categorycategory (ถ้ามี) = label เดิม → ระบบเอาไปวัดความแม่นยำการตรวจจับ ไม่ใช้ในการตัดสินใช้ ROGLAG เป็น detection engine แล้วให้ n8n ทำ action ต่อ
GET /api/alerts?limit=20 ทุก X นาที (หรือเก็บ last_seen ไว้กรองของใหม่)src_ip)POST /api/ask ให้สรุปภาษาไทย แนบเข้า ticket* และทุก endpoint เปิด public — เหมาะกับ dev/self-host ในเครือข่ายปิดเท่านั้น ก่อนขึ้นจริงต้องวาง reverse proxy (Traefik/Caddy) + auth (API key/OAuth) หน้า API
DATABASE_URL) และทำ retention/partition.env — ใช้ secret manager ใน production