Cyber Security: Python: kirim Wazuh Archive ke Ollama

From OnnoWiki
Revision as of 08:28, 17 June 2026 by Onnowpurbo (talk | contribs) (Created page with "== Script Python== [Download `wazuh_sensor_to_ollama.py`] Script sudah: * diperiksa sintaks Python-nya; * diuji dengan contoh event Wazuh; * tidak membutuhkan library Pyth...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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"