Windows Hardening
Netwerkgrenzen Die Echt Tellen
In netwerkbeveiliging wint structuur van improvisatie: duidelijke paden, minder privileges en expliciete trust-grenzen.
Voor Windows Hardening 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 Windows Hardening is risicoreductie in de praktijk. Technische context ondersteunt de maatregelkeuze, maar implementatie en borging staan centraal.
Inleiding
In 1988 haalde Microsoft een man binnen die het gezicht van het bedrijf voorgoed zou veranderen, al wist op dat moment niemand dat. Dave Cutler, de legendarische ingenieur achter DEC’s VMS-besturingssysteem, kreeg de opdracht om een nieuw, veilig, enterprise-waardig besturingssysteem te bouwen. Het resultaat, uitgebracht in 1993, heette Windows NT — en het was, voor die tijd, een indrukwekkend staaltje beveiligingsarchitectuur. Discretionary access controls. Security tokens. Een clean-room design dat bewust brak met de chaos van Windows 3.1 en MS-DOS. Cutler bouwde beveiliging in het fundament, niet als een laag eroverheen.
Negen jaar later, op 15 januari 2002, stuurde Bill Gates een inmiddels legendarische interne memo naar alle medewerkers van Microsoft. Het onderwerp: Trustworthy Computing. “In the past,” schreef Gates, “we’ve made our software and services more compelling for users by adding new features and functionality. […] Going forward, we must dedicate ourselves to providing customers with a computing experience that is as safe, secure, and reliable as the telephone, water, and electricity services they rely on every day.” Het was het moment waarop Microsoft, na jaren van Code Red, Nimda, en SQL Slammer, officieel pivoteerde naar beveiliging als topprioriteit.
En toch, meer dan twintig jaar na die memo en meer dan dertig jaar na Dave Cutlers beveiligingsarchitectuur, hebben de meeste Windows-servers nog steeds de Print Spooler draaien. Het is alsof je dertig jaar lang het meest geavanceerde inbraakalarmsysteem ter wereld ontwikkelt, het in elk huis installeert, en vervolgens ontdekt dat niemand het ooit heeft aangezet — omdat de handleiding 300 pagina’s telt en het alarm afgaat als je de voordeur opendoet.
Windows is het meest gebruikte besturingssysteem in zakelijke omgevingen. Het is ook het besturingssysteem met de meeste beveiligingsfuncties. En het is ook het besturingssysteem waar de meeste beveiligingsfuncties standaard uitstaan.
Dat is geen paradox. Dat is een ontwerpkeuze. Microsoft bouwt beveiliging in, maar schakelt het niet in, omdat compatibiliteit altijd wint van security. Een feature die standaard aan staat en iets breekt, levert een support-ticket op. Een feature die standaard uit staat en niet wordt ingeschakeld, levert een pentest-rapport op. En support-tickets kosten Microsoft geld. Pentest-rapporten kosten jou geld. Gates’ memo veranderde de cultuur van Microsoft. Het veranderde niet de defaults. En in de beveiliging zijn defaults alles.
Dit hoofdstuk gaat over standalone Windows-hardening — los van Active Directory. De maatregelen hier gelden voor zowel werkstations als servers. We behandelen GPO-baselines, credential-bescherming, applicatiewhitelisting, PowerShell-beveiliging, AMSI, firewall-configuratie, logging, en service-hardening. Alles wat je kunt doen om een Windows-systeem te vergrendelen zonder dat je een domeincontroller nodig hebt.
Want uiteindelijk is een domein zo sterk als zijn zwakste endpoint. En dat endpoint draait Windows. Met Print Spooler aan. Zoals altijd. Zoals het altijd al was. Zoals het waarschijnlijk nog steeds zal zijn wanneer de volgende editie van dit boek verschijnt.
GPO Security Baselines
Microsoft levert kant-en-klare security baselines via de Security Compliance Toolkit (SCT). Deze baselines bevatten GPO-configuraties die door Microsoft zelf zijn getest en aanbevolen. Het Center for Internet Security (CIS) publiceert vergelijkbare benchmarks, vaak strenger dan Microsoft’s standaard.
Baselines importeren
# Download Security Compliance Toolkit
# https://www.microsoft.com/en-us/download/details.aspx?id=55319
# Importeer een baseline in Group Policy
# Stap 1: Open de baseline met Policy Analyzer (onderdeel van SCT)
# Stap 2: Vergelijk met huidige configuratie
# Stap 3: Exporteer delta als GPO-backup
# Via LGPO.exe (lokaal, zonder domein)
.\LGPO.exe /g .\BaselineGPO\
# Via Group Policy Management (in een domein)
# Importeer de GPO-backup via "Import Settings" op een nieuw GPO-objectCIS Benchmarks toepassen
# CIS-CAT Pro Assessor -- scan huidige configuratie
.\Assessor-CLI.bat -b .\benchmarks\CIS_Microsoft_Windows_Server_2022.xml
# Of handmatig via auditpol en registry
# Controleer een specifieke instelling:
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" `
-Name "EnableSmartScreen"Belangrijke GPO-instellingen
| Instelling | Pad | Aanbevolen waarde | Doel |
|---|---|---|---|
| Credential Guard | Computer\Admin Templates\System\Device Guard |
Enabled with UEFI lock | Isoleer LSASS |
| LSA Protection | HKLM\SYSTEM\CurrentControlSet\Control\Lsa\RunAsPPL |
1 |
Blokkeer LSASS dumping |
| SMB Signing | Computer\Policies\Network\Lanman Server |
Vereist | Voorkom relay-aanvallen |
| NTLMv1 weigeren | Security Settings\Local Policies\Security Options |
Send NTLMv2 only, refuse LM & NTLM | Blokkeer downgrade |
| WDigest uitschakelen | HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest |
UseLogonCredential = 0 |
Geen plaintext wachtwoorden |
| Remote Desktop NLA | Computer\Admin Templates\Windows Components\Remote Desktop |
Enabled | Voorkom pre-auth aanvallen |
| Print Spooler | services.msc |
Disabled (tenzij nodig) | Elimineer PrintNightmare |
| LLMNR uitschakelen | Computer\Admin Templates\Network\DNS Client |
Turn off multicast name resolution | Blokkeer poisoning |
| NetBIOS uitschakelen | Netwerkadapter > TCP/IPv4 > WINS |
Disable NetBIOS over TCP/IP | Blokkeer NBNS poisoning |
| PowerShell v2 | Windows Features |
Verwijderd | Geen logging-bypass |
Credential Guard & LSA-bescherming
Credential Guard en LSA Protection zijn de twee belangrijkste maatregelen tegen credential theft op Windows. Ze beschermen het LSASS-proces – het proces dat alle authenticatie-gegevens beheert – tegen dumping en injectie.
Credential Guard
Credential Guard gebruikt Virtualization-Based Security (VBS) om een geïsoleerde container te creëren waarin Kerberos-tickets en NTLM-hashes worden opgeslagen. Zelfs een aanvaller met SYSTEM-rechten kan niet bij deze credentials.
# Activeer Credential Guard via registry
reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LsaCfgFlags /t REG_DWORD /d 1 /f
# Controleer of Credential Guard actief is
Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard |
Select-Object -ExpandProperty SecurityServicesRunning
# Waarde 1 = Credential Guard actief
# Via GPO: Computer Configuration > Administrative Templates >
# System > Device Guard > Turn On Virtualization Based Security
# Credential Guard Configuration: Enabled with UEFI lockVereisten: UEFI Secure Boot, TPM 2.0 (aanbevolen), Windows 10/11 Enterprise of Server 2016+, en geen legacy-applicaties die NTLM v1 of WDigest vereisen.
LSA Protection (RunAsPPL)
LSA Protection configureert het LSASS-proces als Protected Process Light (PPL). Dit voorkomt dat onbeschermde processen het LSASS-geheugen kunnen lezen, zelfs met administrator-rechten.
# Activeer LSA Protection
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 1 /f
# Controleer of het actief is (na reboot)
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name RunAsPPL
# Resultaat in Event Log
# Event ID 3033: LSA beschermingsmodus is geactiveerd
# Event ID 3065: code integrity check mislukt (verdacht!)Met RunAsPPL geactiveerd zal
mimikatz sekurlsa::logonpasswords falen met een access
denied. Aanvallers moeten dan eerst een signed kernel driver laden om
PPL te omzeilen – wat significant meer moeite kost en meer
detectiemogelijkheden biedt.
Remote Credential Guard
Remote Credential Guard beschermt credentials bij het gebruik van RDP. In plaats van credentials naar de remote machine te sturen, blijven ze op de lokale machine en worden Kerberos-tickets on-the-fly gegenereerd.
# Activeer Remote Credential Guard op de client
mstsc /remoteGuard
# Via GPO (client-side):
# Computer Configuration > Administrative Templates > System > Credentials Delegation
# Restrict delegation of credentials to remote servers: Require Remote Credential Guard
# Via registry (server-side -- sta Remote Credential Guard toe):
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 0 /fOverzichtstabel credential-bescherming
| Maatregel | Beschermt tegen | Configuratie | Vereisten |
|---|---|---|---|
| LSA Protection (RunAsPPL) | LSASS memory read, onbeschermde injectie | Registry RunAsPPL = 1 |
Windows 8.1+ / Server 2012 R2+ |
| Remote Credential Guard | Credential theft via RDP | GPO + mstsc /remoteGuard | Windows 10 1607+ |
| WDigest uitschakelen | Plaintext wachtwoorden in geheugen | Registry UseLogonCredential = 0 |
Standaard uit vanaf Win 8.1 |
| Protected Users groep | NTLM, WDigest, delegation | AD groepslidmaatschap | Domain functional level 2012 R2+ |
AppLocker & WDAC
Applicatiewhitelisting is de meest effectieve maatregel tegen het uitvoeren van ongeautoriseerde software. In plaats van malware proberen te herkennen (wat altijd achterloopt), sta je alleen goedgekeurde software toe.
AppLocker
AppLocker werkt met regels op basis van drie criteria:
- Publisher rules: gebaseerd op digitale handtekening (meest flexibel en betrouwbaar)
- Path rules: gebaseerd op bestandslocatie (handig maar makkelijker te omzeilen)
- Hash rules: gebaseerd op file hash (meest restrictief, breekt bij updates)
# Bekijk huidige AppLocker-policy
Get-AppLockerPolicy -Effective | Select-Object -ExpandProperty RuleCollections
# Maak een standaard AppLocker-policy op basis van huidige software
Get-AppLockerPolicy -Local | Test-AppLockerPolicy -Path "C:\Program Files\*"
# Creëer publisher-gebaseerde regels voor alles in Program Files
$rules = Get-ChildItem "C:\Program Files" -Recurse -Include *.exe |
Get-AppLockerFileInformation |
New-AppLockerPolicy -RuleType Publisher -User Everyone -Optimize
# Exporteer naar XML
$rules | Set-AppLockerPolicy -PolicyObject $_ -Merge
# Controleer of de Application Identity service draait (vereist voor AppLocker)
Get-Service AppIDSvc | Select-Object Status, StartType
Set-Service AppIDSvc -StartupType Automatic
Start-Service AppIDSvcAppLocker GPO-pad:
Computer Configuration > Policies > Windows Settings > Security Settings > Application Control Policies > AppLocker
WDAC (Windows Defender Application Control)
WDAC is de opvolger van AppLocker en werkt op kernel-niveau via code integrity policies. Het is krachtiger en moeilijker te omzeilen.
# Maak een WDAC-policy op basis van een reference machine
New-CIPolicy -Level Publisher -FilePath "C:\Policies\InitialPolicy.xml" `
-UserPEs -Fallback Hash
# Converteer naar binary
ConvertFrom-CIPolicy -XmlFilePath "C:\Policies\InitialPolicy.xml" `
-BinaryFilePath "C:\Policies\InitialPolicy.p7b"
# Deploy de policy
Copy-Item "C:\Policies\InitialPolicy.p7b" `
"C:\Windows\System32\CodeIntegrity\SIPolicy.p7b"
# Audit mode eerst (aanbevolen!) -- voeg audit-optie toe
Set-RuleOption -FilePath "C:\Policies\InitialPolicy.xml" -Option 3
# Optie 3 = Enabled:Audit ModeAppLocker vs. WDAC
| Eigenschap | AppLocker | WDAC |
|---|---|---|
| Enforcement level | User-mode | Kernel-mode |
| Bypass moeilijkheid | Meerdere bekende bypasses | Significant moeilijker |
| Beheer | GPO, eenvoudig | SCCM/Intune, complexer |
| Editie-vereiste | Enterprise/Education | Alle edities (Win 10+) |
| Geschikt voor | Werkstations, quick wins | Servers, hoge beveiliging |
| Katalogus-ondertekening | Nee | Ja |
| Managed installer | Nee | Ja |
In de praktijk: begin met AppLocker in audit-modus op werkstations. Gebruik WDAC voor servers en high-security omgevingen. En verwacht dat het eerste jaar vooral bestaat uit het uitzoeken welke obscure applicaties je organisatie allemaal draait die geen enkele digitale handtekening hebben.
PowerShell-beveiliging
PowerShell is het favoriete gereedschap van zowel systeembeheerders als aanvallers. De verdediging bestaat niet uit PowerShell uitschakelen (dat breekt te veel), maar uit het maximaliseren van zichtbaarheid en het beperken van mogelijkheden.
Constrained Language Mode (CLM)
CLM beperkt PowerShell tot een subset van functionaliteit. Geen
.NET-objecten, geen COM-objecten, geen Add-Type. De meeste
aanvalstools werken niet in CLM.
# Controleer huidige language mode
$ExecutionContext.SessionState.LanguageMode
# FullLanguage = onbeperkt (slecht)
# ConstrainedLanguage = beperkt (goed)
# CLM wordt normaal afgedwongen via WDAC of AppLocker
# Handmatig (voor testen):
[Environment]::SetEnvironmentVariable('__PSLockDownPolicy', '4', 'Machine')
# Vereist reboot; wordt omzeild zonder AppLocker/WDAC-enforcementScript Block Logging
Logt de volledige inhoud van elk PowerShell-script dat wordt uitgevoerd, inclusief gedeobfusceerde versies. Dit is essentieel voor forensisch onderzoek.
# Via GPO: Computer Configuration > Administrative Templates >
# Windows Components > Windows PowerShell > Turn on PowerShell Script Block Logging
# Of via registry:
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" /v EnableScriptBlockLogging /t REG_DWORD /d 1 /f
# Events verschijnen in:
# Microsoft-Windows-PowerShell/Operational, Event ID 4104Module Logging
Logt welke PowerShell-modules worden aangeroepen en met welke parameters.
# Via registry:
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging" /v EnableModuleLogging /t REG_DWORD /d 1 /f
# Log alle modules (wildcard):
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging\ModuleNames" /v "*" /t REG_SZ /d "*" /f
# Events in: Microsoft-Windows-PowerShell/Operational, Event ID 4103Transcription
Slaat de volledige PowerShell-sessie op als tekstbestand – inclusief invoer en uitvoer.
# Via registry:
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription" /v EnableTranscripting /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription" /v OutputDirectory /t REG_SZ /d "C:\PSTranscripts" /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription" /v EnableInvocationHeader /t REG_DWORD /d 1 /fPowerShell v2 uitschakelen
PowerShell v2 ondersteunt geen van bovenstaande logging-mechanismen.
Aanvallers gebruiken powershell -version 2 om logging te
omzeilen.
# Controleer of PowerShell v2 beschikbaar is
Get-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2
# Verwijder het
Disable-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2Root -NoRestart
Disable-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2 -NoRestartAMSI (Anti-Malware Scan Interface)
AMSI is de brug tussen applicaties en antimalware-producten. Wanneer PowerShell, VBScript, JScript, of Office macro’s code uitvoeren, wordt die code via AMSI naar de geïnstalleerde antimalware-oplossing gestuurd voor inspectie.
Wat AMSI doet
AMSI scant code na deobfuscatie. Als een aanvaller base64-gecodeerde PowerShell uitvoert, ziet AMSI de gedecodeerde versie. Dit maakt het effectief tegen veel evasion-technieken.
AMSI-providers: - Windows Defender (standaard) - Andere AV-producten die AMSI ondersteunen - Eigen AMSI-providers via de AMSI COM-interface
AMSI-omzeiling detectie en mitigatie
AMSI-bypasses bestaan omdat aanvallers de AMSI DLL in het geheugen patchen voordat hun payload wordt gescand. Veelvoorkomende technieken:
AmsiScanBufferpatching (overschrijf de functie met een return-0)- Reflectie-gebaseerde bypasses via .NET
amsiInitFailedmanipulatie
Detectie van AMSI-bypasses:
# Monitor Event ID 1116 (Windows Defender)
# "AMSI detected a bypass attempt"
# Script Block Logging vangt AMSI-bypass-pogingen op (Event ID 4104)
# Zoek naar patronen als:
# [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils')
# amsiInitFailed
# AmsiScanBuffer
# Windows Defender ASR-regel: Block Win32 API calls from Office macros
# GUID: 92E97FA1-2EDF-4476-BDD6-9DD0B4DDDC7B
Add-MpPreference -AttackSurfaceReductionRules_Ids 92E97FA1-2EDF-4476-BDD6-9DD0B4DDDC7B `
-AttackSurfaceReductionRules_Actions EnabledAMSI-provider hardening
# Controleer geregistreerde AMSI-providers
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\AMSI\Providers"
# Zorg dat Windows Defender als AMSI-provider actief is
# GUID: {2781761E-28E0-4109-99FE-B9D127C57AFE}
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\AMSI\Providers\{2781761E-28E0-4109-99FE-B9D127C57AFE}"Windows Firewall hardening
De Windows Firewall is een van de best verborgen geheimen van Windows-beveiliging. Het is een volwaardige host-based firewall die, goed geconfigureerd, een significant obstakel vormt voor laterale beweging. Maar de standaardconfiguratie is te permissief.
Default deny inbound
# Stel default deny in voor alle profielen
Set-NetFirewallProfile -Profile Domain,Public,Private `
-DefaultInboundAction Block `
-DefaultOutboundAction Allow `
-Enabled True
# Sta essentiële services toe
New-NetFirewallRule -DisplayName "Allow RDP from Management VLAN" `
-Direction Inbound -Protocol TCP -LocalPort 3389 `
-RemoteAddress 10.0.100.0/24 -Action Allow
New-NetFirewallRule -DisplayName "Allow WinRM from Management VLAN" `
-Direction Inbound -Protocol TCP -LocalPort 5985,5986 `
-RemoteAddress 10.0.100.0/24 -Action AllowBlokkeer veelgebruikte risicopoorten
# Blokkeer SMB van buiten het lokale subnet
New-NetFirewallRule -DisplayName "Block SMB Inbound" `
-Direction Inbound -Protocol TCP -LocalPort 445 `
-RemoteAddress "!10.0.0.0/8" -Action Block
# Blokkeer NetBIOS
New-NetFirewallRule -DisplayName "Block NetBIOS" `
-Direction Inbound -Protocol TCP -LocalPort 137-139 -Action Block
New-NetFirewallRule -DisplayName "Block NetBIOS UDP" `
-Direction Inbound -Protocol UDP -LocalPort 137-139 -Action Block
# Blokkeer WMI van niet-management netwerken
New-NetFirewallRule -DisplayName "Block WMI Inbound" `
-Direction Inbound -Protocol TCP -LocalPort 135 `
-RemoteAddress "!10.0.100.0/24" -Action Block
# Blokkeer LLMNR
New-NetFirewallRule -DisplayName "Block LLMNR" `
-Direction Outbound -Protocol UDP -RemotePort 5355 -Action Block
# Blokkeer mDNS
New-NetFirewallRule -DisplayName "Block mDNS" `
-Direction Outbound -Protocol UDP -RemotePort 5353 -Action BlockGPO-deployment
Computer Configuration > Policies > Windows Settings > Security Settings >
Windows Defender Firewall with Advanced Security
# Importeer firewall-regels via GPO:
# 1. Configureer regels op een reference machine
# 2. Exporteer: netsh advfirewall export "C:\fw-baseline.wfw"
# 3. Importeer via GPO of distribute via SCCM/Intune
Firewall-logging inschakelen
# Schakel logging in voor alle profielen
Set-NetFirewallProfile -Profile Domain,Public,Private `
-LogAllowed True `
-LogBlocked True `
-LogFileName "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" `
-LogMaxSizeKilobytes 32768Audit policy & logging
Windows heeft een uitgebreid audit-framework. Het probleem is niet dat het er niet is. Het probleem is dat niemand het aanzet, en als ze het aanzetten, niemand naar de logs kijkt.
Advanced Audit Policy Configuration
:: Schakel geavanceerde audit in (vervangt basic audit)
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
auditpol /set /subcategory:"Logoff" /success:enable
auditpol /set /subcategory:"Special Logon" /success:enable
auditpol /set /subcategory:"Process Creation" /success:enable
auditpol /set /subcategory:"Security Group Management" /success:enable
auditpol /set /subcategory:"User Account Management" /success:enable /failure:enable
auditpol /set /subcategory:"Scheduled Task" /success:enable /failure:enable
auditpol /set /subcategory:"Security System Extension" /success:enable
:: Schakel command line logging in bij proces-creatie
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit" /v ProcessCreationIncludeCmdLine_Enabled /t REG_DWORD /d 1 /f
:: Bekijk huidige configuratie
auditpol /get /category:*Belangrijke Event IDs
| Event ID | Beschrijving | Waarom belangrijk |
|---|---|---|
| 4624 | Succesvolle logon | Baseline voor wie inlogt, met welk type (type 3 = netwerk, type 10 = RDP) |
| 4625 | Mislukte logon | Brute force detectie, wachtwoord spray |
| 4648 | Logon met expliciete credentials | Iemand gebruikt runas of alternate credentials –
verdacht |
| 4672 | Special privileges toegewezen | Admin-logon detectie, privilege escalation |
| 4688 | Nieuw proces aangemaakt | Process tree reconstruction, command line auditing |
| 4698 | Scheduled task aangemaakt | Persistence-mechanisme detectie |
| 4720 | Gebruikersaccount aangemaakt | Ongeautoriseerde account-creatie |
| 4732 | Lid toegevoegd aan lokale groep | Privilege escalation (bijv. toevoeging aan Administrators) |
| 7045 | Service geïnstalleerd | Persistence via services, PSExec-detectie |
Sysmon deployment
Sysmon is de uitbreiding op de standaard Windows-logging die elke serieuze omgeving nodig heeft. Het logt procesaanmaak met parent-child relaties, netwerkverbindingen, file creatie, registry-wijzigingen, en meer.
# Download Sysmon van Sysinternals
# Gebruik SwiftOnSecurity's configuratie als startpunt:
# https://github.com/SwiftOnSecurity/sysmon-config
# Installeer Sysmon met configuratie
.\Sysmon64.exe -accepteula -i sysmonconfig-export.xml
# Update configuratie
.\Sysmon64.exe -c sysmonconfig-export.xml
# Belangrijke Sysmon Event IDs:
# 1 - Process Create (met parent, command line, hashes)
# 3 - Network Connection
# 7 - Image Loaded (DLL loading)
# 8 - CreateRemoteThread (process injection)
# 10 - ProcessAccess (LSASS access!)
# 11 - FileCreate
# 13 - RegistryEvent (value set)
# 22 - DNSEvent (DNS queries)Sysmon Event ID 10 met TargetImage die eindigt op
lsass.exe is een van de meest waardevolle detectie-regels
die je kunt implementeren. Het detecteert credential dumping-pogingen in
real-time.
Service hardening
Elke draaiende service is een potentieel aanvalsoppervlak. Windows draait standaard tientallen services waarvan de meeste niet nodig zijn.
Onnodige services uitschakelen
| Service | Risico | Actie |
|---|---|---|
Print Spooler (Spooler) |
PrintNightmare, SpoolFool, privilege escalation | Uitschakelen tenzij het systeem een printserver is |
Remote Registry (RemoteRegistry) |
Remote registry enumeration | Uitschakelen |
Windows Remote Management (WinRM) |
Laterale beweging via PowerShell Remoting | Uitschakelen tenzij beheerd via management-VLAN |
| NetBIOS over TCP/IP | NBNS poisoning, reconnaissance | Uitschakelen per adapter |
Server (LanmanServer) |
SMB-aanvallen als SMB niet nodig is | Uitschakelen op werkstations |
| Xbox-services | Geen enkel zakelijk doel | Uitschakelen |
| Fax Service | Het is 2026 | Uitschakelen |
# Schakel Print Spooler uit
Stop-Service -Name Spooler -Force
Set-Service -Name Spooler -StartupType Disabled
# Schakel Remote Registry uit
Stop-Service -Name RemoteRegistry -Force
Set-Service -Name RemoteRegistry -StartupType Disabled
# Bulk: schakel meerdere services uit
$services = @('Spooler', 'RemoteRegistry', 'Fax', 'XblAuthManager', 'XblGameSave')
foreach ($svc in $services) {
Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
Set-Service -Name $svc -StartupType Disabled -ErrorAction SilentlyContinue
Write-Host "[+] Disabled: $svc"
}Service accounts: gMSA
Gebruik Group Managed Service Accounts (gMSA) in plaats van gewone gebruikersaccounts voor services. gMSA’s hebben automatisch geroteerde, 240-teken lange wachtwoorden die niet door mensen beheerd hoeven te worden.
# Maak een gMSA aan (vereist AD)
New-ADServiceAccount -Name "svc_webapp" `
-DNSHostName "svc_webapp.corp.local" `
-PrincipalsAllowedToRetrieveManagedPassword "WebServers$"
# Installeer op de doelserver
Install-ADServiceAccount -Identity "svc_webapp"
# Test
Test-ADServiceAccount -Identity "svc_webapp"
# Configureer de service om de gMSA te gebruiken
# Service > Properties > Log On > This account: CORP\svc_webapp$Een service account met een wachtwoord dat in een Excel-sheet staat en elke drie jaar handmatig wordt geroteerd, is een service account dat al gecompromitteerd is. Je weet het alleen nog niet.
Er is iets diep ironisch aan een besturingssysteem dat meer dan zeshonderd Group Policy-instellingen heeft voor beveiliging, maar er standaard precies nul van inschakelt. Microsoft bouwt Credential Guard, AppLocker, WDAC, CLM, Script Block Logging, AMSI, ASR-regels, Exploit Guard, en nog twintig andere features – en levert het allemaal uit in de stand “uit”.
Het is alsof je een auto koopt met airbags, ABS, lane assist, noodremsysteem, en blind spot monitoring, maar alles zit achter een schakelaarpaneel in de kofferbak dat je zelf moet aansluiten. Met een handleiding van driehonderd pagina’s. In het Engels. Zonder illustraties.
En dan die Print Spooler. Die onsterfelijke Print Spooler. Er is geen service in de geschiedenis van de informatica die meer CVE’s heeft opgeleverd, meer pentests heeft vergemakkelijkt, en meer “critical” patches heeft vereist dan de Windows Print Spooler. PrintNightmare. SpoolFool. PrinterBug. Elk jaar een nieuwe variant. Elk jaar dezelfde vraag: “Waarom staat die service eigenlijk aan?” En elk jaar hetzelfde antwoord: “Omdat Marie van boekhouding soms een PDF wil printen.”
Marie. Van boekhouding. Op een server. Die in een datacenter staat. Waar geen printer staat.
“Maar het staat standaard aan!” Ja. Dat is het punt. Windows is een besturingssysteem dat ontworpen is voor maximale compatibiliteit, niet voor maximale beveiliging. Elke feature staat standaard aan, elke poort staat standaard open, elke service draait standaard. En wij mogen het dichtschroeven. Feature voor feature. Service voor service. Registry key voor registry key. Alsof we een schip bouwen dat standaard zinkt en wij de gaten moeten dichten.
Het goede nieuws: de gaten zijn gedocumenteerd. Het slechte nieuws: het schip vaart al.
Veelvoorkomende fouten
| Fout | Gevolg | Oplossing |
|---|---|---|
| Print Spooler aan op servers | PrintNightmare, privilege escalation, coercion | Uitschakelen op alles behalve printservers |
| WDigest ingeschakeld | Plaintext wachtwoorden in LSASS-geheugen | Registry: UseLogonCredential = 0 |
| Geen Script Block Logging | Geen zicht op PowerShell-aanvallen | GPO: enable Script Block Logging |
| PowerShell v2 beschikbaar | Aanvallers omzeilen alle logging | Feature verwijderen |
| Lokaal admin-wachtwoord overal hetzelfde | Eenmaal gekraakt = overal toegang | Implementeer LAPS |
| Geen Sysmon | Geen process-level visibility | Deploy Sysmon met goede config |
| AppLocker in allow-all modus | Geen applicatiecontrole | Configureer publisher rules |
| Firewall-logging uit | Geen zicht op geblokkeerd/toegestaan verkeer | Schakel logging in op alle profielen |
| Audit policy op basic in plaats van advanced | Onvoldoende detail in security logs | Schakel Advanced Audit Policy in |
| Geen command line logging bij 4688 | Process events zonder context | Registry:
ProcessCreationIncludeCmdLine_Enabled = 1 |
| Remote Desktop zonder NLA | Pre-authentication aanvallen mogelijk | Vereis Network Level Authentication |
Checklist
| # | Maatregel | Prioriteit | Complexiteit | Impact |
|---|---|---|---|---|
| 1 | Print Spooler uitschakelen (niet-printservers) | Kritiek | Laag | Elimineert hele klasse aanvallen |
| 2 | LSA Protection (RunAsPPL) inschakelen | Kritiek | Laag | Blokkeert LSASS dumping |
| 3 | Script Block Logging inschakelen | Kritiek | Laag | Zichtbaarheid op PowerShell-aanvallen |
| 4 | PowerShell v2 verwijderen | Kritiek | Laag | Voorkomt logging-bypass |
| 5 | LLMNR en NetBIOS uitschakelen | Kritiek | Laag | Voorkomt name poisoning |
| 6 | WDigest uitschakelen | Kritiek | Laag | Geen plaintext credentials |
| 7 | Sysmon deployen | Hoog | Gemiddeld | Diepgaande endpoint-visibility |
| 8 | Advanced Audit Policy configureren | Hoog | Gemiddeld | Forensisch bruikbare logs |
| 9 | Command line logging (4688) | Hoog | Laag | Process context in logs |
| 10 | Credential Guard activeren | Hoog | Gemiddeld | Isolatie van credentials |
| 11 | LAPS implementeren | Hoog | Gemiddeld | Unieke lokale admin-wachtwoorden |
| 12 | Windows Firewall default deny inbound | Hoog | Gemiddeld | Host-level segmentatie |
| 13 | AppLocker in enforce mode | Hoog | Hoog | Applicatiewhitelisting |
| 14 | Onnodige services uitschakelen | Gemiddeld | Laag | Verkleind aanvalsoppervlak |
| 15 | Remote Credential Guard voor RDP | Gemiddeld | Gemiddeld | Credential bescherming bij remote beheer |
| 16 | WDAC voor servers | Gemiddeld | Hoog | Kernel-level application control |
| 17 | Firewall-logging inschakelen | Gemiddeld | Laag | Netwerkzichtbaarheid op endpoint-niveau |
| 18 | Module Logging en Transcription | Gemiddeld | Laag | Aanvullende PowerShell-zichtbaarheid |
| 19 | gMSA voor service accounts | Gemiddeld | Gemiddeld | Automatische wachtwoordrotatie |
| 20 | Security baselines importeren (SCT/CIS) | Gemiddeld | Gemiddeld | Gevalideerde configuratie |
De eerste zes maatregelen zijn registry-wijzigingen of GPO-instellingen die je in een middag kunt uitrollen. Ze kosten niets, breken zelden iets, en elimineren de meest voorkomende aanvalstechnieken. Als je morgen begint, begin daar.
Samenvatting
Windows-hardening is geen mysterie. De maatregelen zijn gedocumenteerd, de tools zijn ingebouwd, en de configuratie is grotendeels een kwestie van GPO’s en registry-instellingen. Het probleem is nooit geweest dat we niet weten wat we moeten doen. Het probleem is dat we het niet doen. Credential Guard staat uit omdat er een legacy-applicatie is. AppLocker staat in audit-modus omdat niemand de enforce-knop durft in te drukken. Print Spooler draait omdat “het altijd al zo was”. En ondertussen loggen we niets, monitoren we niets, en zijn we verbaasd als er iets misgaat. De rode draad door dit hoofdstuk is eenvoudig: schakel in wat Microsoft heeft gebouwd. Begin met de zes kritieke maatregelen uit de checklist – dat kost een middag en elimineert tachtig procent van de gangbare aanvalstechnieken. Bouw daarna stap voor stap verder. En schakel die Print Spooler uit. Nu.
In het volgende hoofdstuk behandelen we e-mail- en DNS-hardening: hoe je SPF, DKIM, en DMARC configureert, DNS-manipulatie voorkomt, en voorkomt dat je mailserver het favoriete speeltje wordt van elke spammer en phisher op het internet.
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: