Ga naar inhoud

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

  1. Sidebar → Security → Detection (onder OBSERVATIE)
  2. KPI tiles bovenaan: open events / acknowledged / window
  3. Filter: tijdvenster (1u/24u/7d/30d) + status (open/acknowledged/all) + rule-type
  4. 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?
  5. Klik Bevestig wanneer onderzocht (event verdwijnt uit “open” view)

Wat we detecteren

Rule kindDefault configMITRE TTP
auth_brute_force (per user)>10 failures in 5minT1110.001
auth_brute_force (per src_ip)>20 failures in 5minT1110.001
auth_invalid_user>10 unique non-existent users from 1 IP in 10minT1589.002
auth_new_countrysuccessful login uit land niet gezien voor user in 30dT1078
geo_blocked_countryelke connectie vanuit operator-config landT1078

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 = true

Restart 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 iptables blocks of usermod -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)

Terminal window
# Lijst open events laatste 24u
curl 'https://app.monsys.ai/api/v1/detection/events?since=24h&ack=open' \
-H "Authorization: Bearer $TOKEN"
# Detail van één event met related + similar findings
curl 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 toe
curl -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