Automated pentest (aanvalsoppervlak)
De inventaris van monsys weet wát er op je hosts draait (poorten, certificaten, pakketten, runtimes). De automated-pentest-laag kijkt van buitenaf en beantwoordt wat de inventaris niet kan: wat is écht bereikbaar vanaf internet, en is een gevonden CVE ook uitbuitbaar?
Het is opt-in, draait alleen tegen bewezen-eigen scope, en is detect-only: nooit exploitatie, nooit brute force, nooit iets geschreven op een target.
Scope = bewezen eigendom
Section titled “Scope = bewezen eigendom”Een scanner raakt uitsluitend een asset die als geverifieerde scope-rij bestaat. Er is geen vrij invoerveld dat direct een scan start. Eigendom wordt op drie manieren bewezen:
- agent_vhost: een agent vond het domein in nginx/Caddy/certbot op zijn host. Dit wordt alleen automatisch geverifieerd als er een publiek-CA- certificaat op die host de naam dekt (je kunt geen publiek cert krijgen voor een domein dat je niet beheert). Zonder dat is het een kandidaat, niet scanbaar, tot DNS-TXT of handmatige bevestiging.
- dns_txt: plaats een
_monsys-challenge.<domein>TXT-record met de getoonde token. Voor domeinen zonder agent. - manual_admin: een tenant-owner voegt een domein/IP toe met TOTP.
Inschakelen
Section titled “Inschakelen”In het dashboard: Beveiliging → Aanvalsoppervlak.
- “Importeer domeinen van agents”: je agent-vhosts komen binnen, geverifieerd via hun certificaat.
- Zet de policy aan met TOTP. Standaard staat scannen uit.
- Kies een onderhoudsvenster; geplande scans draaien alleen daarin.
- “Scan nu” (TOTP) voor een directe run. De kill-switch staat ernaast en stopt een lopende scan binnen seconden.
Scanners en fases
Section titled “Scanners en fases”Alle scanners draaien als open source in gepinde Docker-containers op de hub.
| Fase | Scanner | Wat het detecteert |
|---|---|---|
| 1 | nmap | open poorten en diensten (connect scan, geen OS-probe) |
| 1 | testssl.sh | zwakke/verlopen certificaten, oude TLS-versies, zwakke ciphers |
| 1 | nuclei | misconfiguraties, exposed files (.git, .env), ontbrekende security-headers, standaard-logins |
| 2 | nuclei (CVE) | bevestigt dat een CVE uit de inventaris echt reageert → exploiteerbaar bevestigd |
| 3 | OWASP ZAP | passieve baseline per webapplicatie |
nuclei draait met de tags misconfig,exposure,ssl,default-login; alles
intrusief (DoS, brute force, fuzzing, actieve injectie) is uitgesloten en
out-of-band interactie staat uit.
Veiligheidsarchitectuur
Section titled “Veiligheidsarchitectuur”- Eén chokepoint. Elke scanner krijgt zijn targets uitsluitend via de
interne functie
ResolveTargets, die (a) scope-lidmaatschap controleert met eentenant_id-filter, (b) de SSRF/private-range-guard herhaalt op het opgeloste IP (geen RFC1918, loopback, link-local, CGNAT, 169.254, NAT64/6to4/Teredo, cloud-metadata), (c) de kill-switch, opt-in en het venster afdwingt. - Geharde, gepinde containers. Scanners draaien via een sudo-wrapper
(
/usr/local/sbin/monsys-scan) met images gepind op digest,--read-only,--cap-drop ALL,--security-opt no-new-privileges, pids-, geheugen- en cpu-limieten, non-root waar de tool het toelaat, en DNS gepind op publieke resolvers. De hostnaam wordt via--add-hostaan het gecontroleerde IP gekoppeld, zodat DNS-rebinding onmogelijk is. De onbevoorrechte hub kiest alleen een scanner-naam en levert een gevalideerd targetbestand; hetdocker runzelf zit in de wrapper. - Kill-switch stopt echt. Elke container heeft een naam die de hub via de
kill-verb van de wrapper kandocker kill-en; de worker controleert het vlaggetje elke paar seconden. - Redactie. Evidence wordt recursief geredigeerd (tokens, JWT’s, basic-auth in URL’s, private keys) voordat het wordt opgeslagen. Ruwe scanner-output wordt nooit bewaard.
Findings en audit-bewijs
Section titled “Findings en audit-bewijs”Findings landen op de pagina met categorie, ernst, status (open / opgelost / aanvaard / vals-positief) en worden week-op-week vergeleken (“nieuw sinds vorige week”). Een bevestigde CVE tilt de bijbehorende blootstelling naar “exploiteerbaar bevestigd” met een melding.
Elke scan-run is Ed25519-ondertekend en komt in de maandelijkse audit-pack: wie, wanneer, welke scope, welke findings. Dat is reproduceerbaar bewijs dat je de doeltreffendheid van je maatregelen beoordeelt: direct bruikbaar voor een NIS2-audit.
Self-hosting
Section titled “Self-hosting”De hub heeft nodig:
- Docker op de host en de wrapper
/usr/local/sbin/monsys-scan+/etc/sudoers.d/monsys-scan(meegeleverd inhub/packaging/). - Een beschrijfbare
/var/lib/monsys/scan-targets(in de systemdReadWritePathsvan de hub-unit) en een gecachete templateset in/var/lib/monsys/nuclei-templates(read-only ingemount). - De scanner-images worden op digest gepind; ververs de templateset periodiek buiten de scan om.
Beperkingen
Section titled “Beperkingen”Detect-only is geen vervanging voor een handmatige pentest met exploitatie; het vangt het bereikbare, bekende en misgeconfigureerde oppervlak, continu. nuclei- templates zijn gecachet en worden niet per run gedownload. ZAP draait één container per domein.