detection rules
after tuning
indexed
dashboards
A production-grade home Security Operations Center built on a Raspberry Pi Zero 2 W. Suricata IDS runs on the Pi, monitoring all network traffic and generating structured EVE JSON logs. Those logs are forwarded via rsyslog over TCP to a Splunk Enterprise instance running on a Windows PC, where custom dashboards surface alerts, DNS queries, suspicious IPs, and protocol anomalies in real time.
This lab produced a real documented detection — a PowerShell-based fileless attack caught and contained in 42 minutes. See the Incident Response writeup →
"Real detections from a $15 Pi. The SOC doesn't need to be enterprise-grade to catch real threats — it needs to be tuned, monitored, and correlated."
Wazuh Rule 91816 fired on WIN-LAB-01 at 14:23:17 EST. Encoded PowerShell execution detected — IEX download chain plus schtasks persistence, all obfuscated in Base64. Suricata simultaneously caught the C2 callback attempt over HTTP to 185.220.101.42 (AbuseIPDB: 100/100). The SOC saw both signals before the attacker could establish a foothold.
Six phases from bare hardware to a production-ready detection pipeline.
suricata-update — 30,000+ rules covering malware C2, exploits, and protocol anomalies.suricata.yaml for EVE JSON logging on eth0. Enable all event types: alert, HTTP, DNS, TLS, SSH, flow. Structured JSON makes Splunk ingestion seamless — no parsing required.imfile module to tail /var/log/suricata/eve.json and forward each line over TCP to the Windows PC. inotify mode ensures sub-second forwarding latency.suricata index in Splunk, configure TCP input on port 1514 with source type _json. Build 6 dashboards surfacing alert distribution, top signatures, DNS analysis, HTTP traffic, suspicious IPs, and protocol breakdown.threshold.conf. Over 3 weeks, daily alert volume dropped from ~120 to ~72 — leaving only actionable signals.sudo apt update && sudo apt full-upgrade -y sudo apt install -y vim htop net-tools tcpdump curl # Set static IP via nmtui then verify: ip -4 addr show eth0
sudo add-apt-repository ppa:oisf/suricata-stable sudo apt install suricata -y suricata --build-info | grep "Suricata version" sudo suricata-update # pull ET Open rules
/etc/suricata/suricata.yaml to enable EVE JSON and set the monitored interface.# In suricata.yaml:
af-packet:
- interface: eth0
cluster-id: 99
cluster-type: cluster_flow
outputs:
- eve-log:
enabled: yes
filetype: regular
filename: /var/log/suricata/eve.json
types:
- alert
- http
- dns
- tls
- ssh
- flow
sudo systemctl restart suricata
sudo tail -f /var/log/suricata/eve.json
/etc/rsyslog.d/30-suricata.conf:module(load="imfile" Mode="inotify")
input(type="imfile"
File="/var/log/suricata/eve.json"
Tag="suricata"
Severity="notice"
Facility="local6")
local6.* @@10.0.0.XXX:1514 # Windows PC IP
sudo systemctl restart rsyslog
# Test connectivity:
echo "test" | nc -w1 10.0.0.XXX 1514
- Port: 1514
- Source type:
_json - Index:
suricata(create new)
# Verify data is arriving: index=suricata | head 5 | table _time, event_type, alert.signature
# Example: suppress noisy rule for known scanner # In /etc/suricata/threshold.conf: suppress gen_id 1, sig_id 2013028, track by_src, ip 10.0.0.0/24
Six custom dashboards built to surface different layers of the network picture: