Security headers

Security headers worden vaak vergeten bij de beveiliging van webapps of websites. Maar door aandacht te besteden aan de security headers en door deze goed in te stellen, zorg je voor een extra laag van beveiliging voor je website.

Wat zijn security headers?

Wanneer iemand met zijn of haar browser je website opent, dan zal de webserver waarop jouw website staat reageren door de inhoud van je website af te leveren vergezeld met een aantal HTTP headers. Deze HTTP headers vertellen de browser onder andere welke meta data er is, of er gebruik wordt gemaakt van compressie (bijvoorbeeld GZIP), informatie over de server, cache contol etc.

Als je wilt zien welke HTTP headers door een website worden verzonden, zou je de HTTP Header Live addon voor de Firefox browser eens kunnen downloaden en installeren in de Firefox browser.

Als je deze addon hebt geinstalleerd, zie je in het browser venster rechtsboven in een klein blauw icoontje verschijnen. Als je daarop klikt, zie je de HTTP headers van websites die je opent.

Onderdeel van deze HTTP headers zijn de security headers. Deze vertellen de browser hoe ze om moeten gaan met de content van je website. Laten we eens kijken welke security headers er zijn en wat ze precies doen.

Trouwens, in de onderstaande tekst zie je code die je kunt gebruiken om de security headers in te stellen. Deze code is alleen te gebruiken in een .htaccess bestand. Je webserver moet dan op een Apache webserver worden gehost. Mocht jouw website nu op een ander type webserver worden gehost (bijvoorbeeld IIS of Nginx) dan kun je het beste de beheerder van de webserver vragen om de security headers voor je in te stellen.

Let op: het .htaccess bestand is een configuratie bestand voor de webserver. Het kan zijn dat je website het niet meer goed doet als je fouten maakt in het .htaccess bestand. Mocht je nu een foutmelding op je site krijgen, raak dan niet in paniek. Haal dan gewoon de code die je hebt toegevoegd weg en upload dan het .htaccess bestand weer. Je site zal het dan weer doen.

HTTP Strict Transport Security (HSTS)

Met deze security header kun je regelen dat webbrowsers jouw website alleen mogen benaderen via een beveiligde (https) verbinding. Om deze security header in te stellen, moet je website natuurlijk wel gebruik maken van een SSL verbinding (beveiligde verbinding, dus https en een slotje in de adresbalk van de browser).

Wanneer je instelt dat browsers alleen via een beveiligde verbinding je website mogen benaderen, bescherm je je website en je bezoekers tegen zogenaamde "man in the middle" en "SSLstrip" aanvallen. Hoe dergelijke aanvallen werken en hoe HTTP Strict Transport Security je website en je bezoekers hier tegen beveiligen, wordt in onderstaande video in een simpel voorbeeld uitgelegd:

Je kunt de HSTS security header instellen in het .htaccess bestand (voor websites die gehost worden op een Apache webservers). De code die je in je .htaccess bestand moet zetten, is de volgende:

# Set browser headers
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
</IfModule>

In bovenstaande code zie je eerst een opmerking. Als je een opmerking wilt plaatsen in het .htaccess bestand, dan begin je met een #. Een regel die begint met een # wordt niet uitgevoerd en dient dus als opmerking, zodat je later ook nog weet waar deze code voor dient. De opmerking is "Set browser headers".

Daarnaast zie je dit: "<IfModule mod_headers.c>". Dit betekent dat deze code alleen uitgevoerd wordt als op de Apache webserver inderdaad de module mod_headers geactiveerd is.

Daarna zie je dat de header Strict Transport Security wordt ingesteld. Bij max-age zie je hoeveel seconden een browser jouw website alleen maar via https mag openen. Wordt je website binnen deze periode nogmaals geopend, dan wordt deze tijd gereset.

Via de optie "includeSubDomains;" zou je ook alle subdomeinen op je website meteen kunnen meenemen in deze beveiliging. De code zou er dan als volgt uit zien:

# Set browser headers
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains" env=HTTPS
</IfModule>

Je kunt je website ook op een preload lijst laten plaatsen. Er zijn meerdere browsers die een dergelijke HSTS preload lijst hanteren. Wanneer jouw website op zo'n lijst staat voor bijvoorbeeld de Chrome browser, en je bezoeker opent jouw website in Chrome, dan staat in Chrome in de preload lijst al dat jouw website altijd via HTTPS geopend moet worden.

Op de website https://hstspreload.org kun je je website aanmelden voor dergelijke preload lijsten.

Wanneer je je website toegevoegd wilt hebben aan zo'n preload lijst, dan moet je de HSTS security header als volgt instellen:

# Set browser headers
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains" preload env=HTTPS
</IfModule>

X-Frame opties

Met de security header X-Frame opties kun je aangeven of jouw website geladen mag worden in een iframe. Een iframe is een venster waarin je website content kunt laden. Je kunt ook een complete website laden in een iframe. Zo zou iemand anders dus een website kunnen maken met daarop alleen een iframe en in dat iframe wordt een andere website geladen (bijvoorbeeld jouw website).

Dit brengt een risico met zich mee. Via een iframe kan iemand dus jouw website helemaal namaken. Deze nagemaakte website blijft ook actueel, omdat alle wijzigingen die jij aanbrengt op jouw website ook live getoond worden in het iframe van de namaak site.

Degene die deze namaak site met iframe gebouwd heeft, kan nu aan bepaalde knoppen op jouw website een andere functie geven (bijvoorbeeld een kwaadaardig script). Let wel, deze andere functie is alleen actief in het iframe, dus niet op jouw echte site.

Wanneer nu de aanvaller mensen naar de door hem gemaakte namaak site kan lokken, dan lijkt het net of ze op jouw site terecht zijn gekomen. Wanneer ze nu klikken op een knop waaraan de aanvaller een kwaadaardig script heeft gekoppeld, dan lijkt het net of mensen gehacked zijn via jouw website.

In de onderstaande video laat ik met een simpel voorbeeld zien hoe dit in zijn werk kan gaan:

Om de security header X-Frame opties aan te zetten, kun je de volgende code in je .htaccess bestand zetten:

Header always set X-Frame-Options "SAMEORIGIN"

Met deze code geef je aan dat pagina's met iframes waarin jouw website geladen wordt alleen toegestaan zijn op je eigen website (sameorigin). Dus, wil iemand op een ander domein jouw website in een iframe laden, dan gaat dat dus niet lukken.

Bovenstaande code voeg je toe aan de code voor de HSTS security header, dus de totale code wordt:

# Set browser headers
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
Header always set X-Frame-Options "SAMEORIGIN"
</IfModule>

XSS protectie

Cross site scripting (XSS) is een veel gebruikte aanvalsvorm om websites mee te hacken. Met XSS injecteert een aanvaller kwaadaardige code in een website die bezoekers van deze website kan besmetten.

Een slecht beveiligd formulier kan kwetsbaar zijn voor cross site scripting. Een aanvaller zal proberen om script code in een formulier te plaatsen en vervolgens op "verzenden" drukken. Een goed formulier zal deze script code herkennen en zo aanpassen dat de code onschadelijk wordt of zal de code helemaal weigeren. Een slecht formulier zal de code accepteren, waarmee de code op de website geplaatst wordt.

In de onderstaande video zie je een eenvoudig voorbeeld:

Je kunt de security header XSS protectie met de volgende code in je .htaccess bestand instellen:

Header always set X-Xss-Protection "1; mode=block"

Deze security header zit al standaard in Internet Explorer, Chrome en Safari. Met de bovenstaande code geldt voor alle browsers dat wanneer een XSS aanval gedetecteerd wordt, dat deze geblokkeerd moet worden.

Uiteraard combineer je deze code met de code voor de security headers die we al behandeld hadden, dus de totale code voor in je .htaccess bestand ziet er nu zo uit:

# Set browser headers
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Xss-Protection "1; mode=block"
</IfModule>

X-Content type opties

Wanneer je website bestanden laadt, bijvoorbeeld een stylesheet, dan wordt het content type ook bij dit bestand gezet. In het voorbeeld van een stylesheet zul je zien dat het type is: text/css.

Stel je hebt op je website de mogelijkheid dat bezoekers bestanden mogen uploaden, en iemand upload een uitvoerbaar bestand (een exe) verstopt als stylesheet en met type text/css. Wanneer de browser dit bestand wil laden, dan zal de browser kijken naar het bestand en naar aanleiding van de aard van het bestand bepalen (raden) hoe het geïnterpreteerd moet worden. Is het een uitvoerbaar bestand, dan zal de browser het ook zo willen openen (ondanks dat als type ingesteld staat text/css).

Wanneer dus een bestand geupload wordt dat een stylesheet lijkt, maar in werkelijkheid een stuk kwaadaardige code is, dan zal dit bestand als zodanig worden uitgevoerd.

Wanneer je de X-Content type opties security header instelt, dan vertel je de browser dat hij niet meer mag raden, maar het bestand moet interpreteren zoals staat aangegeven (dus in bovenstaand voorbeeld zou het kwaadaardige bestand als text/css worden geïnterpreteerd en niet schadelijk zijn).

Met de onderstaande code stel je deze security header in:

Header always set X-Content-Type-Options "nosniff"

In deze code zetten we de X-COntent type opties in op "nosniff". De browser mag dus niet meer raden.

Wanneer je deze security header toevoegt aan de reeds behandelde security headers, dan ziet de totale code er zo uit:

# Set browser headers
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Xss-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
</IfModule>

Referrer policy

Wanneer er op jouw website een link staat naar een andere website en een bezoeker klikt op die link, dan gaat de bezoeker naar die andere website. De browser neemt informatie mee over de website vanwaar hij gekomen is (dus informatie over jouw website) naar de website waar men naar toe gaat.

Deze informatie kan gebruikt worden in bijvoorbeeld Google Analytics, je kunt met deze informatie precies zien vanaf welke verwijzende sites men op jouw site gekomen is.

Echter, het kan zijn dat je niet wilt dat informatie over jouw website doorgegeven wordt aan websites waarnaar je verwijst. Dit kun je regelen met de Referrer policy security header. Er zijn een aantal zaken die je in kunt stellen, ik raad je aan om in te stellen dat er geen verwijzingsinformatie wordt meegezonden wanneer je verwijst naar een website die geen https gebruikt terwijl je zelf wel https gebruikt. Dus, geen informatie meezenden bij een downgrade van de verbinding.

De code om dit te regelen, ziet er als volgt uit:

Header set Referrer-Policy "no-referrer-when-downgrade"

Wanneer je deze code toevoegt aan de code voor de voorgaande security headers, dan ziet de code voor in je .htaccess bestand er als volgt uit:

# Set browser headers
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Xss-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header set Referrer-Policy "no-referrer-when-downgrade"
</IfModule>

Test je website op je security headers

Wanneer je alle security headers hebt ingesteld die hierboven zijn behandeld, dan heb je een extra beveiligingslaag opgezet voor je website. Je zou dan je website eens kunnen testen op https://securityheaders.io/.

Wanneer je alles goed hebt ingesteld, zou je een A score moeten krijgen en in de Hall of Fame moeten komen te staan. Je hebt nog geen A+ score, dat komt omdat je nog één security header niet hebt ingesteld.

De Content Security Policy

Deze security header is een extra beveiliging tegen Cross Site Scripting. Je kunt namelijk hiermee bepaalde script bronnen op een whitelist of op een blacklist zetten. Je kunt dus exact aangeven welke scripts van welke domeinen toegestaan zijn en welke niet.

Stel dat je Google analytics gebruikt en je hebt een stukje script van Google analytics op je website staan, dan kun je het domein van Google analytics toevoegen aan de toegestane domeinen. Het script van Google analytics mag dan dus uitgevoerd worden.

Wanneer nu een hacker via Cross Site Scripting een script op je website plaatst, en het domein waarop dit script staat is niet toegestaan, dan zal het script dus nooit uitgevoerd worden.

Het is lastig om hier aan jou te vertellen hoe je deze security header moet instellen. Ik weet immers niet vanaf welke domeinen jij scripts wilt laten toestaan op jouw website.

Ik zal daarom deze security header hier verder niet behandelen. Wil je meer informatie over de Content Securitu Policy security header, kijk dan eens op deze website

Plaats reactie

Beveiligingscode
Vernieuwen