HTTP Security Headers
---
Overzicht
- HTTP-beveiligingsheaders
- De headers
- Demo: configureren!
- Vragen
---
HTTP Security Headers
----
## HTTP Header
- Metadata = Communicatie tussen server en client
- HTTP-status - HTTP-versie, statuscode (200 succes, 404 niet gevonden)
- Algemene headers - datum, cache-control
- Verzoek headers - User-Agent, Cookie
- Respons headers - Server, Content-Type
- Entiteit headers - Content-Encoding, Content-Language, Last-Modified
- Beveiligingsheaders - [in deze presentatie]
- Custom headers - password: Open sesame
----
### Hoe bekijk je HTTP-headers
Gebruik Google Chrome >
Inspect >
Network >
klik op “HTML-pagina” >
Headers
----
## HTTP Security Headers
----
### HTTP Security Headers (HSH) - Waar instellen?
- Server configuration
- .htaccess
- PHP
- HTML (alleen CSP)
- Joomla core plugin
----
### HSH - Server configuratie
in Nginx
```txt
add_header X-Content-Security-Level "topsecret" always;
```
----
### HSH - .htaccess
```txt
Header set X-Content-Security-Level "topsecret"
```
----
### HSH - PHP
```php
header('X-Content-Security-Level: topsecret');
```
### HSH - HTML
Alleen CSP...
```html
```
----
### HSH - Joomla core plugin
System > Plugins > System - HTTP Headers
---
De Headers
----
### De HTTP Security Headers
- X-Content-Type-Options
- X-Frame-Options
- Referrer-Policy
- Cross-Origin-Opener-Policy
- Permissions-Policy
- Strict-Transport-Security
- Content-Security-Policy
- Cross-Origin Resource Sharing (CORS)
---
X-Content-Type-Options
----
### X-Content-Type-Options - Probleem
- Een bezoeker op je mooie website
- uploadt een example.png-bestand
- dat JavaScript bevat
- bezoeker 2 opent de pagina met example.png
- de browser laadt dat example.png
- ziet het bestand als JavaScript en voert het uit
----
### X-Content-Type-Options - Oplossing
- Schakel inhoudsbepaling via MIME uit
- "X-Content-Type-Options: nosniff"
- Instellen via:
- Serverconfiguratie
- .htaccess
- web.config
---
X-Frame-Options
----
## X-Frame-Options - Probleem
- Je mooie website
- wordt geladen op een andere website in een iframe
- met een onzichtbare laag erbovenop
- bezoeker probeert op een knop van de originele website te klikken...
----
## X-Frame-Options - Probleem
- Clickjacking
- Kwaadaardige website toont transparent iframe
over een legitieme webpagina
- tricking de gebruiker om
clicking on elements
van de verborgen pagina
----
## X-Frame-Options - Oplossing
- Sta niet toe dat je website
wordt geladen via een iframe
- "x-frame-options: SAMEORIGIN"
- Instellen:
- Server configuratie
- Plugin: System - HTTP Headers
---
Referrer-Policy
----
## Referrer-Policy - Probleem
- Je mooie website
- linkt naar een externe website
- bezoeker klikt op de link naar de externe website
- de externe website
weet waar de bezoeker vandaan komt...
----
## Referrer-Policy - Oplossing
- Zet referrer uit
- "Referrer Policy: no-referrer-when-downgrade"
- Instellen:
- Server configuratie
- Plugin: System - HTTP Headers
---
Cross-Origin-Opener-Policy
----
### Cross-Origin-Opener-Policy (COOP)
Probleem
- Bezoeker bezoekt je mooie website
- in een tweede tab openen ze een andere website
- de tweede website kan code bevatten
- die invloed heeft op de
eerste tab...
----
### Cross-Origin-Opener-Policy (COOP)
Oplossing
- Instrueert de browser om
voorwaarden te beperken waaronder een nieuwe browsecontext
(nieuw venster of tabblad) kan worden aangemaakt of ermee kan worden gecommuniceerd
- "Cross-Origin-Opener-Policy: same-origin"
- Instellen:
- Server configuratie
- Plugin: System - HTTP Headers
---
Permissions-Policy
----
## Permissions-Policy - Probleem
- je mooie website
- laadt een andere website in een iframe
- je bezoeker krijgt verzoek: toegang tot camera
- denkt dat het van jouw site komt en staat het toe
- de andere website krijgt toegang tot de camera
----
### Permissions-Policy - Oplossing
- configureer welke features
toegestaan zijn
- door de website, frames of ingesloten iframe-inhoud
- (voorheen bekend als Feature Policy)
- Permissions-Policy: accelerometer=(),
camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()
- Instellen via:
- Serverconfiguratie
- Plugin: System - HTTP Headers
---
Strict-Transport-Security
----
### Strict-Transport-Security - Probleem
- je mooie website
- gebruikt altijd https
- daardoor is de verbinding versleuteld
- op een dag verandert https naar http
- door een Man-(of Vrouw)-in-the-Middle aanval
- communicatie van formulierinvoer dan niet veilig
----
### Strict-Transport-Security - Probleem
- Verkeer naar je site wordt beschermd via SSL/TLS (https)
- Door een technisch probleem wordt de website geleverd
zonder SSL/TLS (als http)
- De terugkerende bezoeker verwacht https
en verstuurt een formulier met persoonlijke gegevens
----
#### Strict-Transport-Security - Oplossing
- Wees streng en dwing https af
- Weiger dat de browser van de terugkerende bezoeker http gebruikt
- strict-transport-security: max-age=15768000
(converteer alle HTTP-verzoeken op deze website naar HTTPS gedurende de komende 6 maanden)
- Instellen via:
- Serverconfiguratie
- Plugin: System - HTTP Headers
---
Content-Security-Policy
----
### Content-Security-Policy - Probleem
- je mooie website
- heeft een oude externe reactie-extensie
- die een kwetsbaarheid bevat
- een kwaadwillende bezoeker plaatst een reactie
- met kwaadaardige JavaScript
- een andere bezoeker leest de reactie
- en de browser voert automatisch het JavaScript uit
----
### Content-Security-Policy - Oplossing
- Wees streng
- specificeer welke interne/externe
bronnen je toestaat
- zoals JavaScript, CSS, afbeeldingen, enzovoort
- Instellen via:
- Plugin: System - HTTP Headers
----
### Content-Security-Policy - Oplossing
- script-src - JavaScript
- 'self' - van de website zelf (met hetzelfde schema,
dezelfde host en poort)
- 'unsafe-inline'
(niet de meest veilige!) - staat inline JavaScript en event-handling
HTML-attributen toe (zoals onclick)
- example.com/matomo.js
staat expliciet toe dat het JavaScript-bestand matomo.js van example.com wordt geladen
----
### Content-Security-Policy -
"nonce" en "script hashes"
- Nonce (number used once) -
uniek token; server gegenereerd voor elke HTTP-respons
- Content-Security-Policy:
script-src 'nonce-YourUniqueNonceValue';
- of inline JS:
<
script nonce="YourUniqueNonceValue">
// Je inline script hier
< /script >
- Script Hashes -
script alleen uitgevoerd als inhoud = cryptografische
hash die in CSP is opgegeven
- Content-Security-Policy: script-src 'sha256-abc123';
----
### Content-Security-Policy -
Hoe stel je het in?
- Schakel CSP in met "Report Only"
- Gebruik Google Chrome > Inspecteren > Console
- Controleer en los fouten op
- Wees extra voorzichtig met: CAPTCHA, YouTube-video’s, Google Maps/OpenStreetMap, enzovoort
---
Cross-Origin Resource Sharing (CORS)
----
### Cross-Origin Resource Sharing - Probleem
- je mooie website
- een geregistreerde gebruiker is ingelogd
- heeft zich niet uitgelogd en bezoekt
een kwaadaardige website
- de kwaadaardige website plaatst een formulier
naar je website
- samen met het
sessiecookie van de geregistreerde gebruiker
----
### Cross-Origin Resource Sharing
- same-origin policy = te strikt
voor toegang tot resources (zoals lettertypen, API’s of scripts) die
op andere domeinen worden gehost
- CORS = maakt het mogelijk om dit beleid op een veilige manier
te versoepelen onder gecontroleerde omstandigheden
- Instellen via:
- In Globale Configuratie: Server >
Webservices > CORS inschakelen
---
Tijd voor een demo!
---
Vragen?
----
## Photo Credits
- https://unsplash.com/photos/lines-of-html-codes-4hbJ-eymZ1o
- https://unsplash.com/photos/boy-standing-near-dock-lVCHfXn3VME
- https://pixabay.com/photos/notebook-paper-pages-open-731212/
- https://unsplash.com/photos/guard-standing-near-brown-wall-qTLyiHW1nIc
- https://unsplash.com/photos/woman-smelling-bouquet-of-purple-lavender-Wv9Bn8te3as
- https://unsplash.com/photos/person-hand-holding-photo-frame-3_Xwxya43hE
- https://unsplash.com/photos/person-using-laptop-FlPc9_VocJ4
- https://unsplash.com/photos/gray-bottle-opener-beside-opened-bottle-voJB2goG0us
- https://unsplash.com/photos/no-drones-signage-on-brown-wooden-post-across-mountain-with-fogs-oMqswmrie4Y
- https://unsplash.com/photos/box-truck-passing-through-toll-gate-Pj6TgpS_Vt4
- https://unsplash.com/photos/time-lapse-photography-of-square-containers-at-night-ahi73ZN5P0Y
- https://unsplash.com/photos/pizza-on-white-ceramic-plate-WcV2YkM3Dls
- https://app.leonardo.ai/image-generation