Most security appliances detect attacks. Far fewer can prove they did — in a way an auditor will accept months or years later. Regulations like the EU's NIS2 Directive (Article 21), SOC 2, ISO 27001 and Cyber Essentials all require evidence that is signed, timestamped against a trusted time source, and tamper-evident.
The Defend-O-Tron records that evidence continuously while it protects your network. Every day, the device signs a manifest of the day's logs with an Ed25519 key anchored to NTP-attested time. When an auditor asks for proof, you produce a single signed ZIP covering whatever period they ask about — events, threat decisions, configuration snapshot, NTP attestation, and the daily chain of signed manifests, all in one package.
This is the kind of capability you'd typically pay extra for as a SIEM add-on on Cisco, Fortinet or Sophos. On the Defend-O-Tron it's built in and runs automatically.
The audit subsystem aggregates evidence from every defense component on the device:
Every event is timestamped against the device's NTP-attested clock. The daily manifest hashes every log file the device ships and signs the hash list, so any tampering after-the-fact is detectable.
The Defend-O-Tron ships a pre-built Grafana dashboard that summarizes the audit evidence in real time. It's titled NIS2 Evidence Pack and reads from a read-only snapshot of the audit event store — so your auditor can sit beside you and watch the same numbers go in.
Where to find it:

What you'll see, top to bottom:
When an auditor asks for evidence covering a period — say last quarter — you produce a single signed ZIP with the do-audit-report command from the admin terminal.
The admin terminal is built into the Cockpit interface — open the admin web UI, click Tools → Terminal, then enter the command below. You do not need to SSH separately.
sudo do-audit-report --from 2026-04-01 --to 2026-06-30 --out /home/admin/q2-evidence.zip
--from and --to are inclusive UTC dates in YYYY-MM-DD format.--out is the destination path. If you omit it, the ZIP is written next to where you ran the command and named defend-o-tron-audit-FROM-to-TO.zip.Useful flags:
--no-pdf — skip the rendered PDF of the NIS2 dashboard. Use this if grafana-image-renderer isn't deployed on your fleet (it's optional).--no-config-snapshot — skip the configuration archive. Useful if your auditor only needs the events.| File | What it is |
|---|---|
events.csv |
Every IDS event in the period |
decisions.csv |
Every CrowdSec decision in the period |
dns_events.csv / file_events.csv / tls_events.csv |
Phase 6 ransomware indicators (audit-deb 1.3.0+) |
config-snapshot.tar.gz |
The device's Suricata, CrowdSec, nftables, ulogd, chrony, and node-exporter configuration as it was at report time |
manifests/MANIFEST-YYYY-MM-DD.json |
The daily signed manifest for every day in the period (the chain-of-custody anchor) |
chrony-logs/ |
NTP attestation — proof the device clock was disciplined |
report.pdf (optional) |
Rendered snapshot of the NIS2 dashboard |
manifest.pubring.json |
The device's signing-key ring, so the auditor can verify everything offline |
chain-of-custody.json |
Ed25519-signed SHA-256 manifest of every other file in the ZIP |
The ZIP itself is written with mode 0640, root-owned. It's safe to copy to a USB drive, attach to a ticket, or upload to your compliance portal.
Anyone with the ZIP can verify it — your auditor doesn't need access to the device. The signing-key ring travels inside the ZIP, so verification works completely offline.
From an extracted ZIP, on any Linux system with Python 3 and the cryptography package, run:
do-audit-verify manifests/MANIFEST-2026-04-15.json
What success looks like:
signature OK (Y8nM3R9...)
files: 142 listed, 0 mismatched, 0 missing
What a tampered manifest looks like:
BAD signature on manifests/MANIFEST-2026-04-15.json (key Y8nM3R9...)
What a tampered log file looks like:
signature OK (Y8nM3R9...)
MISMATCH /var/log/suricata/eve-ids-2026-04-15.json
files: 142 listed, 1 mismatched, 0 missing
Useful flags:
--skip-files — verify the signature only, skip the per-file re-hashing. Faster for spot checks.--pubring /path/to/manifest.pubring.json — verify against the pubring shipped inside this ZIP instead of the one on a live device. Auditors should always use this option when working from an evidence pack on a separate system.The signing-key ring keeps every key the device has ever used, each marked with valid_from and retired_at timestamps. Verifying any manifest looks up the key that was active when it was signed — not the key active today. So manifests signed before a compromise can still be proven authentic after the compromise, as long as you have a copy of the pubring from before the incident (which you do, in every evidence pack you've ever produced).
The audit signing key can be rotated at any time. Reasons you might rotate:
sudo do-audit-key-rotate
What you'll see:
rotated: retired Y8nM3R9..., active is now A4kP7w2... (at 2026-05-15T18:00:00+00:00)
What happens behind the scenes:
retired_at timestamp in the pubring.valid_from = now and retired_at = null.Key rotation does not invalidate past evidence. Every retired key stays in the pubring forever. Old manifests remain verifiable — they reference the key they were signed with, and that key entry never disappears.
The next daily manifest (and every one after) is signed with the new key. The pubring travels inside every evidence pack, so auditors verifying a multi-year period transparently see all the rotations in sequence.
The audit subsystem keeps 365 days of detailed events by default. The daily signed manifests, signing keys, and the underlying event store all live under a single directory:
/opt/data/auditor/
├── keys/
│ ├── manifest.key ← current private signing key (0600 root)
│ └── manifest.pubring.json ← public ring of every key ever used
├── manifests/
│ └── MANIFEST-YYYY-MM-DD.json ← daily signed manifest, one per day
├── events.sqlite ← live event store (WAL mode)
└── share/
└── events.sqlite ← read-only snapshot for Grafana
For a full backup of the audit history, copy /opt/data/auditor/ and its contents. Everything you need to produce or verify evidence packs lives under that one tree.
The audit state lives on the data partition (
/opt/data), separate from the OS image. Firmware updates do not affect audit history.
grafana-image-renderer. If your deployment doesn't include it, use do-audit-report --no-pdf.cryptography package on the verifying machine. Both ship in every modern Linux distribution.