Ga naar inhoud

Detectie – zien en aantonen dat we nog steeds zien

Machinevertaling van het Franse origineel.

De preventie beantwoordt de vraag: "Kunnen we hier binnen?" De detectie beantwoordt de volgende vraag, die belangrijk is wanneer de eerste poging mislukt: "Is er iemand binnen, en wat doet hij?"

Deze pagina beschrijft de detectiemethoden van het park, de vraag waarop elke methode antwoordt, en vooral hoe we ervoor zorgen dat ze nog steeds werken – omdat een een defecte detector geeft geen foutmelding: het geeft geen geluid, en het stilte lijkt precies op "geen melding".

De technische termen verwijzen naar glossarium.


Een vraag, één motor

Een valkuil van een set veiligheidsinstrumenten is om ze te zien als een oplossing. Tien instrumenten die dezelfde vraag beantwoorden, laten de andere negen vragen onbeantwoord. Het systeem begint dus met vragen en wijst er één toe aan elk instrument – één en slechts één.

De vraag Het hulpmiddel Buiten de vraag
Bevat deze afbeelding een bekende CVE? Trivy Wat het container doet nadat het is gestart
Heeft deze code een fout, een kwetsbare afhankelijkheid, een geheim? Semgrep, Trivy (afhankelijkheden), trufflehog Het gedrag van het programma tijdens de uitvoering
Is dit systeem beveiligd, geïntegreerd en up-to-date? Wazuh — SCA, FIM, rootcheck, kwetsbaarheden Een abnormaal gedrag, in real-time
Wat start automatisch op deze machine? osquery (in Wazuh), KnockKnock op macOS —
Heeft dit proces iets abnormaals? Falco (eBPF) Het netwerkverkeer
Wat gaat er over het netwerk? Suricata (IDS) De inhoud van een end-to-end versleutelde stroom
Is dit bestand malware? ClamAV Nieuwe malware
Wat zit er in dit bestand, op alle niveaus? Strelka + YARA Wat het bestand zou doen als het wordt uitgevoerd
Wie valt het systeem aan? CrowdSec + community-blokkering Dingen die geen HTTP zijn
Wat is er gebeurd op deze machine? Velociraptor — zie Antwoord —

De rechter kolom is geen bekentenis: het definieert wat elk hulpmiddel doet. Het geeft aan waar de antwoorden van elk hulpmiddel eindigen, dus waar de antwoorden van een ander beginnen.

De autoriteit

Trivy heeft autoriteit over wat is gebouwd en versieert. Wazuh heeft autoriteit over de status van een levend systeem. Falco, Suricata en Velociraptor hebben autoriteit over het gedrag en de stromen. Geen van hen herhaalt het werk van een ander; wanneer twee motoren dezelfde observatie melden, wordt deze gefilterd door een regel-ID, zonder een van beide uit te schakelen.

flowchart LR
    classDef src fill:#3f3f46,stroke:#3f3f46,color:#fff
    classDef det fill:#7c2d12,stroke:#7c2d12,color:#fff
    classDef hub fill:#0f766e,stroke:#0f766e,color:#fff

    subgraph sources["Ce qu'on observe"]
        img["Images et dépôts"]:::src
        host["Hôtes<br/>fichiers · configuration · paquets"]:::src
        proc["Processus et conteneurs"]:::src
        net["Trafic réseau"]:::src
        file["Fichiers déposés"]:::src
        logs["Journaux du proxy"]:::src
    end

    subgraph moteurs["Les moteurs"]
        trivy["Trivy · Semgrep · trufflehog<br/>scanner de vulnérabilités"]:::det
        wazuh["Wazuh<br/>SIEM · osquery · listes d'IOC"]:::det
        falco["Falco<br/>appels système"]:::det
        suri["Suricata<br/>signatures réseau"]:::det
        av["ClamAV + Strelka<br/>verdict · analyse profonde"]:::det
        cs["CrowdSec<br/>comportement HTTP"]:::det
    end

    tri["Tableau de triage<br/>score · exposition · journal"]:::hub
    hub["Répartiteur d'alertes"]:::hub

    img --> trivy --> tri
    host --> wazuh
    proc --> falco
    net --> suri
    file --> av --> wazuh
    logs --> cs
    wazuh -->|"identifiant de règle"| hub
    falco -.->|"après mesure du bruit"| hub
    suri -.->|"après mesure du bruit"| hub
    cs -->|"403"| logs

