Cyber Security: Python: kirim Wazuh Archive ke Ollama
Script Python
Download `wazuh_sensor_to_ollama.py`
Script sudah:
- diperiksa sintaks Python-nya;
- diuji dengan contoh event Wazuh;
- tidak membutuhkan library Python tambahan;
- membaca seluruh event dari `archives.json`;
- menyensor password, token, API key, cookie, dan credential;
- mempertahankan IP, hostname, agent, rule, serta bukti keamanan;
- menggabungkan event duplikat;
- membagi event menjadi batch agar prompt Ollama tidak terlalu besar;
- menyimpan data preprocessing dan hasil analisis Ollama dalam format JSONL.
Sumber data yang digunakan
Untuk **data sensor penuh**, gunakan:
/var/ossec/logs/archives/archives.json
Berbeda dengan `alerts.json`, file tersebut dapat menyimpan seluruh event yang diterima Wazuh, termasuk event yang tidak memicu rule. Fitur archive JSON dinonaktifkan secara bawaan karena dapat menggunakan ruang penyimpanan besar. ([Wazuh][1])
Alurnya:
Wazuh Agent dan perangkat jaringan
↓
archives.json
↓
Validasi dan normalisasi
↓
Sensor password, token, credential
↓
Deduplikasi dan pengelompokan batch
↓
preprocessed_wazuh.jsonl
↓
Ollama API
↓
ollama_wazuh_analysis.jsonl
1. Aktifkan arsip JSON Wazuh
Periksa konfigurasi:
sudo grep -n "logall_json" /var/ossec/etc/ossec.conf
Penjelasan:
- `sudo`: menjalankan perintah dengan hak administrator.
- `grep`: mencari teks di dalam file.
- `-n`: menampilkan nomor baris.
- `logall_json`: konfigurasi penyimpanan seluruh event dalam JSON.
Edit konfigurasi:
sudo nano /var/ossec/etc/ossec.conf
Di dalam bagian `<global>`, pastikan ada:
<global> <logall_json>yes</logall_json> </global>
Jangan membuat `<global>` kedua apabila bagian tersebut sudah tersedia. Masukkan `logall_json` ke bagian yang sudah ada.
Restart Wazuh Manager:
sudo systemctl restart wazuh-manager
Wazuh mendokumentasikan bahwa `logall_json=yes` menyimpan seluruh event ke `archives.json`; perubahan konfigurasi diterapkan setelah Wazuh Manager dimulai ulang. ([Wazuh][2])
Periksa apakah file mulai terisi:
sudo ls -lh /var/ossec/logs/archives/archives.json
Lihat tiga event terakhir:
sudo tail -n 3 /var/ossec/logs/archives/archives.json
2. Pasang script
Buat direktori:
sudo mkdir -p /opt/wazuh-ollama/output
Salin script yang sudah diunduh:
sudo cp ~/Downloads/wazuh_sensor_to_ollama.py /opt/wazuh-ollama/
Buat script dapat dieksekusi:
sudo chmod +x /opt/wazuh-ollama/wazuh_sensor_to_ollama.py
3. Pastikan Ollama Docker dapat diakses
Periksa container:
docker ps --format "table Template:.Names\tTemplate:.Image\tTemplate:.Ports"
Pastikan container Ollama memperlihatkan port seperti:
0.0.0.0:11434->11434/tcp
Uji API Ollama dari host:
curl http://127.0.0.1:11434/api/tags
Endpoint `/api/tags` menampilkan model yang tersedia pada Ollama. Script menggunakan endpoint `/api/generate` dan JSON Schema agar hasil analisis terstruktur. ([Ollama Docs][3])
Periksa nama model:
docker exec -it ollama ollama list
Contoh:
qwen3:4b
Script secara bawaan menggunakan model tersebut.
4. Uji preprocessing tanpa Ollama
Jalankan:
sudo python3 /opt/wazuh-ollama/wazuh_sensor_to_ollama.py \ --mode batch \ --limit 100 \ --dry-run
Arti opsi:
- `--mode batch`: membaca data sejumlah tertentu lalu berhenti.
- `--limit 100`: membaca 100 baris terakhir.
- `--dry-run`: menampilkan hasil preprocessing tanpa menulis file dan tanpa menghubungi Ollama.
- `\`: melanjutkan perintah ke baris berikutnya.
Hasilnya akan memperlihatkan struktur seperti:
{
"batch_id": "...",
"metadata": {
"unique_events": 12,
"total_occurrences": 27,
"top_agents": [],
"source_categories": []
},
"events": []
}
5. Simpan hasil preprocessing
sudo python3 /opt/wazuh-ollama/wazuh_sensor_to_ollama.py \ --mode batch \ --limit 1000 \ --output /opt/wazuh-ollama/output/preprocessed_wazuh.jsonl
Perintah tersebut belum mengirim data ke Ollama.
Lihat hasil:
sudo tail -n 1 \ /opt/wazuh-ollama/output/preprocessed_wazuh.jsonl \ | python3 -m json.tool
6. Preprocessing dan kirim ke Ollama
sudo python3 /opt/wazuh-ollama/wazuh_sensor_to_ollama.py \ --mode batch \ --limit 500 \ --max-events-per-batch 25 \ --max-chars-per-batch 45000 \ --send-ollama \ --ollama-url http://127.0.0.1:11434 \ --model qwen3:4b \ --output /opt/wazuh-ollama/output/preprocessed_wazuh.jsonl \ --analysis-output /opt/wazuh-ollama/output/ollama_analysis.jsonl
Opsi penting:
- `--max-events-per-batch 25`: maksimal 25 pola event unik dalam satu permintaan Ollama.
- `--max-chars-per-batch 45000`: membatasi perkiraan ukuran prompt.
- `--send-ollama`: mengaktifkan pengiriman ke Ollama.
- `--ollama-url`: alamat API Ollama.
- `--model`: model yang digunakan.
- `--output`: data hasil preprocessing.
- `--analysis-output`: hasil analisis Ollama.
Lihat analisis terbaru:
sudo tail -n 1 \ /opt/wazuh-ollama/output/ollama_analysis.jsonl \ | python3 -m json.tool
7. Memantau event baru secara langsung
sudo python3 /opt/wazuh-ollama/wazuh_sensor_to_ollama.py \ --mode follow \ --window-size 200 \ --flush-seconds 30 \ --send-ollama \ --ollama-url http://127.0.0.1:11434 \ --model qwen3:4b \ --output /opt/wazuh-ollama/output/preprocessed_live.jsonl \ --analysis-output /opt/wazuh-ollama/output/ollama_live.jsonl
Artinya:
- script menunggu event baru;
- setiap 200 event, event diproses menjadi batch;
- apabila 200 event belum terkumpul dalam 30 detik, window tetap diproses;
- event duplikat digabung dan diberi `occurrence_count`;
- script mencoba mendeteksi rotasi file Wazuh;
- tekan `Ctrl+C` untuk menghentikan.
Filter yang tersedia
Hanya event dari agent tertentu:
--agent web-server-01
Hanya event autentikasi:
--source-category authentication
Beberapa kategori:
--source-category authentication \ --source-category web \ --source-category firewall
Hanya event yang memiliki rule level minimal 7:
--min-rule-level 7
Namun untuk benar-benar mengambil **seluruh data sensor**, biarkan:
--min-rule-level 0
Level `0` pada script berarti event tanpa rule tetap diterima.
Catatan penting Docker
Script sebaiknya dijalankan pada **host Wazuh Manager**, bukan di dalam container Ollama. Container Ollama biasanya tidak mempunyai akses ke:
/var/ossec/logs/archives/archives.json
kecuali direktori Wazuh secara eksplisit di-*mount* ke container.
Konfigurasi yang disarankan:
Host Wazuh Manager
├── archives.json
├── script Python
└── Docker Ollama
└── port 11434 dipublikasikan ke host
Dengan konfigurasi tersebut, alamat Ollama adalah:
http://127.0.0.1:11434
Hasil LLM harus diperlakukan sebagai **rekomendasi analisis**, bukan langsung digunakan untuk menjalankan *active response* otomatis tanpa validasi analis manusia.
[1]: https://documentation.wazuh.com/current/user-manual/manager/event-logging.html?utm_source=chatgpt.com "Event logging - Wazuh server" [2]: https://documentation.wazuh.com/current/user-manual/reference/ossec-conf/global.html?utm_source=chatgpt.com "global - Local configuration (ossec.conf)" [3]: https://docs.ollama.com/capabilities/structured-outputs?utm_source=chatgpt.com "Structured Outputs"