EasySIEM โ€” a self-hosted SIEM built on SigmaHQ, OpenSearch & Grafana

2,600+ community detection rules, a lightweight Go ingestion pipeline, and dashboards that actually load fast โ€” installed as real services (Windows service / Scheduled Task, or systemd on Linux), not a pile of scripts you have to remember to restart.

Windows ยท Windows Server ยท agents for Windows & Linux endpoints
EasySIEM's Overview dashboard in Grafana: Alerts (24h) and Critical/High Alerts gauges both showing high counts in red, an Active Agents gauge in green, an Events Ingested gauge in blue, and an Alerts Over Time by Severity chart with a Top Triggered Rules table below
What this is

Detection rules you didn't have to write, running on infrastructure you actually control

EasySIEM wires together the pieces of a real SIEM โ€” log collection, storage, detection, and visualization โ€” using SigmaHQ's open, vendor-neutral rule set instead of a proprietary rules language, and OpenSearch/Grafana instead of a SaaS bill.

Custom Go agents on Windows and Linux endpoints ship Event Log, Sysmon, journald, and auditd data over HTTPS to a small ingestion API, which authenticates each agent by its own API key and writes into OpenSearch. A detection engine converts SigmaHQ rules into OpenSearch queries with pySigma and runs them on a schedule, so hits show up as alerts โ€” not just raw logs โ€” in Grafana.

Everything server-side installs as a proper Windows service/Scheduled Task or a systemd unit on Linux, not a console window you have to keep open. And every component โ€” the agents, the ingestion API, the TLS cert generator โ€” is a plain Go binary calling documented OS APIs, which is also why it doesn't trip Windows Defender's heuristics the way a packed, obfuscated tool would. More on that below.

How it fits together

Architecture

One ingestion path in, three consumers out: real-time detection, dashboards, and live log search.

Windows agent Event Log ยท Sysmon Linux agent journald ยท auditd Suricata network IDS (optional) ingest-api Go ยท HTTPS ยท API keys OpenSearch events-* ยท alerts-* detect-engine Sigma โ†’ OpenSearch DSL Grafana dashboards Loki raw logs ยท LogQL (optional) HTTPS eve.json
Why it's built this way

What you get

๐Ÿงฉ

2,600+ SigmaHQ rules

Windows and Linux detection rules converted to real OpenSearch queries via pySigma โ€” no hand-written detections to maintain.

๐Ÿ›ก๏ธ

Defender-friendly by design

Plain Go binaries calling documented OS APIs โ€” no packing, no obfuscation, no process injection. Official signed tools (Sysmon, OpenSearch, Grafana) everywhere else.

โš™๏ธ

Real services, not scripts

ingest-api installs as a native Windows service (or systemd unit on Linux); the detect-engine runs as a Scheduled Task (or its own systemd unit). Nothing depends on a console window staying open.

๐Ÿ“Š

Dashboards that load

An Overview dashboard with KPI gauges, plus dedicated Events, Alerts, and Agent Health views โ€” provisioned automatically, not built by hand.

๐Ÿ””

Alerting, provisioned

Three Grafana alert rules ship out of the box, split by severity (critical/high, medium, low/informational) โ€” firing detections show up under Alerting > Active notifications with zero setup; wire in email/Slack/webhook delivery whenever you're ready.

๐Ÿ”‘

Per-agent authentication

Every agent gets its own bearer API key over TLS. One compromised agent can't spoof another's identity โ€” ingest-api stamps identity server-side.

๐Ÿง

Windows + Linux agents

One small Go codebase, cross-compiled for both platforms, shipping to the same ingestion pipeline with a shared event schema.

๐Ÿ”

Live log search (optional)

Add Loki and ingest-api dual-writes every event there as a raw log line โ€” live-tail and LogQL-search in Grafana's Explore view, right alongside the dashboards.

๐Ÿ“ก

Network detection (optional)

