MSSQL Hardening
SQL Zonder Slaaptekort
In netwerkbeveiliging wint structuur van improvisatie: duidelijke paden, minder privileges en expliciete trust-grenzen.
Bij MSSQL Hardening gaat het om strikte invoergrenzen, parameterized queries en reviews die query-risico vroeg stoppen.
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 MSSQL Hardening is risicoreductie in de praktijk. Technische context ondersteunt de maatregelkeuze, maar implementatie en borging staan centraal.
Installatie & configuratie
Een SQL Server-installatie begint met keuzes die de rest van het beveiligingsverhaal bepalen. De meeste organisaties klikken door de wizard heen alsof het een EULA is — niemand leest het, iedereen klikt “Next”.
Minimale installatie
Installeer alleen de features die daadwerkelijk nodig zijn. De standaard “selecteer alles” aanpak levert een aanvalsoppervlak op dat groter is dan nodig:
Features die je waarschijnlijk NIET nodig hebt:
- SQL Server Replication (tenzij je het echt gebruikt)
- Full-Text and Semantic Extractions for Search
- Analysis Services
- Reporting Services
- Integration Services
- Machine Learning Services (R/Python)
- PolyBase Query Service for External Data
- Data Quality Services
Elke feature die geinstalleerd is maar niet gebruikt wordt, is een potentieel aanvalsoppervlak dat gepatcht moet worden maar door niemand gemonitord wordt.
Named instances en poorten
Gebruik named instances in plaats van de default instance, en wijzig de standaard TCP-poort:
-- Controleer de huidige poortconfiguratie
SELECT local_tcp_port
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;# TCP-poort wijzigen via SQL Server Configuration Manager
# Of via registry (pas op: dit vereist een restart)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQLServer\SuperSocketNetLib\Tcp\IPAll" `
-Name "TcpPort" -Value "41433"
# SQL Browser service uitschakelen als je geen named instances discovert
Set-Service -Name "SQLBrowser" -StartupType Disabled
Stop-Service -Name "SQLBrowser"Standaardpoort 1433 is het eerste dat elke scanner controleert. Het wijzigen ervan is geen beveiligingsmaatregel op zich — security through obscurity is geen security — maar het filtert wel het achtergrondlawaai van geautomatiseerde scanners.
Patch management
# Controleer de huidige versie en patch level
SELECT @@VERSION;
SELECT SERVERPROPERTY('ProductVersion') AS Version,
SERVERPROPERTY('ProductLevel') AS PatchLevel,
SERVERPROPERTY('Edition') AS Edition;Houd SQL Server altijd up-to-date met de laatste Cumulative Updates. Microsoft brengt maandelijks CU’s uit. Veel organisaties patchen hun Windows-servers braaf, maar vergeten SQL Server — alsof de database-engine op magische wijze immuun is voor kwetsbaarheden.
Authenticatie
Windows Authentication vs Mixed Mode
SQL Server biedt twee authenticatie-modi:
| Modus | Beschrijving | Aanbevolen? |
|---|---|---|
| Windows Authentication Mode | Alleen Windows/AD-accounts | Ja |
| Mixed Mode | Windows + SQL Server logins | Alleen als het niet anders kan |
Windows Authentication is altijd de voorkeur: - Kerberos-authenticatie met ticket-gebaseerde tokens - Geen wachtwoorden over het netwerk - Centrale wachtwoordpolicies via Active Directory - Account lockout en audit via bestaande AD-infrastructuur
Mixed Mode is soms nodig voor legacy-applicaties die SQL-logins verwachten. Documenteer waarom Mixed Mode nodig is en beperk het aantal SQL-logins tot het absolute minimum.
Het sa-account
Het sa-account is de heilige graal voor elke aanvaller.
Standaard aanwezig, altijd sysadmin, en bij veel organisaties
geconfigureerd met het wachtwoord “sa”, “P@ssw0rd”, of gewoon leeg.
-- Stap 1: Hernoem het sa-account
ALTER LOGIN sa WITH NAME = [sql_disabled_admin];
-- Stap 2: Stel een sterk wachtwoord in (minimaal 30 tekens)
ALTER LOGIN [sql_disabled_admin] WITH PASSWORD = 'HIER-EEN-LANG-RANDOM-WACHTWOORD-VAN-30+-TEKENS!';
-- Stap 3: Schakel het account uit
ALTER LOGIN [sql_disabled_admin] DISABLE;
-- Verifieer dat sa uitgeschakeld is
SELECT name, is_disabled, is_policy_checked, is_expiration_checked
FROM sys.sql_logins
WHERE principal_id = 1;Password policy enforcement
Voor SQL-logins die wel nodig zijn, forceer wachtwoordbeleid:
-- Maak een login met password policy enforcement
CREATE LOGIN [app_service]
WITH PASSWORD = 'SterkWachtwoord!ComplexGenoeg123',
CHECK_POLICY = ON,
CHECK_EXPIRATION = ON;
-- Controleer bestaande logins op policy-status
SELECT name,
is_policy_checked,
is_expiration_checked,
create_date,
modify_date
FROM sys.sql_logins
WHERE is_policy_checked = 0 OR is_expiration_checked = 0;CHECK_POLICY = ON dwingt de Windows-wachtwoordpolicy af
op SQL-logins. CHECK_EXPIRATION = ON zorgt ervoor dat
wachtwoorden verlopen. Beide staan standaard aan voor nieuwe logins,
maar worden regelmatig uitgeschakeld “omdat de applicatie anders niet
meer kan verbinden.”
Autorisatie & least privilege
Service accounts
De SQL Server-service zelf draait onder een account. Gebruik
hiervoor: - Een Group Managed Service Account (gMSA) —
automatische wachtwoord-rotatie, geen menselijke interventie - Of een
dedicated domain service account met minimale rechten -
Nooit: LocalSystem, NT AUTHORITY\SYSTEM, of
een domain admin-account
Database-level vs server-level roles
| Niveau | Rol | Gebruik |
|---|---|---|
| Server | sysadmin | Nooit toekennen tenzij absoluut nodig |
| Server | securityadmin | Beheer van logins en permissies |
| Server | serveradmin | Server-brede configuratie |
| Server | dbcreator | Databases aanmaken |
| Database | db_owner | Volledige controle over een database |
| Database | db_datareader | Alleen SELECT op alle tabellen |
| Database | db_datawriter | INSERT, UPDATE, DELETE op alle tabellen |
| Database | db_executor | EXECUTE op alle stored procedures |
Least privilege in de praktijk
-- Stap 1: Maak een server login
CREATE LOGIN [app_reader] WITH PASSWORD = 'SterkWachtwoord!456';
-- Stap 2: Maak een database user
USE [ProductieDB];
CREATE USER [app_reader] FOR LOGIN [app_reader];
-- Stap 3: Ken ALLEEN de minimale rechten toe
-- NIET: ALTER ROLE db_datareader ADD MEMBER [app_reader];
-- WEL: granulaire permissies op schema-niveau
GRANT SELECT ON SCHEMA::dbo TO [app_reader];
-- Of nog specifieker: alleen bepaalde tabellen
GRANT SELECT ON dbo.Products TO [app_reader];
GRANT SELECT ON dbo.Categories TO [app_reader];
-- Expliciet weigeren wat niet mag
DENY SELECT ON dbo.AuditLog TO [app_reader];
DENY SELECT ON dbo.UserCredentials TO [app_reader];
-- Verifieer effectieve permissies
EXECUTE AS USER = 'app_reader';
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
REVERT;GRANT, DENY, REVOKE
De volgorde van prioriteit: DENY wint altijd van
GRANT. Gebruik DENY bewust en spaarzaam:
-- REVOKE verwijdert een eerder toegekende permissie
REVOKE EXECUTE ON dbo.sp_GetSensitiveData FROM [app_user];
-- DENY blokkeert expliciet, zelfs als een andere rol GRANT heeft
DENY VIEW DEFINITION ON SCHEMA::dbo TO [app_user];Gevaarlijke features uitschakelen
Dit is waar de meeste SQL Server-installaties falen. Features die “voor het gemak” aanstaan en die een aanvaller directe code-executie op het besturingssysteem geven.
xp_cmdshell
De beroemdste. Voert willekeurige OS-commando’s uit vanuit SQL Server. Er is geen legitieme reden om dit in productie aan te hebben staan.
-- Controleer de huidige status
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell';
-- Uitschakelen
EXEC sp_configure 'xp_cmdshell', 0;
RECONFIGURE;
-- Verifieer
EXEC sp_configure 'xp_cmdshell';
-- run_value moet 0 zijnOLE Automation
sp_OACreate, sp_OAMethod, en aanverwanten
bieden een alternatieve route naar OS-commando-executie:
CLR Integration
Staat toe om .NET-assemblies te laden en uit te voeren in SQL Server. Legitiem voor complexe stored procedures, maar ook een aanvalsvector:
-- Uitschakelen als niet nodig
EXEC sp_configure 'clr enabled', 0;
RECONFIGURE;
-- Als CLR wel nodig is: beperk tot SAFE assemblies
-- en gebruik CLR strict security (SQL 2017+)
EXEC sp_configure 'clr strict security', 1;
RECONFIGURE;Ad Hoc Distributed Queries
Maakt OPENROWSET en OPENDATASOURCE mogelijk — handig voor aanvallers om data te exfiltreren:
Database Mail
Als Database Mail nodig is, beveilig het dan:
-- Beperk wie Database Mail mag gebruiken
-- Verwijder onnodige gebruikers uit de DatabaseMailUserRole
USE msdb;
EXEC sp_droprolemember 'DatabaseMailUserRole', 'onnodige_user';
-- Controleer huidige leden
SELECT dp.name
FROM sys.database_role_members drm
JOIN sys.database_principals dp ON drm.member_principal_id = dp.principal_id
JOIN sys.database_principals dr ON drm.role_principal_id = dr.principal_id
WHERE dr.name = 'DatabaseMailUserRole';Overzicht gevaarlijke features
| Feature | sp_configure optie | Standaard | Aanbevolen | Risico |
|---|---|---|---|---|
| xp_cmdshell | xp_cmdshell | 0 (uit) | 0 (uit) | OS command execution |
| OLE Automation | Ole Automation Procedures | 0 (uit) | 0 (uit) | OS command execution |
| CLR | clr enabled | 0 (uit) | 0 (uit) | Arbitrary code execution |
| Ad Hoc Queries | Ad Hoc Distributed Queries | 0 (uit) | 0 (uit) | Data exfiltratie |
| Remote Admin | remote admin connections | 0 (uit) | 0 (uit) | Remote DAC access |
| External Scripts | external scripts enabled | 0 (uit) | 0 (uit) | Python/R execution |
Linked Servers beveiligen
Linked servers zijn een van de meest onderschatte risico’s in SQL Server-omgevingen. Ze creeren vertrouwensrelaties tussen servers die zelden worden geauditeerd.
-- Toon alle geconfigureerde linked servers
EXEC sp_linkedservers;
-- Gedetailleerde informatie over linked server logins
SELECT s.name AS LinkedServer,
s.data_source,
s.provider,
ll.uses_self_credential,
ll.remote_name
FROM sys.servers s
LEFT JOIN sys.linked_logins ll ON s.server_id = ll.server_id
WHERE s.is_linked = 1;Best practices voor linked servers
- Gebruik dedicated accounts — nooit sa of sysadmin-leden als remote login
- Minimale permissies — de remote login heeft alleen de rechten nodig die de query vereist
- Verwijder ongebruikte linked servers — als niemand weet waarom een linked server bestaat, is het waarschijnlijk niet nodig
- Beperk RPC — schakel RPC uit op linked servers waar het niet nodig is
-- Beperk een linked server: schakel RPC uit
EXEC sp_serveroption @server = 'LINKED_SRV01', @optname = 'rpc out', @optvalue = 'false';
-- Wijzig de login mapping naar een dedicated account
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'LINKED_SRV01',
@useself = 'false',
@locallogin = NULL,
@rmtuser = 'linked_readonly',
@rmtpassword = 'SterkWachtwoord!789';Het gevaar van linked servers is de kettingreactie: Server A vertrouwt Server B, Server B vertrouwt Server C. Compromitteer A en je hebt een pad naar C. Linked server chains zijn een favoriete techniek bij laterale beweging in database-omgevingen.
Netwerk-isolatie
Firewall-regels
SQL Server hoort niet direct bereikbaar te zijn vanaf het internet. Punt.
# Windows Firewall: alleen specifieke subnets toestaan
New-NetFirewallRule -DisplayName "SQL Server - App Servers" `
-Direction Inbound -Protocol TCP -LocalPort 41433 `
-RemoteAddress "10.1.2.0/24" -Action Allow
New-NetFirewallRule -DisplayName "SQL Server - Management" `
-Direction Inbound -Protocol TCP -LocalPort 41433 `
-RemoteAddress "10.1.0.0/24" -Action Allow
# Blokkeer al het andere SQL-verkeer
New-NetFirewallRule -DisplayName "SQL Server - Block All Other" `
-Direction Inbound -Protocol TCP -LocalPort 41433 `
-Action BlockTLS/SSL afdwingen
# SQL Server Configuration Manager > SQL Server Network Configuration
# > Protocols > Properties > Flags tab
# Stel "Force Encryption" in op "Yes"
# Of via registry
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQLServer\SuperSocketNetLib" `
-Name "ForceEncryption" -Value 1Installeer een geldig TLS-certificaat (niet het zelf-gegenereerde certificaat dat SQL Server standaard aanmaakt). Gebruik minimaal TLS 1.2:
# Schakel oudere TLS-versies uit op OS-niveau
# TLS 1.0 uitschakelen
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" -Force
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" `
-Name "Enabled" -Value 0Audit & logging
SQL Server Audit
SQL Server heeft een ingebouwd audit-framework dat granulaire logging biedt:
-- Stap 1: Maak een Server Audit aan
CREATE SERVER AUDIT [SecurityAudit]
TO FILE (
FILEPATH = 'D:\SQLAudit\',
MAXSIZE = 256 MB,
MAX_ROLLOVER_FILES = 20,
RESERVE_DISK_SPACE = OFF
)
WITH (
QUEUE_DELAY = 1000,
ON_FAILURE = CONTINUE
);
-- Stap 2: Schakel de audit in
ALTER SERVER AUDIT [SecurityAudit] WITH (STATE = ON);
-- Stap 3: Maak een Server Audit Specification
CREATE SERVER AUDIT SPECIFICATION [LoginAuditSpec]
FOR SERVER AUDIT [SecurityAudit]
ADD (FAILED_LOGIN_GROUP),
ADD (SUCCESSFUL_LOGIN_GROUP),
ADD (LOGIN_CHANGE_PASSWORD_GROUP),
ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP),
ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP),
ADD (AUDIT_CHANGE_GROUP);
ALTER SERVER AUDIT SPECIFICATION [LoginAuditSpec] WITH (STATE = ON);
-- Stap 4: Database-level audit (per database)
USE [ProductieDB];
CREATE DATABASE AUDIT SPECIFICATION [DataAccessAudit]
FOR SERVER AUDIT [SecurityAudit]
ADD (SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo BY public),
ADD (EXECUTE ON SCHEMA::dbo BY public);
ALTER DATABASE AUDIT SPECIFICATION [DataAccessAudit] WITH (STATE = ON);Login auditing
Minimaal moeten failed logins gelogd worden. Bij voorkeur ook successful logins:
-- Stel login auditing in (0=geen, 1=failed, 2=success, 3=beide)
EXEC xp_instance_regwrite
N'HKEY_LOCAL_MACHINE',
N'Software\Microsoft\MSSQLServer\MSSQLServer',
N'AuditLevel',
REG_DWORD, 3;Key events om te monitoren
| Event | Wat het betekent | Prioriteit |
|---|---|---|
| Failed logins (bulk) | Brute-force poging | Hoog |
| sa login succesvol | Iemand gebruikt sa | Kritiek |
| xp_cmdshell re-enabled | Feature wordt weer aangezet | Kritiek |
| Nieuwe sysadmin member | Privilege escalation | Kritiek |
| Linked server aangemaakt | Potentiele laterale beweging | Hoog |
| Backup naar onbekende locatie | Mogelijke data-exfiltratie | Hoog |
| DBCC commando’s | Mogelijk reconnaissance | Gemiddeld |
Backup-beveiliging
Backups bevatten dezelfde data als de productiedatabase. Als de backup niet beveiligd is, is de data niet beveiligd.
Backup-encryptie
-- Stap 1: Maak een Database Master Key
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MasterKeyWachtwoord!Complex789';
-- Stap 2: Maak een certificaat voor backup-encryptie
CREATE CERTIFICATE BackupEncryptCert
WITH SUBJECT = 'Database Backup Encryption Certificate',
EXPIRY_DATE = '2030-12-31';
-- Stap 3: Maak een versleutelde backup
BACKUP DATABASE [ProductieDB]
TO DISK = 'D:\Backups\ProductieDB_encrypted.bak'
WITH COMPRESSION,
ENCRYPTION (
ALGORITHM = AES_256,
SERVER CERTIFICATE = BackupEncryptCert
);
-- BELANGRIJK: Backup het certificaat zelf ook!
BACKUP CERTIFICATE BackupEncryptCert
TO FILE = 'D:\CertBackup\BackupEncryptCert.cer'
WITH PRIVATE KEY (
FILE = 'D:\CertBackup\BackupEncryptCert.pvk',
ENCRYPTION BY PASSWORD = 'CertBackupWachtwoord!456'
);Transparent Data Encryption (TDE)
TDE versleutelt de database-bestanden op disk, inclusief de tempdb:
-- Stap 1: Master Key (als die nog niet bestaat)
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'TDEMasterKey!Complex123';
-- Stap 2: Certificaat
CREATE CERTIFICATE TDECert WITH SUBJECT = 'TDE Certificate';
-- Stap 3: Database Encryption Key
USE [ProductieDB];
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE TDECert;
-- Stap 4: Schakel TDE in
ALTER DATABASE [ProductieDB] SET ENCRYPTION ON;
-- Controleer de status
SELECT db.name, db.is_encrypted,
dek.encryption_state, dek.key_algorithm, dek.key_length
FROM sys.databases db
LEFT JOIN sys.dm_database_encryption_keys dek
ON db.database_id = dek.database_id;NTFS-permissies op backup-bestanden
# Beperk toegang tot de backup-directory
$acl = Get-Acl "D:\Backups"
$acl.SetAccessRuleProtection($true, $false)
# Alleen SQL Server service account en backup-operators
$rule1 = New-Object System.Security.AccessControl.FileSystemAccessRule(
"NT SERVICE\MSSQLSERVER", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
$rule2 = New-Object System.Security.AccessControl.FileSystemAccessRule(
"DOMAIN\SQL-BackupOperators", "Read,Write", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule1)
$acl.AddAccessRule($rule2)
Set-Acl "D:\Backups" $aclVeelvoorkomende fouten
| # | Fout | Risico | Oplossing |
|---|---|---|---|
| 1 | sa-account met zwak wachtwoord | Volledige server-compromittatie | Uitschakelen, hernoemen, sterk wachtwoord |
| 2 | Mixed Mode zonder noodzaak | Groter aanvalsoppervlak | Windows Authentication Only |
| 3 | xp_cmdshell ingeschakeld | OS command execution | Uitschakelen via sp_configure |
| 4 | SQL Server als LocalSystem | Service draait met maximale rechten | Dedicated (g)MSA met minimale rechten |
| 5 | Poort 1433 open naar internet | Direct bereikbaar voor aanvallers | Firewall, netwerksegmentatie |
| 6 | Geen TLS/SSL | Credentials in plaintext over netwerk | Force Encryption + geldig certificaat |
| 7 | Linked servers met sa-credentials | Laterale beweging tussen servers | Dedicated accounts, minimale rechten |
| 8 | Backups onversleuteld op network share | Data-lekkage via backup-bestanden | Backup-encryptie (AES-256) |
| 9 | Geen audit logging | Geen zichtbaarheid bij incident | SQL Server Audit + SIEM-integratie |
| 10 | Applicatie-accounts met sysadmin | Elke SQLi = volledige compromittatie | Least privilege, schema-level permissies |
| 11 | CLR zonder strict security | Arbitrary .NET code execution | clr strict security inschakelen |
| 12 | Geen patch management | Bekende CVE’s exploiteerbaar | Maandelijkse CU-installatie plannen |
Checklist
| Prioriteit | Maatregel | Status |
|---|---|---|
| Kritiek | sa-account uitgeschakeld of hernoemd met sterk wachtwoord | [ ] |
| Kritiek | xp_cmdshell uitgeschakeld | [ ] |
| Kritiek | OLE Automation uitgeschakeld | [ ] |
| Kritiek | Windows Authentication Mode (of Mixed Mode met documentatie) | [ ] |
| Kritiek | SQL Server niet bereikbaar vanaf internet | [ ] |
| Kritiek | Laatste Cumulative Update geinstalleerd | [ ] |
| Hoog | TLS/SSL Force Encryption ingeschakeld | [ ] |
| Hoog | Dedicated service account (gMSA) voor SQL Server service | [ ] |
| Hoog | Login auditing ingeschakeld (failed + successful) | [ ] |
| Hoog | Backup-encryptie (AES-256) | [ ] |
| Hoog | Linked servers geauditeerd en beveiligd | [ ] |
| Hoog | Applicatie-accounts met minimale rechten (geen sysadmin) | [ ] |
| Hoog | CHECK_POLICY en CHECK_EXPIRATION op alle SQL-logins | [ ] |
| Gemiddeld | CLR uitgeschakeld of strict security ingeschakeld | [ ] |
| Gemiddeld | Ad Hoc Distributed Queries uitgeschakeld | [ ] |
| Gemiddeld | TDE ingeschakeld voor gevoelige databases | [ ] |
| Gemiddeld | SQL Server Audit met SIEM-integratie | [ ] |
| Gemiddeld | TCP-poort gewijzigd (niet 1433) | [ ] |
| Gemiddeld | SQL Browser service uitgeschakeld | [ ] |
| Gemiddeld | Database Mail beperkt tot geautoriseerde gebruikers | [ ] |
| Laag | Named instances in gebruik | [ ] |
| Laag | NTFS-permissies op backup-bestanden gecontroleerd | [ ] |
| Laag | Certificaten voor TDE/backup-encryptie veilig opgeslagen | [ ] |
Er is een specifiek type DBA dat SQL Server beheert in de meeste organisaties. Je herkent hem aan de volgende kenmerken: hij heeft de installatie uitgevoerd door vijftien keer op “Next” te klikken, Mixed Mode geselecteerd “voor het geval dat”, en het sa-wachtwoord ingesteld op iets dat hij kan onthouden — wat in de praktijk betekent: “sa”, “Password1”, of de naam van het bedrijf met een uitroepteken erachter.
xp_cmdshell staat aan. Niet omdat iemand het nodig heeft, maar omdat er ooit, in 2014, een applicatie was die het nodig had. Die applicatie is drie jaar geleden gedecommissioneerd. De xp_cmdshell-configuratie is gebleven, als een soort digitale fossiel.
De linked servers zijn het mooiste. Server A vertrouwt Server B met het sa-account. Server B vertrouwt Server C met het sa-account. Server C vertrouwt Server D met — je raadt het al — het sa-account. Niemand weet waarom deze chain bestaat. Niemand durft er iets aan te veranderen. “Het werkt, en als ik er iets aan verander breekt de productie.” De DBA is niet incompetent. Hij is pragmatisch. En pragmatisch betekent in de IT: “het werkt, dus we raken het niet aan.”
Het resultaat is een omgeving waarin een enkele SQL injection in een webapplicatie niet leidt tot het uitlezen van een tabel, maar tot volledige OS-command execution via xp_cmdshell, gevolgd door laterale beweging via linked servers naar drie andere database-servers, gevolgd door credential harvesting, gevolgd door domain admin. Allemaal omdat iemand ooit “de applicatie heeft het nodig” heeft gezegd en niemand het ooit heeft geverifieerd.
Maar goed, de backups draaien. Onversleuteld, op een network share waar iedereen bij kan. Maar ze draaien.
Samenvatting
MSSQL-hardening draait om een beperkt aantal fundamentele maatregelen die samen het verschil maken tussen een database-server en een open deur naar je hele netwerk. Schakel gevaarlijke features uit (xp_cmdshell, OLE Automation, CLR), beveilig authenticatie (Windows Auth, sa uitschakelen, CHECK_POLICY), pas least privilege toe op elk niveau (server roles, database roles, schema-permissies), isoleer de server op netwerkniveau (firewall, TLS, geen directe internettoegang), audit alles (SQL Server Audit, login logging, SIEM-integratie), en beveilig je backups (encryptie, NTFS-permissies, TDE). Geen van deze maatregelen is revolutionair. Ze zijn allemaal gedocumenteerd, allemaal beschikbaar in de standaard SQL Server-installatie, en allemaal standaard uitgeschakeld of niet geconfigureerd. Het enige dat nodig is, is iemand die de tijd neemt om ze in te schakelen.
In het volgende hoofdstuk behandelen we netwerksegmentatie — de kunst van het opdelen van je netwerk in zones zodat een compromittatie in het ene segment niet automatisch betekent dat de aanvaller overal bij kan.
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: