Aller au contenu

Detection & Reporting

Le module Detection & Reporting de monsys observe ce qui se passe sur vos hôtes au niveau de l’authentification + IP source, et signale les patterns suspects avec contexte complet. Le système n’agit pas automatiquement — le sysadmin garde la main via les Emergency Actions existantes (TOTP-gated, signées Ed25519).

C’est un choix délibéré : les features auto-block (style CrowdStrike) sont spoofables (l’attaquant peut faire bloquer des IPs légitimes) et ne correspondent pas à la séparation-des-devoirs NIS2. monsys fournit la preuve, l’humain décide.

  1. Sidebar → Security → Detection (sous OBSERVATION)
  2. Tuiles KPI en haut : events ouverts / acquittés / fenêtre
  3. Filtre : fenêtre temporelle (1h/24h/7j/30j) + statut + type de règle
  4. Cliquez sur un event dans la liste de gauche → panneau contexte à droite :
    • Hôte + IP source + pays + RIR + user cible + count + fenêtre
    • MITRE ATT&CK TTPs (par ex. T1110.001 pour brute force SSH)
    • “Étapes suivantes suggérées” — guide avec pointeur explicite vers l’Emergency Action manuelle pour l’escalade
    • “Auth-events liés (même IP)” — qu’a encore tenté cette IP dans la même fenêtre
    • “Findings similaires cette semaine (même IP)” — cette IP a-t-elle touché d’autres hôtes de votre flotte ?
  5. Cliquez Acquitter une fois investigué (event sort de la vue “open”)
Type de règle Config par défaut MITRE TTP
auth_brute_force (par user) >10 échecs en 5min T1110.001
auth_brute_force (par src_ip) >20 échecs en 5min T1110.001
auth_invalid_user >10 users uniques inexistants depuis 1 IP en 10min T1589.002
auth_new_country login réussi depuis pays non vu pour user en 30j T1078
geo_blocked_country toute connexion depuis pays configuré opérateur T1078
usb_new_device périphérique USB absent de la baseline par hôte T1200

La baseline USB se construit automatiquement à partir du premier inventaire matériel d’un hôte ; tout périphérique inconnu ultérieur génère un detected event. Comme toutes les détections : observer + rapporter, pas d’auto-block.

Au-delà des règles de détection, les signaux matériel et utilisateurs de l’agent alimentent aussi la logique de risque ailleurs dans le hub : une politique de mots de passe faible ou absente compte dans le Trust Score et les contrôles de conformité, et un réseau Wi-Fi non sécurisé (ouvert, WEP ou TKIP) apparaît comme recommandation avec une sévérité high ou medium.

Au premier déploiement, les 4 règles par défaut sont seedées par tenant. Modifiez/ajoutez via /security/detection/rules (v2 — pour l’instant via API : POST /api/v1/detection/rules).

Ce que les hôtes doivent faire (opt-in par agent)

Section intitulée « Ce que les hôtes doivent faire (opt-in par agent) »

La détection requiert que l’agent lise /var/log/auth.log (ou /var/log/secure sur RHEL) et envoie les events parsés au hub. C’est désactivé par défaut car usernames + IPs sources sont des PII.

Activer par hôte dans /etc/monsys/agent.toml :

auth_event_shipping_enabled = true

Redémarrer agent : sudo systemctl restart monsys-agent. Events expédiés dans la minute. Attention : le service user monsys doit pouvoir lire /var/log/auth.log ; sur Debian/Ubuntu l’appartenance au groupe adm suffit (sudo usermod -aG adm monsys). Le shipper démarre à la position courante du log, les lignes historiques ne sont pas renvoyées. Confidentialité : tout reste dans le scope tenant (RLS) et seuls les signals agrégés remontent au niveau event sur le hub (pas de raw log lines stockées).

Pour le mapping pays, monsys utilise les fichiers RIR delegated stats (RIPE/ARIN/APNIC/AFRINIC/LACNIC). Listes publiques, rafraîchies quotidiennement directement par le registry allocant. Pas de licence MaxMind, pas d’attribution, EU-pull-friendly, et plus précis au niveau pays que les bases commerciales (c’est par définition la source de vérité pour l’allocation IP).

Limitation : pays + ASN uniquement, pas de city/lat-lng. Pour l’impossible-travel à coordonnées exactes, source séparée nécessaire (plus tard).

Le GeoIPWorker sur le hub télécharge les 5 fichiers RIR toutes les 24h (~25 MB total), les parse en ranges, peuple geoip_country_ranges. Le détection worker fait un seul index seek par IP source pour chercher pays + RIR.

  • Pas de blocks iptables automatiques ni usermod -L
  • Pas d’EATs pré-émis qui s’auto-déclenchent sur signaux de détection
  • Pas d’inspection de paquets niveau réseau (nous lisons logs, pas paquets)
  • Pas de ML / sequence detection (commencer par règles, ML uniquement quand les baselines sont stables pendant des mois)
  • Pas d’intégration avec SIEMs externes (nous SOMMES la source de preuves, pas un agent-feeder vers Splunk/Datadog)

Les detected events ne se ferment pas automatiquement. Le sysadmin acquitte explicitement via le bouton “Acquitter” — par design pour maintenir l’audit trail (“le 2026-05-21 14:23 alice@acme.com a dismissé l’event X comme bénin”). Les events plus anciens que 30 jours sont purgés par la chunk-retention policy TimescaleDB (configurable dans mig 097).

Fenêtre de terminal
# Liste events ouverts dernières 24h
curl 'https://app.monsys.ai/api/v1/detection/events?since=24h&ack=open' \
-H "Authorization: Bearer $TOKEN"
# Détail avec related + similar findings
curl https://app.monsys.ai/api/v1/detection/events/<id> \
-H "Authorization: Bearer $TOKEN"
# Acquitter après investigation
curl -X POST https://app.monsys.ai/api/v1/detection/events/<id>/acknowledge \
-H "Authorization: Bearer $TOKEN"
# Ajouter une règle pays-bloqué
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
}'