Detection & Reporting
monsys’ Detection & Reporting module observeert wat er op je hosts gebeurt qua authenticatie + bron-IP en rapporteert verdachte patronen mét volledige context. Het systeem grijpt niet automatisch in — de sysadmin houdt de hand aan het roer via de bestaande Emergency Actions (TOTP-gated, Ed25519-signed).
Deze keuze is bewust: auto-block features (CrowdStrike-stijl) zijn spoofbaar (aanvaller laat legitieme IPs blokkeren) en passen niet bij NIS2 separation-of-duties. monsys levert de evidence, mens beslist.
In het dashboard
- Sidebar → Security → Detection (onder OBSERVATIE)
- KPI tiles bovenaan: open events / acknowledged / window
- Filter: tijdvenster (1u/24u/7d/30d) + status (open/acknowledged/all) + rule-type
- Klik een event in de linkse lijst → context-panel rechts laadt:
- Host + src IP + country + RIR + target user + count + window
- MITRE ATT&CK TTPs (bv. T1110.001 voor SSH brute force)
- “Suggested next steps” — handleiding wat te doen, met expliciete verwijzing naar de manuele Emergency Action voor escalatie
- “Gerelateerde auth-events (zelfde IP)” — wat heeft dit IP nog geprobeerd in dezelfde tijdvenster
- “Vergelijkbare findings deze week (zelfde IP)” — heeft dit IP ook andere hosts in jouw fleet geraakt?
- Klik Bevestig wanneer onderzocht (event verdwijnt uit “open” view)
Wat we detecteren
| Rule kind | Default config | MITRE TTP |
|---|---|---|
auth_brute_force (per user) | >10 failures in 5min | T1110.001 |
auth_brute_force (per src_ip) | >20 failures in 5min | T1110.001 |
auth_invalid_user | >10 unique non-existent users from 1 IP in 10min | T1589.002 |
auth_new_country | successful login uit land niet gezien voor user in 30d | T1078 |
geo_blocked_country | elke connectie vanuit operator-config land | T1078 |
Bij eerste deploy zijn de 4 default rules per tenant geseed. Wijzig of
voeg toe via /security/detection/rules (komt in v2 — voor nu via API:
POST /api/v1/detection/rules).
Wat hosts moeten doen (opt-in per agent)
Detection vereist dat de agent /var/log/auth.log (of /var/log/secure
op RHEL) leest en geparseerde events naar de hub stuurt. Dit is
default UIT omdat usernames + src IPs PII zijn.
Zet aan per host in /etc/monsys/agent.toml:
auth_event_shipping_enabled = trueRestart agent: sudo systemctl restart monsys-agent. Binnen 1 minuut
shippen events. Privacy: alles blijft binnen je eigen tenant scope
(RLS) en aggregated signals worden door de detection worker pas op
event-niveau gerapporteerd (geen ruwe log lines op de hub).
GeoIP — geen MaxMind, wel RIR
Voor country-mapping gebruikt monsys de RIR delegated stats files (RIPE/ARIN/APNIC/AFRINIC/LACNIC). Dit zijn publieke, dagelijks- gerefreshe lijsten direct van de allocerende registry. Geen MaxMind licentie nodig, geen attributie verplicht, EU-pull-friendly, en accurater op country-niveau dan commerciële databases (het is per definitie de bron van de waarheid voor IP-allocatie).
Beperking: alleen country + ASN, geen city/lat-lng. Voor exact- coordinates impossible-travel zou aparte source nodig zijn (later).
De GeoIPWorker op de hub pulled elke 24 uur de 5 RIR files
(~ 25 MB totaal), parseert ze tot ranges, en populeert
geoip_country_ranges. Detection worker doet per src_ip één index-seek
om country + RIR op te halen.
Wat monsys NIET doet
- Geen automatische
iptablesblocks ofusermod -L - Geen pre-issued EATs die zichzelf firen op detection-signal
- Geen network-level packet inspection (we lezen logs, niet pakketten)
- Geen ML / sequence detection (begin met rule-based, ML pas wanneer baselines maandenlang stabiel zijn)
- Geen integratie met externe SIEMs (we zijn zelf de evidence-bron, niet een agent-feeder naar Splunk/Datadog)
Auto-resolve gedrag
Detected events sluiten niet automatisch. De sysadmin acknowledged ze expliciet via de “Bevestig” knop — dat is per design om audit-trail te houden (“op 2026-05-21 14:23 keurde alice@acme.com event X af als benigne”). Wel: events ouder dan 30 dagen worden door TimescaleDB’s chunk-retention policy automatisch gepurged (configurable in mig 097).
Of via API (geavanceerd — voor automatisering)
# Lijst open events laatste 24ucurl 'https://app.monsys.ai/api/v1/detection/events?since=24h&ack=open' \ -H "Authorization: Bearer $TOKEN"
# Detail van één event met related + similar findingscurl https://app.monsys.ai/api/v1/detection/events/<id> \ -H "Authorization: Bearer $TOKEN"
# Bevestig (na investigatie)curl -X POST https://app.monsys.ai/api/v1/detection/events/<id>/acknowledge \ -H "Authorization: Bearer $TOKEN"
# Voeg een geo-blocked country rule toecurl -X POST https://app.monsys.ai/api/v1/detection/rules \ -H "Authorization: Bearer $TOKEN" \ -d '{ "name": "Block KP traffic", "rule_kind": "geo_blocked_country", "config": {"countries": ["KP"]}, "severity": "high", "enabled": true }'Wat NIET op deze pagina hoort
- Manueel Emergency Actions (IsolateNetwork etc.) → zie Emergency console
- Audit trail van uitgevoerde EATs → zie Transparency log
- CVE-based detectie (kernel + applicatie deps + OS-pakketten) → zie Kernel CVE pipeline en OS-pakket CVE matching