Cyber Security: Python: kirim Wazuh Alert ke Ollama

From OnnoWiki
Revision as of 05:24, 17 June 2026 by Onnowpurbo (talk | contribs) (→‎Script Python)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Script Python

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"