Implementasi Sistem SOAR Open-Source Berbasis n8n untuk Deteksi dan Respons Ancaman Malware dan Phishing dengan Mitigasi Aktif Human-in-the-Loop (Studi Kasus: CV Bali Handmade)
Threat intelligence multi-sumber, respons berjenjang berbasis keyakinan, ringkasan AI, dan approval analis lewat satu klik di Telegram.
- SOAR penuh dari komponen open-source — setara kapabilitas Cortex XSOAR atau Splunk SOAR tanpa biaya lisensi.
- Respons berjenjang (confidence-based) — sistem yakin bertindak otomatis; sistem ragu menyerahkan keputusan ke analis (human-in-the-loop).
- Threat intelligence multi-sumber — VirusTotal + MalwareBazaar + MISP (feed OSINT komunitas) untuk malware, GSB + URLScan.io untuk phishing, AlienVault OTX sebagai fallback saat rate-limit.
- Hemat kuota & anti-noise — filter noise pra-scan, cache verdict berbasis hash dengan TTL diferensial, dan dedup claim-check di sisi server.
- Agen ringan lintas OS —
soar-agent(Rust, ~5 MB) untuk Linux, Windows, dan macOS; mengirim metadata + hash saja, isi berkas tidak pernah keluar endpoint. - Bukti yang bisa dipantau — dashboard web (UI bergaya Wazuh), TUI terminal, dan API monitoring dengan heartbeat 60 detik.
- Akses machine-to-machine AI Agent & Integrasi MCP (Model Context Protocol JSON-RPC 2.0 stdio dan antarmuka API Keys berbasis granular scopes untuk integrasi AI Agent seperti agy, Claude Code, Codex, dan Cursor).
- Setup lintas-device — bootstrap server satu perintah + empat jalur pemasangan agent, termasuk rollout fleet via Ansible.
Empat kelompok komponen:
| Kelompok | Isi |
|---|---|
| Endpoint | soar-agent (Rust) — FIM (~/Downloads, ~/Desktop, USB), hash SHA-256, karantina lokal. Kompatibel dengan Wazuh Agent untuk aturan rantai proses. |
| SOAR Server | Wazuh Manager (korelasi aturan + Active Response + API :55000), n8n (orkestrasi, 5 workflow), LLM (ringkasan/rekomendasi), fleet-monitor + dashboard. |
| Threat Intelligence | VirusTotal, MalwareBazaar, AlienVault OTX (hash); Google Safe Browsing, URLScan.io (URL). |
| Human-in-the-Loop | Telegram Bot (notifikasi + tombol keputusan) dan Analis SOC. |
Penjelasan awam dan diagram lain: docs/arsitektur/ARCHITECTURE.md, docs/arsitektur/FLOW.md, docs/panduan/PANDUAN-DIAGRAM.md.
- Endpoint — berkas baru terdeteksi; agent menghitung SHA-256 dan mengirim alert ringan (1-2 KB) ke webhook n8n. Isi berkas tidak dikirim.
- n8n — menyaring noise, lalu memeriksa verdict: cache hash → VirusTotal → MalwareBazaar (bila perlu) → OTX bila VT rate-limit.
- Klasifikasi — severity ditentukan dari verdict threat intel (VirusTotal/MalwareBazaar/OTX) dan status eksekutabel; level rule FIM saja tidak menjadikan berkas "malware".
- Respons — kasus berkeyakinan tinggi dieksekusi otomatis; kasus ambigu memunculkan tombol keputusan di Telegram.
- Jejak — setiap event masuk
fleet-monitor(dipersist ke SQLite) dan tampil di dashboard (status, severity, hash, tautan VirusTotal). Riwayat bisa ditelusuri per periode (24 jam–90 hari atau rentang custom), digabung dengan arsip alert Wazuh Indexer.
| Komponen | Peran | Versi |
|---|---|---|
| Wazuh Manager | SIEM, korelasi aturan, integratord, Active Response | 4.14.8 |
| Wazuh Indexer | OpenSearch, penyimpanan dan pencarian log | 4.14.8 |
| Wazuh Dashboard | Antarmuka bawaan Wazuh (opsional) | 4.14.8 |
| n8n | Mesin orkestrasi playbook (otak SOAR) | 2.42.5 |
| soar-agent | Agen endpoint Rust: FIM, hash, karantina, scan on-demand | - |
| fleet-monitor | API monitoring (heartbeat, event, command queue, cache verdict, API Keys M2M) | stdlib Python |
| misp-index | Sumber threat-intel MISP (feed CIRCL OSINT) + API lookup | stdlib Python |
| alert-log | Pencatat alert Telegram keluar (observability) | stdlib Python |
| dashboard | UI monitoring (gaya Wazuh) | Next.js |
| VirusTotal API | Reputasi hash (70+ antivirus) | v3 |
| MalwareBazaar API | Sumber intel kedua untuk malware | v1 |
| AlienVault OTX | Fallback saat VirusTotal rate-limit | v1 |
| Google Safe Browsing | Reputasi URL phishing | v4 |
| URLScan.io | Analisis dan verdict URL | v1 |
| LLM | Ringkasan dan rekomendasi Bahasa Indonesia (provider dapat ditukar) | - |
| Telegram Bot | Kanal notifikasi dan antarmuka keputusan dua arah | - |
Agent memantau filesystem; setiap hash diperiksa ke sumber intel, dan keputusan mengikuti verdict — bukan sekadar "ada berkas baru".
| Verdict | Severity | Tindakan |
|---|---|---|
Deteksi tinggi (malicious >= 20) atau MB + malicious >= 5 |
KRITIS | Karantina otomatis + notifikasi |
Terdeteksi (malicious >= 5), atau dikenali MalwareBazaar/OTX |
TINGGI | Tombol Telegram, analis memutuskan |
Indikator lemah (malicious 1-4/suspicious) atau eksekutabel dengan hash belum dikenal |
SEDANG / PERLU REVIEW | Info silent, tanpa tombol |
| Tanpa indikator apa pun (VT 0/404, MB/OTX kosong) | INFO | Media/dokumen jinak tidak dinotifikasi; selebihnya info silent |
| Verdict | Severity | Tindakan |
|---|---|---|
| GSB atau URLScan mendeteksi jahat | BERBAHAYA | Auto-sinkhole domain (0.0.0.0 di /etc/hosts) |
| Skor mencurigakan | MENCURIGAKAN | Tombol Telegram, analis memutuskan |
| Sumber tak bisa diverifikasi (rate-limit/error) | PERLU VERIFIKASI | Eskalasi ke analis — tidak diklaim aman |
| Bersih | AMAN | Tidak ada aksi |
- Filter noise pra-scan — berkas sementara (
*.part,*.crdownload), berkas 0-byte, dan eventdeletedakibat karantina tidak diproses. - Cache verdict per hash — TTL diferensial: malicious 7 hari, bersih 24 jam, tidak dikenal 6 jam (verdict bersih cepat di-refresh agar deteksi tidak basi). Cache berbasis hash, sehingga burst 100 PC dengan malware sama hanya memanggil VirusTotal sekali.
- Dedup claim-check — alert identik dalam 5 menit tidak diproses dua kali (fail-open: dedup rusak tidak boleh mematikan deteksi).
- Fallback bertingkat — 429/error VirusTotal dialihkan ke OTX; deteksi tinggi tetap dinaikkan.
# 1. Server — bootstrap satu perintah (idempoten: .env, sertifikat Wazuh,
# compose up, integrasi, sinkron credential + workflow n8n)
bash deploy/setup-server.sh
# 2. Workstation — pilih salah satu jalur
sudo apt install ./soar-agent_0.3.0_amd64.deb # Linux, via .deb
sudo install -d -m 700 /etc/soar-agent
sudo bash -c 'umask 077; read -rsp "Poll token: " t; printf "%s\\n" "$t" > /etc/soar-agent/fleet.token'
sudo AGENT_ID=004 AGENT_NAME=laptop-budi FLEET_AGENT_POLL_TOKEN=... bash deploy/agent-install.sh
ansible-playbook -i deploy/ansible/inventory-agents.ini \
deploy/ansible/deploy-agents.yml # rollout fleet
powershell -File deploy/install-agent-windows.ps1 # set BINARY_URL HTTPS + SOAR_FLEET_POLL_TOKEN
# Inventory Ansible: salin `deploy/ansible/inventory-agents.ini.example`
# lalu isi daftar host dan agent_id-nya.
# 3. Verifikasi pipeline malware (EICAR) — notifikasi Telegram dalam 15-30 detik
printf '%s' 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' \
> ~/Downloads/eicar-test.com
# 4. Verifikasi pipeline phishing
bash scripts/test-phishing.sh "https://www.google.com/" # hasil: AMANKonfigurasi: salin
.env.exampleke.envdan isi API key;deploy/n8n-setup.pymendaftarkannya sebagai credential n8n (ID credential di-remap by name, jadi tidak ada node merah setelah import).FLEET_COMMAND_TOKENdanFLEET_AGENT_POLL_TOKENS_JSONwajib diisi sebelum fleet-monitor menerima command atau agent memollnya.DASHBOARD_LOGIN_TOKENdipakai saat browser meminta sesi dashboard sebelum mengirim command.Active Response phishing:
sudo bash scripts/deploy-block-domain.sh(sekali).
| Cara | Alamat | Catatan |
|---|---|---|
| Dashboard web | http://127.0.0.1:3000 |
GUI utama (UI bergaya Wazuh): status agent, severity, event, detail agent |
| API monitoring | http://<server>:8080 |
/api/fleet, /api/events, /api/events/history, /api/scan-results, /api/vt-cache |
| TUI terminal | python3 scripts/fleet-tui.py |
Kembaran dashboard untuk sesi SSH (stdlib curses) |
Dashboard menyimpan event secara durable (SQLite) dan bisa menampilkan riwayat per periode (24 jam / 7 / 30 / 90 hari, atau rentang custom) di semua view event, menggabungkan event pipeline SOAR dengan arsip alert Wazuh Indexer (wazuh-alerts-*). Endpoint: GET /api/events/history?since=&until=&source=all|soar|wazuh.
Filter severity, agent, dan pencarian diproses di Wazuh Indexer, bukan setelah mengambil 1.000 dokumen terbaru, sehingga alert lama tetap ditemukan. Statistik memakai aggregasi indexer. Daftar event masih dibatasi 1.000 per query; UI menampilkan jumlah yang cocok saat batas itu tercapai.
Fleet saat ini (bertambah sampai 100 workstation):
| ID | Host | OS |
|---|---|---|
| 000 | wazuh.manager | Server (manager) |
| 001 | ideapc | Windows |
| 002 | bali-handmade | Windows |
| 003 | toshiba-bapak | Windows |
| 008 | macbook | macOS |
| 009 | nixbox | Linux (NixOS) |
| 010 | ravi-debian | Linux (Debian 13) |
soar-project/
├── docker-compose.yml # n8n, fleet-monitor, dashboard, health-monitor, poller
├── wazuh-docker/single-node/ # Wazuh manager + indexer + dashboard (upstream)
├── agent-rs/ # soar-agent (Rust): FIM, hash, karantina, scan on-demand
├── dashboard/ # Dashboard web (Next.js, gaya Wazuh)
├── deploy/
│ ├── setup-server.sh # Bootstrap server satu perintah (idempoten)
│ ├── n8n-setup.py # Sinkron credential + import workflow via API
│ ├── agent-install.sh # Pemasangan agent satu host (Linux)
│ ├── install-agent-windows.ps1 # Pemasangan agent Windows
│ ├── ansible/ # Rollout fleet N host + verifikasi heartbeat
│ ├── nixos/ # Modul NixOS untuk agent
│ └── hardened/ # Caddy TLS + basic-auth (opsional)
├── scripts/
│ ├── fleet-monitor.py # API monitoring + cache verdict + command queue
│ ├── fleet-tui.py # Dashboard terminal
│ ├── health-monitor.py # Self-aware health (alert saat status berubah)
│ ├── custom-n8n.py # Jembatan integratord Wazuh ke webhook n8n
│ ├── tg-callback-poller.py # Long-poll Telegram ke n8n (aman di balik NAT)
│ ├── quarantine-file, block-domain # Active Response
│ ├── patch-n8n-*.py # Patch workflow live via API (idempoten + backup)
│ └── process-chain-rules.xml, phishing-rule.xml
├── config/wazuh/ # Konfigurasi permanen manager + agent
├── n8n-workflows/ # Snapshot workflow (lihat catatan di bawah)
└── docs/ # Arsitektur, alur, deployment, panduan, laporan, diagrams/
Catatan workflow: sumber kebenaran adalah workflow live di n8n. Berkas di
n8n-workflows/adalah snapshot historis — workflow live sudah berkembang (cabang rantai proses, dedup, cache verdict, ensemble MalwareBazaar, OTX). Perubahan dilakukan lewatscripts/patch-n8n-*.py(idempoten, menyimpan backup), bukan import ulang berkas.
| Layanan | URL |
|---|---|
| Dashboard SOAR | http://127.0.0.1:3000 |
| API fleet / monitoring | http://<server>:8080 |
| n8n editor | http://<server>:5678 |
| Webhook malware | http://<server>:5678/webhook/wazuh-alert |
| Webhook phishing | http://<server>:5678/webhook/wazuh-phishing |
| Webhook callback Telegram | http://<server>:5678/webhook/tg-callback |
| Wazuh Dashboard | https://<server>:443 |
| Wazuh API | https://<server>:55000 |
| Wazuh Indexer | https://<server>:9200 |
- Tidak ada kredensial hardcode: rahasia disimpan di
.env(gitignored) dan credential n8n terenkripsi;.env.examplehanya berisi placeholder. backups/memuat snapshot lokal workflow dan diabaikan git (jangan di-commit).- Active Response untuk kasus ambigu memerlukan persetujuan analis, sehingga tidak terjadi isolasi atau blokir buta; karantina berkas dapat dikembalikan.
- Agent hanya mengirim metadata + hash — isi berkas tidak meninggalkan endpoint.
Proyek akademik open-source. Tiap komponen tunduk pada lisensinya masing-masing: Wazuh (GPLv2), n8n (Sustainable Use License), soar-agent Rust (GPL-2.0).
Dibuat untuk Tugas Akhir oleh Ravi Arnan Irianto, Teknologi Informasi, Universitas Udayana.
