Vulnerability Management & Patchbeleid
Rechten Omlaag, Controle Omhoog
Aanvalspaden worden klein zodra rechten, segmenten en beheerkanalen consequent zijn ingericht.
Voor Vulnerability Management & Patchbeleid blijft de basis hetzelfde: minder impliciet vertrouwen en meer zicht op afwijkend gedrag.
Zo beperk je niet alleen de kans op incidenten, maar vooral ook de omvang en duur als er iets misgaat.
Directe maatregelen (15 minuten)
Waarom dit telt
De kern van Vulnerability Management & Patchbeleid is risicoreductie in de praktijk. Technische context ondersteunt de maatregelkeuze, maar implementatie en borging staan centraal.
Het Vulnerability Management Proces
Vulnerability management is geen scan draaien en een rapport mailen. Het is een cyclisch proces met vijf fasen die zich eindeloos herhalen, als een wasmachine die nooit stopt:
| Fase | Activiteit | Output | Frequentie |
|---|---|---|---|
| 1. Discover | Asset inventarisatie + vulnerability scanning | Lijst van kwetsbaarheden per asset | Continu / wekelijks |
| 2. Prioritize | Risicobeoordeling op basis van CVSS, EPSS, KEV, business context | Geprioriteerde remediatie-lijst | Na elke scan |
| 3. Remediate | Patchen, configureren, mitigeren | Gepatcht systeem of compenserende maatregel | Conform SLA per severity |
| 4. Verify | Herscan om te bevestigen dat de fix werkt | Bewijs van remediatie | Na elke remediate-actie |
| 5. Report | KPI-rapportage aan management en compliance | Dashboard, metrics, trends | Maandelijks / per kwartaal |
Het proces begint bij iets dat veel organisaties niet hebben: een complete asset inventarisatie. Je kunt geen kwetsbaarheden vinden in systemen waarvan je niet weet dat ze bestaan. Shadow IT – die testserver die een ontwikkelaar heeft opgezet en vergeten, die oude webapplicatie die “tijdelijk” was maar al drie jaar draait – dat zijn de systemen die het langst ongepatcht blijven, want ze staan in geen enkel register.
Regel een: je kunt niet beschermen wat je niet kent.
Scantools
De markt voor vulnerability scanners is volwassen. Er is voor elk budget en elke omvang een optie. De keuze hangt af van drie factoren: wat je scant (netwerk, web, containers), hoeveel je wilt betalen, en hoeveel valse positieven je bereid bent te accepteren.
| Tool | Type | Licentie | Sterkte | Zwakte | Use case |
|---|---|---|---|---|---|
| Nessus Professional | Netwerk, host, compliance | Commercieel (~$3.500/jaar) | Uitgebreide plugin-library, compliance checks | Prijzig, UI verouderd | Enterprise netwerkscan |
| OpenVAS / Greenbone | Netwerk, host | Open source (Community) / Commercieel (Enterprise) | Gratis, goede dekking | Tragere updates, complexe setup | MKB, budget-bewust |
| Qualys VMDR | Netwerk, cloud, container | SaaS (per asset) | Cloud-native, agent-based, realtime | Duur op schaal | Grote enterprise, multi-cloud |
| Nuclei | Web, netwerk, misconfiguratie | Open source | Snel, community templates, CI/CD integratie | Vereist kennis, minder compliance | Security teams, bug bounty, DevSecOps |
| Trivy | Container, IaC, SBOM | Open source | Container-native, SBOM, snelle scan | Beperkt tot software/configuratie | DevOps, container pipelines |
Voorbeeld: OpenVAS scan configuratie
# OpenVAS installeren (Kali Linux)
sudo apt install gvm -y
sudo gvm-setup
# Na setup: webinterface op https://127.0.0.1:9392
# Login met gegenereerde credentials
# CLI scan starten met gvm-cli
gvm-cli --gmp-username admin --gmp-password <password> \
socket --socketpath /run/gvmd/gvmd.sock \
--xml '<create_target>
<name>Intern Netwerk</name>
<hosts>10.0.10.0/24</hosts>
</create_target>'Voorbeeld: Nuclei CLI
# Installatie
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# Basis scan met alle templates
nuclei -u https://target.example.com -as
# Scan met specifieke severity
nuclei -u https://target.example.com -severity critical,high
# Scan met specifieke tags
nuclei -u https://target.example.com -tags cve,misconfig
# Netwerk scan met CIDR
echo "10.0.10.0/24" | nuclei -t network/
# Output naar JSON voor verwerking
nuclei -u https://target.example.com -j -o resultaten.json
# Integratie in CI/CD pipeline
nuclei -l targets.txt -severity critical,high \
-markdown-export rapport/ \
-silentVoorbeeld: Trivy container scan
# Container image scannen
trivy image nginx:latest
# Alleen critical en high
trivy image --severity CRITICAL,HIGH nginx:latest
# Filesystem scannen (IaC misconfigs)
trivy fs --scanners vuln,misconfig /pad/naar/project
# SBOM genereren
trivy image --format cyclonedx nginx:latest > sbom.jsonDe keuze voor een scantool is minder belangrijk dan de discipline om het te gebruiken. Een gratis OpenVAS-scan die wekelijks draait is oneindig waardevoller dan een Qualys-licentie van honderdduizend euro die stof vergaart.
Prioriteren: CVSS vs EPSS vs KEV
Hier wordt het interessant. Want na een scan heb je een lijst. En die lijst is lang. Honderden, soms duizenden kwetsbaarheden. En nu moet je beslissen: wat patch je eerst?
Waarom CVSS alleen niet genoeg is
CVSS – het Common Vulnerability Scoring System – geeft elke kwetsbaarheid een score van 0 tot 10. Een CVSS van 9.8 klinkt alarmerend, en dat is het soms ook. Maar CVSS meet potentiele impact, niet waarschijnlijkheid van exploitatie. Een kwetsbaarheid met CVSS 9.8 in een component die alleen bereikbaar is via een intern netwerk dat achter drie firewalls en een VPN zit, is een ander risico dan een CVSS 7.5 in een internet-facing webserver.
Het resultaat: als je alleen op CVSS prioriteert, patch je alles met een hoge score, ongeacht of er daadwerkelijk een exploit in het wild bestaat. Je bent druk. Je voelt je productief. Maar je patcht misschien de verkeerde dingen.
EPSS – Exploit Prediction Scoring System
EPSS, ontwikkeld door FIRST.org, beantwoordt een andere vraag: hoe waarschijnlijk is het dat deze kwetsbaarheid in de komende 30 dagen actief wordt geexploiteerd? Het model gebruikt machine learning op basis van historische exploitdata, kenmerken van de CVE, en signalen uit het wild (exploit code beschikbaar, vermeldingen op fora, etc.).
EPSS scoort van 0 tot 1 (0% tot 100% kans op exploitatie). Een CVE met CVSS 9.8 maar EPSS 0.02 is waarschijnlijk theoretisch gevaarlijk maar in de praktijk nog niet geexploiteerd. Een CVE met CVSS 7.0 maar EPSS 0.95 wordt nu actief gebruikt door aanvallers.
# EPSS data opvragen via API
curl -s "https://api.first.org/data/v1/epss?cve=CVE-2024-1709" | jq .
# Voorbeeld output:
# {
# "data": [{
# "cve": "CVE-2024-1709",
# "epss": 0.97431,
# "percentile": 0.99961
# }]
# }CISA KEV – Known Exploited Vulnerabilities
De CISA KEV-catalogus is de meest directe indicator: deze kwetsbaarheden worden bewezen actief geexploiteerd in het wild. Geen voorspelling, geen score – feit. Als een CVE op de KEV-lijst staat, is het geen theoretisch risico meer. Iemand gebruikt het. Nu. Tegen organisaties zoals de jouwe.
De KEV-catalogus bevat op het moment van schrijven meer dan 1.100 kwetsbaarheden. CISA verplicht Amerikaanse overheidsinstanties om KEV-items binnen de gestelde deadline te patchen. Dat is een goed beleid om over te nemen, ook als je geen Amerikaanse overheidsinstantie bent.
# CISA KEV catalogus ophalen
curl -s "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json" \
| jq '.vulnerabilities | length'
# Zoek specifieke CVE
curl -s "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json" \
| jq '.vulnerabilities[] | select(.cveID == "CVE-2023-46805")'Decision matrix
Combineer de drie bronnen voor een rationele prioritering:
| CVSS | EPSS | Op KEV? | Internet-facing? | Actie |
|---|---|---|---|---|
| 9.0+ | >0.7 | Ja | Ja | Patch VANDAAG – alles laten vallen |
| 9.0+ | >0.7 | Ja | Nee | Patch binnen 48 uur |
| 7.0+ | >0.4 | Nee | Ja | Patch deze week |
| 7.0+ | <0.4 | Nee | Nee | Patch deze maand |
| 4.0-6.9 | <0.2 | Nee | Nee | Patch binnen kwartaal |
| <4.0 | <0.1 | Nee | Nee | Accepteer risico (documenteer) |
De kolom “Internet-facing” is cruciaal. Een CVSS 7.0 op een publiek bereikbare webserver is een groter risico dan een CVSS 9.0 op een interne applicatieserver die alleen via een jump host bereikbaar is. Context is alles.
Patchbeleid
Een patchbeleid zonder handhaving is een wensenlijst. Hier is een template dat werkt – niet omdat het perfect is, maar omdat het afdwingbaar is:
Patchbeleid template
| Categorie | Definitie | SLA | Verantwoordelijke | Uitzonderingsproces |
|---|---|---|---|---|
| Kritiek | CVSS >= 9.0 OF op CISA KEV OF actieve exploitatie | 48 uur (internet-facing), 7 dagen (intern) | Systeembeheer + CISO-goedkeuring voor uitstel | Schriftelijk goedgekeurd door CISO, compenserende maatregel verplicht |
| Hoog | CVSS 7.0-8.9, EPSS > 0.4 | 14 dagen | Systeembeheer | Goedkeuring door teamlead, maximaal 30 dagen uitstel |
| Medium | CVSS 4.0-6.9 | 30 dagen | Systeembeheer | Documentatie in ticketsysteem |
| Laag | CVSS < 4.0, geen exploit bekend | 90 dagen | Systeembeheer | Mag worden samengevoegd met regulier onderhoud |
Uitzonderingsproces
Soms kun je niet patchen. De applicatie is end-of-life. De vendor heeft geen patch. De patch breekt functionaliteit. Dat gebeurt. Het punt is niet dat uitzonderingen niet mogen bestaan – het punt is dat ze gedocumenteerd, goedgekeurd en tijdelijk moeten zijn.
Een uitzondering bevat minimaal: - CVE-nummer en beschrijving van de kwetsbaarheid - Reden waarom niet gepatcht kan worden - Compenserende maatregel die het risico mitigeert (zie sectie 18.5) - Eigenaar die verantwoordelijk is voor de uitzondering - Vervaldatum – uitzonderingen zijn niet permanent. Maximaal 90 dagen, daarna hernieuwde beoordeling. - Handtekening van de risico-eigenaar (niet de systeembeheerder, maar de business owner)
Dat laatste punt is belangrijk. Als de business owner persoonlijk moet tekenen voor het risico van een ongepatchte kritieke kwetsbaarheid, word je verbaasd hoe snel die “onmogelijke” patch ineens mogelijk blijkt.
Compenserende Maatregelen
Wanneer patchen niet kan – en soms kan het echt niet – zijn er compenserende maatregelen die het risico verlagen zonder de kwetsbaarheid te verhelpen:
Virtual patching (WAF-regels)
Een Web Application Firewall kan verkeer blokkeren dat bekende exploit-patronen bevat, zonder de onderliggende applicatie te wijzigen:
# ModSecurity regel voor CVE-2021-44228 (Log4Shell)
SecRule REQUEST_LINE|REQUEST_HEADERS|REQUEST_BODY "@rx \$\{(?:j(?:ndi|ava)|lower|upper|env|sys|date|base64)" \
"id:1000,\
phase:2,\
deny,\
status:403,\
log,\
msg:'Potential Log4Shell exploitation attempt',\
tag:'CVE-2021-44228'"
Virtual patching is een noodverband, geen oplossing. Het beschermt tegen bekende exploit-patronen, maar niet tegen varianten. Gebruik het om tijd te kopen, niet als vervanging voor een echte patch.
Netwerksegmentatie
Isoleer kwetsbare systemen. Als je een server niet kunt patchen, beperk dan wie erbij kan:
- Verplaats naar een geïsoleerd VLAN (zie hoofdstuk 15)
- Sta alleen verkeer toe van specifieke bronnen op specifieke poorten
- Blokkeer outbound verkeer behalve wat strikt noodzakelijk is
- Monitor al het verkeer van en naar het kwetsbare systeem
Monitoring
Wat je niet kunt patchen, moet je bewaken als een havik:
- IDS/IPS-regels specifiek voor de kwetsbaarheid
- Verhoogde logging op het kwetsbare systeem
- Alerting op exploit-indicatoren
- Regelmatige handmatige controle
Automatisering
Handmatig patchen schaalt niet. Bij tien servers kun je het handmatig doen. Bij honderd wordt het onpraktisch. Bij duizend is het onmogelijk. Automatisering is geen luxe – het is een vereiste.
Windows: WSUS / Intune
# WSUS -- Windows Server Update Services
# Configureer via Group Policy:
# Computer Configuration > Administrative Templates > Windows Components > Windows Update
# - Specify intranet Microsoft update service location: http://wsus-server:8530
# - Configure Automatic Updates: Auto download and schedule the install
# Intune -- Modern management
# Endpoint Manager > Devices > Update rings for Windows 10 and later
# - Quality update deferral: 0 dagen (kritiek), 7 dagen (overig)
# - Feature update deferral: 30 dagen
# - Compliance policy: non-compliant na 3 dagen overdueLinux: unattended-upgrades (Debian/Ubuntu)
# Installatie
sudo apt install unattended-upgrades apt-listchanges -y
# Configuratie: /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";
Unattended-Upgrade::Mail "beheer@example.com";
# Activeren
sudo dpkg-reconfigure -plow unattended-upgrades
# Testen
sudo unattended-upgrade --dry-run --debugAnsible: geautomatiseerde patching
# patch-all.yml -- Ansible playbook voor geautomatiseerde patching
---
- name: Patch Linux servers
hosts: linux_servers
become: true
serial: "25%" # Patch 25% tegelijk (rolling update)
max_fail_percentage: 10 # Stop als >10% faalt
pre_tasks:
- name: Controleer of systeem bereikbaar is
ping:
- name: Maak snapshot (VMware)
community.vmware.vmware_guest_snapshot:
hostname: "{{ vcenter_host }}"
name: "{{ inventory_hostname }}"
snapshot_name: "pre-patch-{{ ansible_date_time.date }}"
state: present
delegate_to: localhost
when: create_snapshot | default(true)
tasks:
- name: Update package cache
apt:
update_cache: yes
cache_valid_time: 3600
when: ansible_os_family == "Debian"
- name: Installeer security updates (Debian/Ubuntu)
apt:
upgrade: safe
update_cache: yes
register: apt_result
when: ansible_os_family == "Debian"
- name: Installeer security updates (RHEL/CentOS)
yum:
name: '*'
state: latest
security: yes
register: yum_result
when: ansible_os_family == "RedHat"
- name: Controleer of reboot nodig is
stat:
path: /var/run/reboot-required
register: reboot_required
when: ansible_os_family == "Debian"
- name: Reboot indien nodig
reboot:
reboot_timeout: 300
msg: "Reboot na patching"
when:
- reboot_required.stat.exists | default(false)
- allow_reboot | default(true)
post_tasks:
- name: Verifieer services
service:
name: "{{ item }}"
state: started
loop: "{{ critical_services | default([]) }}"
- name: Rapporteer resultaat
debug:
msg: "Patching {{ 'geslaagd' if not apt_result.changed and not yum_result.changed else 'voltooid met wijzigingen' }}"# Uitvoeren
ansible-playbook patch-all.yml -i inventory/productie --check # Dry run
ansible-playbook patch-all.yml -i inventory/productie # Echt patchen
# Alleen kritieke security updates
ansible-playbook patch-all.yml -i inventory/productie -e "security_only=true"De serial: "25%" parameter is cruciaal: het voorkomt dat
je alle servers tegelijk patcht en je hele omgeving platlegt als er iets
misgaat. Patch in golven. Controleer na elke golf. Ga pas door als alles
werkt.
Meten en Rapporteren
Wat je niet meet, kun je niet verbeteren. En wat je niet rapporteert, krijgt geen budget. Hier zijn de KPI’s die ertoe doen:
| KPI | Definitie | Target | Meting |
|---|---|---|---|
| Mean Time to Patch (MTTP) | Gemiddelde tijd tussen publicatie van patch en installatie | Kritiek: <48u, Hoog: <14d | Per severity categorie |
| Patch compliance rate | % systemen dat up-to-date is met patches | >95% | Per OS, per omgeving |
| Open vulnerabilities | Aantal ongepatchte kwetsbaarheden per severity | Kritiek: 0, Hoog: <10 | Trending over tijd |
| Scan coverage | % van assets dat regelmatig gescand wordt | >98% | Per netwerksegment |
| Exception count | Aantal actieve patch-uitzonderingen | Dalend | Per kwartaal |
| Overdue patches | Patches die buiten SLA vallen | <5% | Per severity |
| Rescan rate | % van geremedieerde vulns dat geverifieerd is | 100% | Per remediate-actie |
Dashboard voorbeeld
VULNERABILITY MANAGEMENT DASHBOARD -- Q1 2026
Scan Coverage: ████████████████████░ 96% (target: 98%)
Patch Compliance: ██████████████████░░░ 89% (target: 95%)
Open Vulnerabilities:
Critical: 2 ▼ (was 7) SLA: 0 overdue
High: 14 ▼ (was 23) SLA: 3 overdue
Medium: 67 ► (was 65) SLA: 8 overdue
Low: 234 ► (was 241) SLA: binnen target
MTTP (Mean Time to Patch):
Critical: 1.8 dagen ✓ (target: <2)
High: 11.2 dagen ✓ (target: <14)
Medium: 24.5 dagen ✓ (target: <30)
Low: 67.0 dagen ✓ (target: <90)
Active Exceptions: 4 (was 6)
- CVE-2023-xxxxx: Legacy ERP, verloopt 15-apr
- CVE-2024-xxxxx: SCADA systeem, verloopt 01-mei
- CVE-2024-xxxxx: Vendor patch pending, verloopt 28-mrt
- CVE-2024-xxxxx: Test-omgeving, verloopt 30-apr
De trend is belangrijker dan het absolute getal. Een organisatie die van 60% naar 85% compliance gaat, doet het beter dan een organisatie die al jaren op 90% zit en niet verbetert. Rapporteer trends, niet snapshots.
En rapporteer in de taal van het management. Niet “we hebben 47 kritieke CVE’s gepatcht.” Maar: “we hebben 47 kwetsbaarheden verholpen die actief worden gebruikt door ransomware-groepen om organisaties zoals de onze binnen te dringen.” Dat is dezelfde informatie. Het ene krijgt een knikje. Het andere krijgt budget.
Samenvatting
Vulnerability management is geen project met een einddatum. Het is een proces dat draait zolang je systemen hebt:
- Discover – je kunt niet beschermen wat je niet kent. Begin met een complete asset inventarisatie en scan continu
- Prioriteer met context – CVSS alleen is niet genoeg. Combineer CVSS, EPSS en de CISA KEV-catalogus met business context (internet-facing vs. intern)
- Patchbeleid met SLA’s – kritiek binnen 48 uur, hoog binnen 14 dagen. Geen uitzonderingen zonder schriftelijke goedkeuring en compenserende maatregel
- Compenseer wat je niet kunt patchen – virtual patching, segmentatie en monitoring kopen tijd, maar zijn geen vervanging
- Automatiseer – handmatig patchen schaalt niet. Ansible, WSUS, Intune, unattended-upgrades: kies je wapen
- Meet en rapporteer – Mean Time to Patch, compliance rate, open vulnerabilities. Rapporteer trends in de taal van het management
- Verify – een patch die niet is geverifieerd, is geen patch. Scan opnieuw na elke remediatie
De Equifax-breach kostte het bedrijf 1,4 miljard dollar. De patch die het had voorkomen was gratis en kostte vijf minuten om te installeren. Vulnerability management is het goedkoopste beveiligingsprogramma dat bestaat. Het enige dat het kost, is discipline.
Vorige: Hoofdstuk 17 – Backup & Disaster Recovery Volgende: Hoofdstuk 19 – Zero Trust Architectuur
Verder lezen in de kennisbank
Deze artikelen in het portaal geven je meer achtergrond en praktische context:
- Firewalls — de uitsmijter die niet alles tegenhoudt
- Netwerksegmentatie — waarom je niet alles aan alles moet knopen
- DNS — het telefoonboek dat het internet bij elkaar houdt
- Logging en monitoring — de bewakingscamera's van je IT-omgeving
- Zero Trust — vertrouw niemand, ook jezelf niet
Je hebt een account nodig om de kennisbank te openen. Inloggen of registreren.
Gerelateerde securitymaatregelen
Deze artikelen bieden aanvullende context en verdieping: