Security Headers: wat doen ze voor je site?
Auteur: Redactie Domeny.ForSale Gepubliceerd
In het kort: Security Headers zijn HTTP-responsheaders die de browser regels geven om een website veilig te verwerken. Ze helpen onder meer het uitvoeren van ongewenste scripts, het insluiten van pagina’s in frames van andere websites en het prijsgeven van informatie bij het doorklikken naar andere websites te beperken. Ze vervangen veilige code en updates niet, maar vormen een extra beveiligingslaag.
Hoe beveiligingsheaders werken
Wanneer de browser een pagina ophaalt, stuurt de server de inhoud en metadata: informatie die de respons beschrijft. HTTP-headers maken deel uit van die metadata. Ze verschijnen niet in de tekst van de pagina, maar de browser kan op basis ervan beperken hoe de ontvangen bronnen worden gebruikt.
Beveiligingsheaders kunnen het gebruik van een versleutelde verbinding verplichten, toegestane bronnen voor scripts aangeven of verbieden dat een pagina wordt ingesloten in een frame op een andere website. Je stelt ze meestal in via de configuratie van de server, applicatie, reverse proxy of CDN: infrastructuur die als tussenlaag dient bij het leveren van content.
Deze beveiligingsmaatregelen worden vooral door de browser afgedwongen. Ze voorkomen niet dat andere tools rechtstreeks verzoeken naar de applicatie sturen. Daarom vervangen ze geen controle van toegangsrechten op de server.
De belangrijkste Security Headers en hun toepassingen
Er bestaat geen set instellingen die voor elke website geschikt is. De onderstaande headers richten zich op verschillende dreigingen en moeten worden afgestemd op de werking van de website.
| Header | Waarvoor dient deze? | Waar moet je op letten? |
|---|---|---|
Content-Security-Policy | Bepaalt onder meer de toegestane bronnen voor scripts, stijlen en andere middelen. | Een te strikt beleid kan een formulier, betalingen of analytics blokkeren. |
Strict-Transport-Security | Verplicht de browser gedurende een opgegeven periode HTTPS te gebruiken. | Een lange geldigheidsduur en toepassing op subdomeinen vereisen dat de hele infrastructuur daarop is voorbereid. |
X-Content-Type-Options | Beperkt met de waarde nosniff dat de browser een ander brontype afleidt dan de server heeft opgegeven. | De server moet een correcte Content-Type meesturen, bijvoorbeeld voor scripts en stylesheets. |
Referrer-Policy | Bepaalt welke informatie over het pagina-adres wordt doorgegeven in de header Referer. | De instelling moet rekening houden met privacy en de vereisten van integraties. |
Permissions-Policy | Beperkt de toegang tot bepaalde browserfuncties, zoals de camera of geolocatie. | De ondersteuning van afzonderlijke richtlijnen verschilt per browser. |
X-Frame-Options | Beperkt het insluiten van de pagina in frames. | Is minder flexibel dan de richtlijn frame-ancestors in CSP. |
CSP, oftewel Content Security Policy, helpt de gevolgen van XSS te beperken: aanvallen waarbij ongewenste code wordt uitgevoerd binnen de context van een pagina. Een lijst met vertrouwde domeinen alleen biedt geen volledige bescherming. Ook de specifieke richtlijnen, de manier waarop scripts worden geladen en het vermijden van te ruime uitzonderingen zijn van belang.
De richtlijn frame-ancestors in CSP biedt onder meer bescherming tegen clickjacking: gebruikers ertoe verleiden om op een element van een pagina te klikken die verborgen is in een andere website. Deze richtlijn kan het insluiten van de pagina volledig verbieden of alleen toestaan op opgegeven websites.
Voorbeeld: een website met een formulier en externe diensten
Stel dat een bedrijfswebsite een contactformulier, een kaart en een externe analysetool gebruikt. Als je een CSP invoert die uitsluitend bronnen van het eigen domein toestaat, kunnen de kaart en analytics uitvallen. Daarom moet je vóór de invoering vaststellen waar de website scripts, stijlen, afbeeldingen en frames vandaan haalt en waarheen de website verzoeken verstuurt.
Als de website in geen enkel frame mag worden ingesloten, ziet een voorbeeld van dat deel van het beleid er zo uit:
Content-Security-Policy: frame-ancestors 'none'
Dit is uitsluitend een regel voor het insluiten, geen volledig CSP-beleid. De regel beperkt de bronnen van scripts of netwerkverbindingen niet. Als de website al CSP gebruikt, moet je de regel zorgvuldig combineren met de bestaande configuratie, in plaats van zonder controle een extra beleid toe te voegen.
Voor een website die geen camera of microfoon nodig heeft, kun je het volgende overwegen:
Permissions-Policy: camera=(), microphone=()
Neem deze instelling niet over in een applicatie voor videogesprekken. Een goede header beperkt onnodige mogelijkheden, niet de functies die de gebruiker nodig heeft.
Headers controleren en veilig invoeren
De eenvoudigste manier is om de ontwikkelaarstools van de browser te openen, naar het netwerktabblad te gaan, de pagina te vernieuwen en het verzoek voor het hoofddocument te selecteren. Bij de responsheaders kun je controleren wat de browser daadwerkelijk heeft ontvangen. Dat een instelling in de serverconfiguratie staat, betekent nog niet dat deze de gebruiker bereikt.
Een praktische volgorde voor de invoering:
- Controleer representatieve adressen: de homepage, de inlogpagina, formulieren en foutpagina’s. De responsen kunnen via verschillende lagen van de infrastructuur lopen.
- Bepaal waar je de headers beheert. De applicatie, server en CDN mogen niet onbedoeld instellingen overschrijven of tegenstrijdige regels toevoegen.
- Stel CSP eerst in via
Content-Security-Policy-Report-Only. Daarmee kun je overtredingen waarnemen zonder bronnen te blokkeren; voor het verzamelen van rapporten is aanvullende configuratie nodig. - Test belangrijke gebruikershandelingen, waaronder inloggen, een formulier versturen en betalen, als die functie aanwezig is.
- Schakel het afdwingen van het beleid in en houd na de invoering fouten in de gaten.
Voer HSTS, het mechanisme dat door Strict-Transport-Security wordt ingeschakeld, pas in wanneer HTTPS goed werkt. De parameter includeSubDomains geldt ook voor subdomeinen. Controleer daarom vóór gebruik ook de minder voor de hand liggende diensten. Controleer de actuele syntaxis en de ondersteuning van richtlijnen in de officiële documentatie van het gebruikte platform en de browsers.
Wat de uitslag van een beveiligingsscanner niet vertelt
Een scanner kan een ontbrekende header of een riskante waarde opsporen, maar de beoordeling bewijst niet dat de applicatie veilig is. Sommige beleidsregels zijn alleen nodig voor specifieke toepassingen. Ze toevoegen voor een betere score kan integraties verstoren.
Headers verhelpen geen onjuiste toegangsrechten, kwetsbaarheden in de database of het lekken van geheimen in de code. Begin met het controleren van de daadwerkelijke responsen van je website en kies één wijziging waarvan je de werking vóór publicatie kunt verifiëren.
Zie ook: Wat is CSP?
