Cyber Security: Ollama: startegi analisa log JSONL
- Metode terbaik: jangan kirim seluruh `alerts.json` langsung ke Ollama
Pipeline tercepat dan paling akurat adalah:
```text alerts.json
↓
Python: parsing, filter, agregasi, deduplikasi
↓
Ringkasan kecil dan terstruktur
↓
Ollama: interpretasi, prioritas risiko, dan rekomendasi
↓
Laporan Markdown + JSON ```
- Python menghitung fakta**, sedangkan **Ollama menjelaskan makna dan prioritasnya**. Dengan cara ini, Ollama cukup menerima satu ringkasan kecil dalam satu request, bukan membaca ratusan atau jutaan baris mentah.
---
- Hasil awal file Anda
Saya sudah memproses file `alerts.json` yang diunggah.
| Informasi | Hasil | | ---------------------- | -------------------: | | Total alert valid | **333** | | JSON rusak | **0** | | Rentang waktu | **sekitar 33 menit** | | Level 3 | **176** | | Level 4 | **2** | | Level 7 | **153** | | Level 8 | **2** | | Agent `server` | **306 alert** | | Agent `server-webtest` | **27 alert** | | Alert SCA/CIS | **281** | | SCA passed | **118** | | SCA failed | **119** | | SCA not applicable | **42** | | Rootcheck anomaly | **26** |
- Temuan yang perlu diprioritaskan
- 1. Rootcheck pada `server-webtest`
Terdapat **26 alert level 7** yang menyebut beberapa file sistem sebagai kemungkinan *trojaned*, antara lain:
```text /bin/ls /usr/bin/ls /bin/env /usr/bin/env /bin/cat /usr/bin/cat /bin/chmod /usr/bin/chmod /bin/passwd /usr/bin/passwd /bin/md5sum /usr/bin/md5sum ```
Ini **belum membuktikan bahwa server terkena malware**. Alert rootcheck berbasis pola dapat menghasilkan *false positive*, dan `/bin` serta `/usr/bin` pada Ubuntu modern dapat menunjuk ke file yang sama.
Validasi pada `server-webtest`:
```bash readlink -f /bin/ls readlink -f /usr/bin/ls ```
`readlink -f` menampilkan lokasi file sebenarnya setelah seluruh symbolic link diselesaikan.
Cari paket pemilik file:
```bash dpkg -S /bin/ls /usr/bin/ls /usr/bin/passwd /usr/bin/md5sum ```
- `dpkg -S`: mencari paket Debian yang memiliki file tersebut.
- Beberapa path mungkin tidak langsung dikenali karena mekanisme merged `/usr`.
Pasang alat pemeriksa integritas:
```bash sudo apt update sudo apt install debsums -y ```
- `debsums`: memeriksa checksum file paket Debian.
- `-y`: otomatis menyetujui instalasi.
Periksa paket penting:
```bash sudo debsums -s coreutils passwd ```
- `-s`: hanya menampilkan file yang gagal atau berubah.
- Tidak ada output umumnya berarti seluruh checksum yang tersedia cocok.
Periksa juga dengan `dpkg`:
```bash sudo dpkg -V coreutils passwd ```
- `-V`: memverifikasi atribut dan checksum file paket.
- 2. User dan group `wazuh-dashboard` dibuat
Terdapat dua alert level 8:
```text New group added: wazuh-dashboard New user added: wazuh-dashboard ```
Alert muncul berdekatan dengan proses instalasi paket `wazuh-dashboard`, sehingga **kemungkinan besar merupakan aktivitas instalasi resmi**, bukan pembuatan akun interaktif oleh penyerang.
User tersebut juga menggunakan:
```text home=/nonexistent shell=/bin/false ```
Ini lazim untuk akun service. Tetap cocokkan waktunya dengan aktivitas administrator.
- 3. Sebagian besar alert adalah compliance scan
Sebanyak **281 dari 333 alert** berasal dari SCA/CIS. Jadi banyak alert level 7 bukan serangan aktif, melainkan hasil pemeriksaan konfigurasi, seperti:
- `/tmp` belum menjadi partisi terpisah;
- opsi `nodev`, `nosuid`, atau `noexec` belum diterapkan;
- `/home`, `/var`, dan `/var/log` belum dipisahkan;
- beberapa kernel module belum dinonaktifkan.
Ollama harus diberi tahu untuk membedakan:
```text serangan aktif compliance finding perubahan sistem resmi noise atau duplikasi bukti kompromi ```
---
- Script siap pakai
Saya sudah membuat script yang:
- membaca JSONL secara streaming;
- tidak memasukkan seluruh file ke memori;
- menghitung severity, agent, rule, IP, user, dan SCA;
- mengelompokkan alert berulang;
- mengirim satu ringkasan kecil ke Ollama;
- meminta output JSON terstruktur;
- membuat laporan Markdown;
- melindungi prompt dari instruksi berbahaya yang mungkin berada di dalam log.
Unduh:
- [Script Wazuh–Ollama Analyzer](sandbox:/mnt/data/wazuh_ollama_analyzer.py)
- [Petunjuk penggunaan](sandbox:/mnt/data/README_wazuh_ollama.md)
- [Hasil preprocessing file Anda](sandbox:/mnt/data/hasil_wazuh_summary.json)
Saya sudah menguji bagian parsing dan preprocessing terhadap file Anda. Semua **333 baris berhasil dibaca**. Pemanggilan Ollama harus dijalankan pada server Anda karena instance Ollama lokal Anda tidak tersedia dari lingkungan saya.
---
- 1. Pilih model Ollama
- Pilihan utama: `qwen3:8b`
```bash ollama pull qwen3:8b ```
Model tersebut berukuran sekitar **5,2 GB** dengan context window 40K. Ollama menyediakan Qwen3 dalam beberapa ukuran, termasuk 4B, 8B, dan 14B. ([Ollama][1])
Cocok untuk:
- analisis SOC;
- Bahasa Indonesia;
- klasifikasi temuan;
- pembuatan rekomendasi;
- reasoning yang lebih baik daripada model sangat kecil.
- Pilihan lebih ringan dan cepat: `gemma3:4b`
```bash ollama pull gemma3:4b ```
`gemma3:4b` berukuran sekitar **3,3 GB** dan mempunyai context window 128K. Model ini lebih ringan untuk CPU atau GPU dengan memori terbatas. ([Ollama][2])
- Rekomendasi praktis
| Kondisi server | Model | | ----------------------------------------------------- | ----------- | | CPU-only atau RAM terbatas | `gemma3:4b` | | GPU/RAM cukup, seimbang | `qwen3:8b` | | Mengutamakan kualitas, tidak terlalu peduli kecepatan | `qwen3:14b` |
Untuk hasil cepat, mulai dengan:
```text qwen3:8b ```
---
- 2. Periksa Ollama
```bash curl http://localhost:11434/api/tags ```
Keterangan:
- `curl`: mengirim request HTTP.
- `http://localhost:11434`: alamat default Ollama.
- `/api/tags`: menampilkan model yang tersedia.
Apabila muncul daftar model, Ollama sudah aktif.
Jika Ollama bukan service:
```bash ollama serve ```
Biarkan terminal tersebut tetap berjalan dan gunakan terminal lain untuk menjalankan analisis.
---
- 3. Jalankan analisis
Letakkan file berikut pada direktori yang sama:
```text alerts.json wazuh_ollama_analyzer.py ```
Kemudian:
```bash python3 wazuh_ollama_analyzer.py alerts.json \
--model qwen3:8b \ --output hasil_wazuh
```
Penjelasan:
- `python3`: menjalankan Python 3.
- `wazuh_ollama_analyzer.py`: script analisis.
- `alerts.json`: file input Wazuh.
- `--model qwen3:8b`: model yang digunakan Ollama.
- `--output hasil_wazuh`: awalan nama file hasil.
- `\`: melanjutkan perintah ke baris berikutnya.
Hasilnya:
```text hasil_wazuh_summary.json hasil_wazuh.json hasil_wazuh.md ```
Fungsi masing-masing:
- `hasil_wazuh_summary.json`: statistik yang dihitung Python;
- `hasil_wazuh.json`: hasil AI dalam struktur JSON;
- `hasil_wazuh.md`: laporan SOC yang mudah dibaca.
Buka laporan:
```bash less hasil_wazuh.md ```
Keluar dari `less` dengan menekan:
```text q ```
---
- 4. Mode sangat cepat tanpa AI
Untuk mengecek isi file dan menghasilkan statistik tanpa memanggil Ollama:
```bash python3 wazuh_ollama_analyzer.py alerts.json \
--summary-only \ --output hasil_wazuh
```
`--summary-only` berarti berhenti setelah preprocessing Python.
Hasilnya:
```text hasil_wazuh_summary.json ```
Lihat hasil:
```bash jq . hasil_wazuh_summary.json ```
---
- 5. Mempercepat respons Ollama
Preload model agar request pertama tidak menunggu proses pemuatan model:
```bash curl http://localhost:11434/api/chat \
-d '{
"model": "qwen3:8b",
"keep_alive": "30m"
}'
```
- `-d`: mengirim data JSON ke API.
- `keep_alive: 30m`: mempertahankan model di memori selama 30 menit.
Ollama mendukung preload melalui request kosong dan parameter `keep_alive` untuk mempertahankan model di memori. Secara bawaan, model disimpan sekitar lima menit setelah digunakan. ([Ollama Docs][3])
Script juga menggunakan:
```json {
"stream": false,
"think": false,
"keep_alive": "30m",
"options": {
"temperature": 0.1,
"num_ctx": 8192
}
} ```
Artinya:
- `stream: false`: menunggu satu respons lengkap;
- `think: false`: tidak menggunakan mode berpikir panjang, sehingga lebih cepat;
- `keep_alive`: model tidak dimuat ulang setiap analisis;
- `temperature: 0.1`: hasil lebih konsisten dan tidak kreatif;
- `num_ctx: 8192`: membatasi konteks agar konsumsi memori tetap terkendali.
Ollama `/api/chat` mendukung output JSON atau JSON Schema, pengaturan `think`, serta `keep_alive`. ([Ollama Docs][4])
---
- 6. Bila Ollama berjalan dalam Docker
Periksa container:
```bash docker ps ```
Cari container bernama seperti:
```text ollama ```
Pastikan port dipublikasikan:
```text 0.0.0.0:11434->11434/tcp ```
Kemudian jalankan:
```bash python3 wazuh_ollama_analyzer.py alerts.json \
--host http://127.0.0.1:11434 \ --model qwen3:8b \ --output hasil_wazuh
```
Penjelasan:
- `--host`: alamat API Ollama.
- `127.0.0.1`: komputer lokal.
- `11434`: port default Ollama.
Apabila script dijalankan dari container lain pada Docker network yang sama:
```bash python3 wazuh_ollama_analyzer.py alerts.json \
--host http://ollama:11434 \ --model qwen3:8b \ --output hasil_wazuh
```
Di sini `ollama` merupakan nama service atau nama container.
---
- Arsitektur produksi yang disarankan
Untuk penggunaan rutin di SOC:
```text Wazuh alerts.json
↓
Script dijalankan setiap 5–15 menit
↓
Filter hanya alert baru
↓
Grouping rule + agent + source IP
↓
Satu request ke Ollama
↓
Laporan Markdown/JSON
↓
TheHive, email, Telegram, atau dashboard ```
Jangan menjalankan satu request Ollama untuk setiap alert. Lebih baik:
```text 100 alert → 1 agregasi → 1 request Ollama ```
Itulah pendekatan yang paling cepat, murah, dan lebih tahan terhadap halusinasi.
[1]: https://ollama.com/library/qwen3 "qwen3" [2]: https://ollama.com/library/gemma3 "gemma3" [3]: https://docs.ollama.com/faq "FAQ - Ollama" [4]: https://docs.ollama.com/api/chat "Generate a chat message - Ollama"