Cyber Security: Python: kirim Wazuh Alert ke Ollama
Script Python
- [wazuh_to_ollama.py]
Script sudah diperiksa sintaksnya dan diuji menggunakan contoh alert Wazuh dalam mode `--dry-run`.
Alurnya:
Wazuh alerts.json
↓
Filter rule.level
↓
Ambil informasi penting
↓
Kirim ke Ollama
↓
Analisis SOC terstruktur
↓
ollama_wazuh_analysis.jsonl
Secara bawaan, Wazuh menyimpan alert dalam `/var/ossec/logs/alerts/alerts.json`. Level rule Wazuh berada pada rentang `1–16`; makin tinggi angkanya, biasanya makin tinggi prioritas alert. ([Wazuh][1])
Script menggunakan Ollama endpoint `/api/generate`, dengan `stream: false`, `think: false`, dan JSON Schema agar hasil analisis berbentuk JSON konsisten. ([Ollama Docs][2])
1. Simpan script
Misalnya file terunduh di folder `Downloads`:
mkdir -p ~/Apps/Wazuh-Ollama
Penjelasan:
- `mkdir` berarti membuat direktori.
- `-p` membuat seluruh direktori yang dibutuhkan dan tidak error bila direktori sudah ada.
- `~` berarti direktori rumah pengguna, misalnya `/home/onno`.
- `~/Apps/Wazuh-Ollama` adalah lokasi project.
Salin script:
cp ~/Downloads/wazuh_to_ollama.py ~/Apps/Wazuh-Ollama/
Masuk ke project:
cd ~/Apps/Wazuh-Ollama
2. Periksa model Ollama
ollama list
Pastikan ada model seperti:
qwen3:4b
Script secara bawaan menggunakan:
qwen3:4b
Script juga otomatis memeriksa daftar model menggunakan endpoint Ollama `/api/tags`. ([Ollama Docs][3])
Uji API Ollama:
curl http://127.0.0.1:11434/api/tags
- `curl` mengirim permintaan HTTP.
- `127.0.0.1` berarti komputer yang sedang digunakan.
- `11434` adalah port bawaan Ollama.
- `/api/tags` meminta daftar model.
3. Uji tanpa menghubungi Ollama
Jalankan terlebih dahulu dengan `--dry-run`:
sudo python3 wazuh_to_ollama.py \ --mode batch \ --limit 3 \ --min-level 7 \ --dry-run
Arti setiap bagian:
- `sudo`: menjalankan dengan izin administrator agar bisa membaca file Wazuh.
- `python3`: menjalankan interpreter Python 3.
- `wazuh_to_ollama.py`: script yang dijalankan.
- `\`: perintah dilanjutkan ke baris berikutnya.
- `--mode batch`: membaca sejumlah alert terakhir, lalu berhenti.
- `--limit 3`: membaca tiga baris alert terakhir.
- `--min-level 7`: hanya memproses alert dengan `rule.level` minimal 7.
- `--dry-run`: hanya menampilkan prompt; belum menghubungi Ollama.
Contoh keluaran:
[ALERT] level=10 rule_id=5710 description=sshd: Attempt to login... Lakukan triage terhadap satu alert Wazuh berikut. ... [DONE] Total alert yang diproses: 1
4. Kirim alert ke Ollama
Setelah `--dry-run` berhasil:
sudo python3 wazuh_to_ollama.py \ --mode batch \ --limit 5 \ --min-level 7 \ --model qwen3:4b \ --output /tmp/ollama_wazuh_analysis.jsonl
Ini akan:
1. Membaca lima alert terakhir. 2. Melewati alert dengan level di bawah 7. 3. Mengirim alert terpilih ke `qwen3:4b`. 4. Menyimpan hasil ke:
/tmp/ollama_wazuh_analysis.jsonl
5. Membaca hasil
tail -n 1 /tmp/ollama_wazuh_analysis.jsonl | python3 -m json.tool
Penjelasan:
- `tail` membaca bagian akhir file.
- `-n 1` berarti ambil satu baris terakhir.
- `|` mengirim hasil perintah kiri ke perintah kanan.
- `python3 -m json.tool` merapikan JSON agar mudah dibaca.
Contoh struktur hasil:
{
"processed_at": "2026-06-17T03:15:00+00:00",
"model": "qwen3:4b",
"wazuh_rule_level": 10,
"wazuh_alert": {
"timestamp": "2026-06-17T10:00:00+0700",
"agent": {
"name": "server-01"
},
"rule": {
"id": "5710",
"level": 10,
"description": "sshd authentication failure"
}
},
"ollama_analysis": {
"summary": "Terjadi kegagalan autentikasi SSH.",
"classification": "needs_investigation",
"risk": "medium",
"confidence": 0.82,
"evidence": [
"Kegagalan login SSH tercatat oleh Wazuh."
],
"mitre_attack": [],
"recommended_actions": [
"Periksa frekuensi kegagalan login dari alamat sumber.",
"Korelasikan dengan log autentikasi lain.",
"Verifikasi apakah alamat sumber merupakan sistem internal."
],
"missing_information": [
"Jumlah percobaan dari alamat sumber.",
"Status keberhasilan login setelah kegagalan."
]
}
}
6. Mode monitoring langsung
Untuk hanya memproses alert baru:
sudo python3 wazuh_to_ollama.py \ --mode follow \ --min-level 10 \ --model qwen3:4b \ --output /tmp/ollama_wazuh_live.jsonl
Mode ini berjalan terus:
Wazuh membuat alert baru
↓
Script langsung membacanya
↓
Alert level 10 atau lebih dikirim ke Ollama
↓
Hasil disimpan ke JSONL
Hentikan dengan:
Ctrl+C
Script juga mendeteksi ketika Wazuh melakukan rotasi file log dan mencoba membuka file baru secara otomatis.
Jangan menggunakan:
--from-start
pada file produksi yang besar, kecuali memang ingin menganalisis seluruh alert lama. Opsi tersebut dapat menyebabkan ribuan alert dikirim ke Ollama.
Bagian penting dalam script
`compact_alert()`
Memilih informasi utama:
timestamp agent manager rule decoder location data full_log previous_output
Data yang terlalu panjang dipotong agar tidak memenuhi context window model.
`get_rule_level()`
Membaca:
alert["rule"]["level"]
Kemudian membandingkannya dengan:
--min-level
`build_prompt()`
Mengubah alert menjadi prompt untuk triage SOC.
Prompt memerintahkan model untuk menghasilkan:
- ringkasan;
- klasifikasi;
- risiko;
- tingkat keyakinan;
- bukti;
- MITRE ATT&CK;
- rekomendasi;
- informasi yang masih kurang.
`SYSTEM_PROMPT`
Menganggap isi log sebagai data tidak tepercaya. Ini penting karena teks log dapat berasal dari penyerang dan mungkin berisi instruksi palsu yang mencoba memengaruhi LLM.
`analyze_with_ollama()`
Mengirim HTTP `POST` ke:
http://127.0.0.1:11434/api/generate
`append_jsonl()`
Menyimpan satu hasil analisis sebagai satu baris JSON.
Format JSONL memudahkan hasil dibaca menggunakan:
- Python;
- Pandas;
- Polars;
- Elasticsearch;
- OpenSearch;
- sistem RAG;
- pipeline machine learning.
Bila Ollama berada di komputer lain
Gunakan:
python3 wazuh_to_ollama.py \ --ollama-url http://IP-OLLAMA:11434 \ --mode batch \ --limit 5
Namun jangan membuka port `11434` langsung ke internet. Ollama lokal tidak memerlukan autentikasi ketika diakses melalui `localhost`, sehingga akses jaringan harus dibatasi dengan firewall, VPN, atau SSH tunnel. ([Ollama Docs][4])
Untuk tahap awal, konfigurasi yang paling aman adalah:
Wazuh Manager dan Ollama pada mesin yang sama
atau:
Wazuh Manager
↓ SSH tunnel/VPN
Ollama Server
Hasil Ollama tetap merupakan rekomendasi untuk analis, bukan dasar untuk melakukan *active response* otomatis tanpa verifikasi manusia.
[1]: https://documentation.wazuh.com/current/user-manual/manager/alert-management.html?utm_source=chatgpt.com "Alert management - Wazuh server" [2]: https://docs.ollama.com/api/generate "Generate a response - Ollama" [3]: https://docs.ollama.com/api/tags "List models - Ollama" [4]: https://docs.ollama.com/api/authentication?utm_source=chatgpt.com "Authentication"