De gestippelde pijlen zijn geen detail, maar duiden op motoren die eerst verzamelen voordat ze een melding sturen. De reden hiervoor ligt verder, in de principes.


Wazuh (SIEM)

Een SIEM verzamelt de logs van het hele netwerk, correlateert deze en stuurt meldingen. Hier is Wazuh: een manager en een agent op elke machine – hypervisor, container hosts, GPU host, NAS, externe server en werkstation. Een host buiten het LAN communiceert met de manager via een privénetwerk, nooit via een lokale adres dat niet bestaat voor hem.

Wat de agents bieden:

  • Integriteit van bestanden op gevoelige locaties;
  • Configuratiebeoordeling tegen CIS benchmarks;
  • Zoeken naar rootkits en verborgen bestanden of poorten;
  • Kwetsbaarheden door correlatie tussen geïnstalleerde pakketten en CVE-databases;
  • Inventaris van hardware, pakketten en processen.

osquery, in het SIEM en niet los

osquery onderzoekt de status van een machine met behulp van SQL: services, geplande taken, SSH-sleutels, alles wat als persistentie dient. Het is verbonden als een module van Wazuh, niet als een apart service: twee inventaren van hetzelfde netwerk verschillen uiteindelijk altijd, en op het moment dat ze verschillen, weet niemand meer welke te vertrouwen. De resultaten komen in dezelfde index als de rest, en een controleert of ze daadwerkelijk aankomen – een geactiveerde module die niets stuurt, lijkt op een geactiveerde module.

Threat intelligence, geconsumeerd

Drie lijsten van IOC – adressen, domeinen, bestandspaden – worden afgelezen uit openbare bronnen en worden periodiek bijgewerkt. Wazuh raadpleegt deze lijsten wanneer een gebeurtenis plaatsvindt (CDB-lijsten). De lijst met bestandspaden wordt ook bijgevuld met wat de bestandsscan-engines in het netwerk hebben gevonden: een bestand dat één keer is gedetecteerd, wordt daarna overal herkend.

Een platform voor het delen van informatie (zoals MISP) is niet geschikt: het is nuttig wanneer er informatie wordt gegenereerd, maar niet wanneer er drie lijsten worden gebruikt. Een monitor houdt de actualiteit van de lijsten in de gaten: een IOC-lijst die niet meer wordt bijgewerkt, genereert geen fouten, maar alleen gemiste detecties.

Twee niveaus van waarschuwing

  • Regels op naam, één per detectie die we willen ontvangen (bijvoorbeeld malware, een "canari" die niet meer reageert, een container die is gestopt vanwege een geheugenprobleem), elk gekoppeld aan zijn unieke identificatie.
  • Een algemeen drempelwaarde, voor alles wat de regels op naam niet dekken. Deze wordt alleen geactiveerd na een periode van meting van het aantal waarschuwingen dat deze zou genereren in een gezond netwerk.

Uitvoering – Falco

Het SIEM bekijkt de status van een host; het ziet niet wat een programma op dat moment doet. Zonder telemetrie van systeemoproepen, kan een aanvaller die al aanwezig is in een container, alleen worden gedetecteerd door wat hij beschadigt.

Falco vult deze lacune in op hosts die containers draaien. De keuzes voor implementatie, elk met zijn eigen reden:

Keuze Waarom
Moderne eBPF sonde, geen kernelmodule Geen code dat gecompileerd moet worden, geen problemen bij de volgende kernel-update
Systeempakket, gestart voor de container engine De eerste container is al in gebruik
Automatische updates van regels vanaf het internet uitgeschakeld Regels worden gewijzigd via een repository, en worden gelezen, nooit heimelijk
Limiet voor processor en geheugen Een beveiligingstool mag de host die het beschermt niet compromitteren
Buffer met een capaciteit voor nul verlies tijdens piekbelasting Een verloren gebeurtenis tijdens een piek is precies de gebeurtenis die we zoeken

Naast de stabiele regels van het project, zijn er ook regels die zelf zijn gemaakt, geschreven voor de acties van een aanvaller op dit netwerk: het schrijven naar een geplande taak of in SSH-sleutels, het opzetten van een container die de socket van de container engine gebruikt, zonder op de lijst van toegestane gebruikers te staan, het verhogen van de rechten binnen een container.

De vals-positieven – de gezondheidscontroles van de databases, die al honderdduizenden gebeurtenissen per dag registreren – worden verwerkt met specifieke uitzonderingen, één per geval, nooit door een regel uit te schakelen.