Add Suricata and it runs Snort/Emerging-Threats-syntax rules against live traffic itself โ€” its alerts land in the same Grafana Alerts dashboard as Sigma's host-based detections.

๐Ÿ“ˆ

Server health (optional)

Add Prometheus + windows_exporter (or node_exporter on Linux) and a provisioned "Server Health" dashboard shows the SIEM box's own CPU, memory, disk, and network โ€” is the SIEM itself healthy, not just what it's watching.

๐Ÿ”—

Request tracing (optional)

Add Tempo and ingest-api (instrumented with OpenTelemetry) emits a span per event batch โ€” HTTP handling plus the OpenSearch/Loki calls it makes โ€” browsable in Grafana's Explore > Traces.

๐Ÿงฑ

OPNsense agent

A FreeBSD pkg(8) package ships pf firewall filter log and Suricata alerts to the same pipeline โ€” verified end-to-end against a real OPNsense box.

๐Ÿ“ถ

OpenWRT agent (experimental)

An opkg package (arm64/mipsle/arm) ships OpenWRT's logread system log and Suricata alerts โ€” built and unit-tested, but not yet verified against a real router.

Get running

Installation

Two ways to get the server running โ€” pick one.

Download EasySiemSetup.exe

Grab it from the Download section below.

Run it as Administrator

It needs admin rights to register the ingest-api Windows service and the detect-engine's Scheduled Task.

Pick your optional components

  • OpenSearch โ€” downloads ~450 MB from opensearch.org, skipped if already installed
  • Grafana โ€” installs with the provisioned dashboards and alert rules already wired up, and a self-signed cert enabling HTTPS out of the box (your browser will warn once); you'll be asked for an admin password instead of the default
  • Loki โ€” optional, for live log search/LogQL in Grafana's Explore view alongside the dashboards
  • Prometheus โ€” installs Prometheus + windows_exporter together, already scraping and wired to the provisioned Server Health dashboard (CPU/memory/disk/network for this box)
  • Tempo โ€” request tracing for ingest-api (instrumented with OpenTelemetry); tempo_url is wired into config.json automatically, browsable in Grafana's Explore > Traces
  • Sysmon โ€” only if this same box is also a monitored endpoint
  • Suricata โ€” network IDS, runs Snort/ET-syntax rules against live traffic; only if this box is also a monitored endpoint. Needs one manual click-through for Npcap (its free edition has no silent installer) โ€” a setup window will appear
  • windows-agent โ€” installs and fully configures the agent on this same box for self-monitoring, wired to the starter API key (and Suricata's eve.json too, if that's also checked) โ€” no manual agent.json editing
  • Open Windows Firewall โ€” TCP 8443 for ingest-api.exe only; needed for agents on other machines to reach this server (not needed for the windows-agent checkbox above, which talks to itself over localhost)

Grab your API key

The installer generates a TLS cert and a starter API key automatically, and writes both โ€” plus next steps โ€” to GETTING-STARTED.txt in the install directory. For more keys later, the installer also drops genkey.exe at C:\Program Files\EasySIEM\bin\genkey.exe โ€” see the callout below.

Open Grafana

https://localhost:3000 on the server itself โ€” it opens straight to the Overview dashboard.

Need a key for another agent later? One line, from an elevated PowerShell prompt on the server:
C:\Program Files\EasySIEM\bin\genkey.exe -agent-id windows-02 -os windows -restart

Generates the key, wires it into config.json's api_keys directly, and restarts EasySiemIngestApi so it's live โ€” no manual JSON editing. Swap -os windows for -os linux when the new agent is a Linux box instead; genkey just records it for the Agent Health dashboard. -agent-id can be whatever you want โ€” any string, no format restrictions.

Deploying agents from other machines? Check the "Open Windows Firewall" box in step 3 above โ€” unchecked by default, since opening an inbound port is a real choice, not something to enable silently. Skip it if every agent runs on the server box itself (the "monitor this box too" checkbox); only remote agents need it. It scopes the rule to exactly ingest-api.exe on exactly TCP 8443, nothing broader.

Already installed without checking that box? Windows Firewall ships with inbound rules for ingest-api.exe from earlier builds already, but they're scoped to specific binary paths, not wherever your install actually landed, so add one yourself:

New-NetFirewallRule -DisplayName "EasySIEM ingest-api" -Direction Inbound `
    -Program "C:\Program Files\EasySIEM\bin\ingest-api.exe" -Protocol TCP `
    -LocalPort 8443 -Action Allow -Profile Any

Run that in an elevated PowerShell prompt on the server (adjust the path if you installed somewhere other than the default). Confirm it worked from another machine on the network: curl -k https://<server-hostname>:8443/v1/health should return ok almost instantly; if it hangs for several seconds and then fails, that's the firewall.

Prerequisites

winget install -e --id GoLang.Go
winget install -e --id Python.Python.3.12

Install OpenSearch and Grafana

.\scripts\install-opensearch.ps1
.\scripts\apply-index-templates.ps1
# from an elevated prompt:
.\scripts\install-grafana.ps1

Build and run ingest-api

go build -o bin\ingest-api.exe .\server\ingest
go build -o bin\gencert.exe .\tools\gencert
.\bin\gencert.exe -out-cert server\ingest\certs\server.crt -out-key server\ingest\certs\server.key -hosts localhost,127.0.0.1
# copy config.json.example to config.json, add an API key, then:
.\bin\ingest-api.exe -config server\ingest\config.json

Convert Sigma rules and run detections

git clone --depth 1 https://github.com/SigmaHQ/sigma.git rules\sigma
cd server\detect
python -m venv venv
.\venv\Scripts\pip install sigma-cli pysigma-backend-opensearch pysigma-pipeline-sysmon requests
.\venv\Scripts\python convert_rules.py
.\venv\Scripts\python run_detections.py

Build and deploy an agent

go build -o bin\windows-agent.exe .\agents\windows
# or, for a Linux endpoint:
$env:GOOS="linux"; go build -o bin\linux-agent .\agents\linux

Full walkthrough โ€” including Sysmon setup and agent config โ€” is in docs/SETUP.md in the source download. Prefer a wizard over hand-editing agent.json? See Windows Agent / Linux Agent below for the dedicated installers instead.

A note on Windows Defender: a brand-new, unsigned .exe โ€” ours included โ€” will sometimes trigger a first-run SmartScreen prompt or a brief scan delay. That's normal, and not something this project tries to evade: every component is a plain binary calling documented APIs. See docs/DEFENDER.md in the source download for exclusion commands and code-signing notes if you want to remove the prompt entirely.
For endpoints

Windows Agent

A standalone installer for Windows boxes you want monitored โ€” separate from the server installer above, and separate from its "monitor this box too" checkbox (that one's for the server machine itself; this one's for deploying to other Windows endpoints). Asks for the server hostname and API key right in the wizard.

Download and run as Administrator

Grab it from the Download section below.

Enter your server's hostname and API key

Find both in the server's GETTING-STARTED.txt, or generate a fresh key on the server itself with genkey โ€” bin\genkey.exe on a Windows server, easysiem-genkey on a Linux one โ€” which wires it into the server's config.json directly, no manual editing. The agent ID defaults to this machine's computer name.

Browse to the server's certificate (recommended)

Copy server.crt from the server's C:\Program Files\EasySIEM\server\ingest\certs\ to this machine first, then browse to it in the wizard. Leave it blank instead to skip TLS verification โ€” fine for a quick lab test, not for anything beyond one.

Optionally install Sysmon too

A checkbox on the same page โ€” recommended, since windows-agent needs it for process/network telemetry beyond the Security/System/PowerShell logs alone.

That's it โ€” finishing the wizard writes agent.json, copies the certificate, and registers windows-agent.exe as a Scheduled Task (EasySiemWindowsAgent, runs at startup as SYSTEM โ€” also what lets it read the Security event log). Re-run the installer to reconnect this box to a different server or change its key.
Agent won't connect? Check the server's Windows Firewall first โ€” see the firewall note under Install above. It's the most common reason a freshly-installed agent just sits there retrying.
For Linux hosts

Linux Server

Prefer to run the backend on Linux instead of Windows? A .deb installs ingest-api and the detect-engine as systemd services, running as a dedicated unprivileged account rather than root. It does not include OpenSearch, Grafana, Loki, Prometheus, or Tempo โ€” all five already have official Debian/Ubuntu packages, so this doesn't try to duplicate them.

Install OpenSearch and Grafana first

From their own official packages: OpenSearch for Debian and Grafana for Debian.

Download and install the server package

wget https://easysiem.com/downloads/easysiem-server_1.0.0_amd64.deb
sudo apt install ./easysiem-server_1.0.0_amd64.deb

Generates a TLS cert and a starter API key, writes a working config, and starts both services automatically โ€” the key is printed at the end of the install (and saved in /etc/easysiem-server/ingest-config.json).

Apply the OpenSearch index templates

sudo /usr/share/easysiem-server/apply-index-templates.sh

Wire up Grafana

sudo grafana-cli plugins install grafana-opensearch-datasource
sudo cp /etc/easysiem-server/grafana-provisioning/datasources/opensearch.yml \
    /etc/grafana/provisioning/datasources/
sudo cp -r /etc/easysiem-server/grafana-provisioning/dashboards/* \
    /etc/grafana/provisioning/dashboards/
sudo mkdir -p /etc/grafana/provisioning/alerting
sudo cp /etc/easysiem-server/grafana-provisioning/alerting/siem-alerts.yaml \
    /etc/grafana/provisioning/alerting/
sudo systemctl restart grafana-server

That last file provisions three Grafana alert rules split by severity (critical/high, medium, low/informational) โ€” firing detections show up under Alerting > Active notifications in Grafana's own UI. No delivery is configured yet; point the default notification policy at a real contact point (Alerting > Notification policies) to add email/Slack/webhook.

Connect an agent

Give it the printed API key, a copy of /var/lib/easysiem-server/certs/server.crt, and server_url: https://<this-host>:8443. See Linux Agent below, or build the Windows agent from source. Need a key for another agent later? sudo easysiem-genkey -agent-id linux-02 -os linux -restart โ€” one line, already installed by this package. -agent-id can be whatever you want โ€” any string, no format restrictions.

Runs as a dedicated unprivileged easysiem-server account, not root โ€” unlike the agent, neither service needs any special system access. sudo apt remove easysiem-server keeps your config and data; apt purge removes those and the dedicated account too. Full docs, including how to add more agent keys: /usr/share/doc/easysiem-server/README.md.
Want live log search too? Install Loki (bind it to 127.0.0.1 only โ€” it has no built-in auth), copy /etc/easysiem-server/grafana-provisioning/datasources/loki.yml into Grafana's provisioning, and add "loki_url": "http://localhost:3100" to ingest-config.json. Full steps in the README.
Want the Server Health dashboard too? sudo apt install prometheus prometheus-node-exporter โ€” both are in Debian/Ubuntu's own repos, no third-party repo needed. Add a node_exporter scrape job to /etc/prometheus/prometheus.yml, then copy /etc/easysiem-server/grafana-provisioning/datasources/prometheus.yml into Grafana's provisioning. Full steps in the README.
Want request tracing too? sudo apt install tempo โ€” same Grafana apt repo as Loki. Add "tempo_url": "http://localhost:4318" to ingest-config.json and copy /etc/easysiem-server/grafana-provisioning/datasources/tempo.yml into Grafana's provisioning โ€” traces show up in Explore > Traces. Full steps in the README.
For endpoints

Linux Agent

A .deb package for Debian/Ubuntu boxes you want monitored. Ships journald and auditd events to an EasySIEM server that's already running โ€” see Install above if you haven't set that up yet.

Download and install โ€” you'll be asked three questions

wget https://easysiem.com/downloads/easysiem-agent_1.0.0_amd64.deb
sudo apt install ./easysiem-agent_1.0.0_amd64.deb

The package uses debconf, so the install itself prompts you right there in the terminal for the server hostname or IP, the API key (from the server's GETTING-STARTED.txt, or generated fresh with easysiem-genkey on the server, wired into config.json automatically; masked while typing), and a path to the server's server.crt you've copied over beforehand (leave blank to skip TLS verification instead โ€” fine for a quick lab test). Answer all three and it writes the config, copies the cert, and starts easysiem-agent automatically โ€” nothing left to do.

Confirm it's running

sudo systemctl status easysiem-agent
journalctl -u easysiem-agent -f
Need an API key? Run this on the server (not this agent box) โ€” one line:
sudo easysiem-genkey -agent-id linux-02 -os linux -restart

Generates the key, wires it into config.json's api_keys directly, and restarts easysiem-ingest so it's live โ€” no manual JSON editing.

Left the prompts blank, or installed non-interactively? The package still installs, just not started โ€” configure it by hand instead: sudo cp /etc/easysiem/agent.json.example /etc/easysiem/agent.json, edit it, then sudo systemctl enable --now easysiem-agent. To change already-saved answers: remove /etc/easysiem/agent.json first, then sudo dpkg-reconfigure easysiem-agent (it won't overwrite an existing config on its own โ€” an upgrade shouldn't silently clobber hand edits).
Agent won't connect? If the server is Windows, check its Windows Firewall first โ€” see the firewall note under Install above. Journal it with journalctl -u easysiem-agent -f; a connection that hangs for several seconds and then times out (rather than failing instantly, or an immediate 401) points at the firewall specifically, not a bad hostname or key.
Runs as root by default โ€” it needs read access to /var/log/audit/audit.log (usually root:adm 0640) and the full journald stream. The systemd unit has a commented-out User=/Group= for running it as a dedicated account instead (needs adm + systemd-journal group membership) โ€” see SECURITY.md in the package's /usr/share/doc/easysiem-agent/. sudo apt remove easysiem-agent keeps your config; apt purge removes it too.
Want network detection too? Install Suricata from its official Ubuntu PPA/Debian package (ppa:oisf/suricata-stable on Ubuntu), point it at your interface, run suricata-update for the free ET Open ruleset, then set "suricata_eve_path": "/var/log/suricata/eve.json" in agent.json โ€” its alerts land in the same Grafana Alerts dashboard as Sigma's. Full steps in the README.
For endpoints

OPNsense Agent

A FreeBSD pkg(8) package for OPNsense firewalls. Ships the pf firewall filter log and, if the os-suricata plugin is installed, Suricata IDS/IPS alerts, to an EasySIEM server that's already running โ€” see Install above if you haven't set that up yet.

Download and install

fetch https://easysiem.com/downloads/easysiem-opnsense-agent-1.0.0.txz
pkg add easysiem-opnsense-agent-1.0.0.txz

fetch is FreeBSD's built-in downloader (part of the base system, no install needed) โ€” run both from the OPNsense console or an SSH session.

Configure

cp /usr/local/etc/easysiem/agent.json.example /usr/local/etc/easysiem/agent.json

Edit agent.json: server_url, an api_key (generate one with genkey on the server โ€” see the callouts under Install above), agent_id (any string), and either ca_cert_path pointing at a copy of the server's server.crt or insecure_skip_verify: true for a quick lab test. Set filterlog_path if your OPNsense version keeps the pf log somewhere other than the default /var/log/filter/latest.log, and suricata_eve_path if the os-suricata plugin is installed.

Enable and start

sysrc easysiem_opnsense_enable=YES
service easysiem_opnsense start
Runs as root by default โ€” reading the pf filter log (and Suricata's eve.json, if configured) needs it. See SECURITY.md in the package's docs.
For endpoints

OpenWRT Agent

An opkg package for OpenWRT routers. Ships the system log (logread โ€” firewall drop/accept lines included, if firewall logging is enabled) and, if installed, Suricata IDS/IPS alerts, to an EasySIEM server that's already running โ€” see Install above if you haven't set that up yet.

Check your architecture, then download and install

opkg print-architecture

Match the output against one of the three builds below (generic aarch64/mipsel_24kc/arm_cortex-a7 โ€” if none match, see the package README for building your own or using the raw binary directly).

wget https://easysiem.com/downloads/easysiem-openwrt-agent_1.0.0_aarch64_generic.ipk
opkg install easysiem-openwrt-agent_1.0.0_aarch64_generic.ipk

Most current OpenWRT builds' BusyBox wget handles HTTPS fine; if yours errors on the certificate, opkg install wget-ssl first, or download the file elsewhere and scp it over instead.

Configure

cp /etc/easysiem/agent.json.example /etc/easysiem/agent.json

Edit agent.json: server_url, an api_key (generate one with genkey on the server โ€” see the callouts under Install above), agent_id (any string), and either ca_cert_path pointing at a copy of the server's server.crt or insecure_skip_verify: true for a quick lab test. Set suricata_eve_path if you've installed Suricata via opkg yourself.

Enable and start

/etc/init.d/easysiem-openwrt-agent enable
/etc/init.d/easysiem-openwrt-agent start
Runs as root by default โ€” logread and Suricata's eve.json (if configured) both need it. The static binary is roughly 6.5โ€“7.9 MB depending on architecture โ€” fine for most current routers (128 MB+ flash is common), worth checking df -h / first on anything older/smaller.
Get it

Download

๐ŸชŸ

EasySiemSetup.exe

Windows installer ยท ~17 MB

Installs ingest-api as a Windows service and the detect-engine as a Scheduled Task, with optional OpenSearch, Grafana, and Sysmon components. Requires Administrator.

โฌ‡ Download installer
๐ŸชŸ

EasySiemWindowsAgentSetup.exe

Windows installer ยท ~7.5 MB

Deploy the agent to other Windows endpoints โ€” asks for the server hostname, API key, and certificate right in the wizard. See Windows Agent above. Requires Administrator.

โฌ‡ Download installer
๐Ÿง

easysiem-server.deb

Debian/Ubuntu ยท amd64

ingest-api + the detect-engine as systemd services (not OpenSearch/Grafana โ€” see Linux Server above). Runs as a dedicated unprivileged account.

โฌ‡ Download .deb
๐Ÿง

easysiem-agent.deb

Debian/Ubuntu ยท amd64

The Linux agent as a systemd service โ€” ships journald and auditd events to an EasySIEM server. See Linux Agent above for setup.

โฌ‡ Download .deb
๐Ÿงฑ

easysiem-opnsense-agent.txz

FreeBSD pkg(8) ยท amd64

The OPNsense agent as a FreeBSD package โ€” ships pf firewall filter log and Suricata alerts. See OPNsense Agent above for setup.

โฌ‡ Download .txz
๐Ÿ“ถ

easysiem-openwrt-agent.ipk

OpenWRT opkg ยท 3 architectures ยท experimental

The OpenWRT agent as an opkg package โ€” ships the system log (logread) and Suricata alerts. Pick the architecture matching your router (check opkg print-architecture if unsure). See OpenWRT Agent above for setup.

โฌ‡ arm64 โฌ‡ mipsle โฌ‡ arm
๐Ÿ“ฆ

Source code

.zip ยท full repo

Agents, ingest-api, the detect-engine, install scripts, and full docs (SETUP.md, DEFENDER.md, SECURITY.md) โ€” for building agents yourself or customizing the server.

โฌ‡ Download source