Cyber Security: Ollama: startegi analisa log JSONL

From OnnoWiki
Revision as of 13:11, 19 June 2026 by Onnowpurbo (talk | contribs)
Jump to navigation Jump to search

Metode terbaik: jangan kirim seluruh `alerts.json` langsung ke Ollama

Pipeline tercepat dan paling akurat adalah:

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:

/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`:

readlink -f /bin/ls
readlink -f /usr/bin/ls

`readlink -f` menampilkan lokasi file sebenarnya setelah seluruh symbolic link diselesaikan.

Cari paket pemilik file:

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:

sudo apt update
sudo apt install debsums -y
  • `debsums`: memeriksa checksum file paket Debian.
  • `-y`: otomatis menyetujui instalasi.

Periksa paket penting:

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`:

sudo dpkg -V coreutils passwd


  • `-V`: memverifikasi atribut dan checksum file paket.

2. User dan group `wazuh-dashboard` dibuat

Terdapat dua alert level 8:

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:

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:

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`

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`

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:

qwen3:8b


2. Periksa Ollama

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:

ollama serve

Biarkan terminal tersebut tetap berjalan dan gunakan terminal lain untuk menjalankan analisis.


3. Jalankan analisis

Letakkan file berikut pada direktori yang sama:

alerts.json
wazuh_ollama_analyzer.py


Kemudian:

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:

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:

less hasil_wazuh.md


Keluar dari `less` dengan menekan:

q


4. Mode sangat cepat tanpa AI

Untuk mengecek isi file dan menghasilkan statistik tanpa memanggil Ollama:

python3 wazuh_ollama_analyzer.py alerts.json \
  --summary-only \
  --output hasil_wazuh

`--summary-only` berarti berhenti setelah preprocessing Python.

Hasilnya:

hasil_wazuh_summary.json

Lihat hasil:

jq . hasil_wazuh_summary.json


5. Mempercepat respons Ollama

Preload model agar request pertama tidak menunggu proses pemuatan model:

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:

{
  "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:

docker ps

Cari container bernama seperti:

ollama


Pastikan port dipublikasikan:

0.0.0.0:11434->11434/tcp

Kemudian jalankan:

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:

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:

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:

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"