Een regel kan zonder fout worden geladen en nooit meer overeenkomen

Een update kan de betekenis van een veld veranderen dat een regel gebruikt. De regel wordt geladen, er ontstaan geen fouten tijdens het opstarten, en deze zal nooit meer worden geactiveerd. Het opnieuw lezen van de configuratie ziet niets: deze is correct, voor de vorige versie.

Daarom is er een "bewijs": een scanner lanceert een eenmalig gebruiksvoorwerp, opent er een interactieve shell en leest een gevoelige bestanden, en controleert vervolgens of beide acties zijn uitgevoerd, op elk systeem. Zijn omgekeerde controle bestond uit het uitschakelen van een regel en het zien van de scanner rood oplichten.


Het netwerk — Suricata

Suricata past bekende signalen van aanvallen toe op het verkeer dat er langs loopt. Zijn uitvoer, in JSON, gaat naar de logboekzoekmachine.

Een IDS ziet alleen wat er langs loopt: zijn locatie is dus de echte beslissing. Een lokaal meshnetwerk biedt geen spiegelpoort om op te luisteren; het punt van aandacht is waar het verkeer convergeert — een virtueel netwerkbrug kan tegelijkertijd de uitwisseling tussen machines en hun uitgangen naar het internet zien, zonder extra apparatuur.

Net als Falco verzamelt hij voordat hij een melding maakt, en zijn bewijs is een testsignaal dat handmatig vanaf een machine wordt geactiveerd, en vervolgens wordt gevonden in de meldingen.


De bestanden — twee motoren, twee vragen

De architectuur van het antivirus-systeem — een centraal motor, een signaalspiegel, en de client die logboek bijhoudt — wordt beschreven in de architectuurnotitie. Hier gaat de vraag over bewijzen.

  • ClamAV antwoordt op "Is dit een bekend malware?": de bestandsshare-dienst weigert het opslaan van een gedetecteerd bestand.
  • Strelka antwoordt op "Wat zit er hierin, op alle niveaus?": het ontvouwt recursief archieven, documenten en ingebouwde objecten, en voert duizenden YARA-regels uit op elk stuk, plus talloze openbare scanners. Elke nacht analyseert hij een selectie van paden.

De slechtste storing in het park — en waarom een teller dat niet oppikt

YARA compile zijn set regels in één enkele blok. Één ongeldig bestand kan het hele systeem laten crashen: de container blijft in goede staat, de analyses blijven doorlopen, en er wordt niets meer gedetecteerd.

Een teller die het aantal geladen regels aangeeft, lijkt voldoende. Dat is echter niet het geval: het geeft aan hoeveel regels in het geheugen staan, maar niet of ze nog iets herkennen. Een voorbeeld van zo'n "canaris" is een eigen regel, die in dezelfde set staat, en die telkens opnieuw wordt ingeladen. Er is ook een bestand dat deze regel activeert. Een sonde stuurt dit bestand en vraagt om detectie. Als het systeem niet meer compileert, valt de canaris mee — precies wat we willen.

Omgekeerde verificatie: een bestand met ongeldige regels veroorzaakt een kritische waarschuwing, waarna het systeem weer normaal werkt.

Voor ClamAV is de canaris het bestand EICAR, dat dagelijks wordt aangeleverd.

Een omgekeerde verificatie moet het testen wat het beweert te testen

Om de EICAR-canaris te testen, is de eerste aanpak om de testsignatuur te negeren. Dit werkt echter niet: de motor herkent het bestand onder een andere signatuur, die de controle overneemt, en de canaris blijft groen. Een omgekeerde verificatie die de canaris niet laat falen, bewijst niet dat de canaris werkt — het bewijst alleen dat we hem niet hebben kunnen laten falen.

Wat is afgewezen, en waarom.

  • Een dynamische sandbox: De hoeveelheid bestanden rechtvaardigt het niet, en het zou een zware machine introduceren, die kwetsbaar zou zijn voor kwaadaardige code. Dit punt zal opnieuw ter sprake komen wanneer een echt voorbeeld beide motoren doorstaat.
  • Een derde YARA-regelmotor: Deze zou dezelfde set publieke regels lezen. Een tweede hulpmiddel dat dezelfde regels leest, is geen tweede mening.

De perimeter — CrowdSec

CrowdSec leest de logs van de interne proxy, herkent vijandig gedrag (scan, brute-force, bekende exploits) en voert zijn beslissing uit via een module die is geïntegreerd in de proxy, die een 403-antwoord geeft. Het maakt ook gebruik van een gemeenschappelijke bloklijst, die wordt gevoed door alle installaties die deze delen.

Waarom in de applicatielaag, en niet op de firewall: zie het architectuurrapport. Het systeem controleert of de module daadwerkelijk een beslissing uitvoert, en niet alleen of deze is geladen.


Kwetsbaarheden — de scanner en zijn assen

Een zelfgebouwd scanner voor kwetsbaarheden aggregeert verschillende tools en, vooral, sorteert:

Aspek Gereedschap Wat het biedt
Beelden en services, op elke container-host Trivy Bekende CVE's, dagelijks
Code repositories Trivy (afhankelijkheden, IaC) + Semgrep (SAST) Kwetsbaarheden en afhankelijkheden vóór de implementatie
Geheimen op de hosts trufflehog Ernst van het bestand wordt bepaald door de rechten: een geheim dat door iedereen leesbaar is, is ernstiger dan hetzelfde geheim dat alleen voor een bepaalde service is toegestaan
Actiebaarheid Vergelijking met de basisimage Is er al een oplossing?
Expositie Configuratie van de proxy Openbaar, via de identiteitsleverancier, of intern
Exploitatie EPSS + KEV Waarschijnlijk, of reeds geconstateerd elders

De score combineert ernst, exploitatie en expositie: een kritische CVE op een intern service, volgt een gemiddelde CVE, die al is geëxploiteerd, op een openbaar service. Elke beslissing van prioritering wordt vastgelegd met de auteur.

OpenCVE vult het overzicht aan voor wat geen container-image is: het systeem van de hypervisor, dat van het NAS: het combineert de gepubliceerde CVE's met het versiebeheer van de componenten in het systeem.

Twee aanvullingen:

  • Een SBOM per service-image, die wekelijks wordt herzien. Wanneer een nieuwe kwetsbaarheid wordt gepubliceerd, kan de vraag "zijn we er mee in aanraking gekomen?" worden beantwoord door het inventaris, zonder opnieuw een scan uit te voeren.
  • De tijd die nodig is om een correctie uit te voeren, is zelf ook een controle. Het scannen zonder de tijd die nodig is om een correctie uit te voeren te meten, leidt tot een lijst die steeds groter wordt. Zie Conformiteit.

Hardening, en een tweede mening

De configuratie-evaluatie van het SIEM draait continu. Een tweede tool (Lynis) is incidenteel gebruikt, om te vergelijken. Waar de twee elkaar tegenstonden – een module die door de ene als inactief werd aangegeven, maar door de andere als actief – werd het probleem opgelost door een functionele test: de actie die de module moet voorkomen, proberen uit te voeren, en constater dat dit geweigerd wordt. De automatische controle was foutief.

Specifieke rootkit-detectoren zijn niet toegevoegd: ze doen hetzelfde als de module van het SIEM, en op containersystemen produceren ze ruis die de rest van het systeem overbelast.


Wat deze keuzes gemeenschappelijk hebben

1. Functionele tests, niet alleen tellers. "De service is actief", "5.000 regels zijn geladen", "de agent is verbonden": dit zijn tellers, en een detector kan ze allemaal bevredigen zonder iets te detecteren. Een test injecteert een bekende situatie en eist dat deze wordt gezien. Elke motor op deze pagina heeft er een.

2. Het meten van de ruis voordat een alarm wordt geactiveerd. Een nieuwe detector draait eerst alleen in verzamelmodus, met een vooraf bepaalde datum voor het activeren van het alarm. Een alarm dat wordt geactiveerd zonder voorafgaande meting, meet de snelheid van het instrument, niet de staat van het systeem – en een alarm dat elke uur vanaf de eerste dag wordt afgegeven, wordt gesorteerd voordat het einde van de week.

3. Filteren op regel-ID, nooit op groep. Een groep bevat regels die dicht bij elkaar staan, die niet zijn gelezen. Een filter op groep plaatst dubbele regels; een automatische reactie op groep zou werken op detecties die nooit zijn gekozen.

4. Een uitzondering heeft een naam. Een vals positief wordt behandeld door een specifieke uitzondering, gekoppeld aan het geval. Het uitschakelen van een regel in één keer, verwijdert ook alle correcte detecties die deze zou hebben gemaakt.

5. Eén motor per vraag. Het toevoegen van een tool is gerechtvaardigd door een vraag zonder antwoord, niet door de reputatie van het tool.


Lees verder

Dernière vérification de cette page : 2026-09-11