Beveiliging afstemmen op Craft CMS
Craft geeft je volledige controle over de headers en de opmaak, dus vrijwel alles wat deze check meldt kun je zelf oplossen. Hieronder per bevinding waar de fix woont, met code die je kunt overnemen.
Response-headers (HSTS, clickjacking, MIME-sniffing, referrer, permissions)
Deze zet je op één plek voor de hele site. Het robuustst is de webserver (het server-blok op nginx, of een .htaccess op Apache), want dan gelden ze ook voor bestanden die Craft niet aanraakt. Wil je het in de applicatie houden, dan kan een klein eigen module ze toevoegen op het Response-object.
Wil je het zonder serverconfig en volledig binnen Craft, dan is de Sherlock-plugin een goede keuze. Sherlock zet de security-headers en een CSP vanuit de beheeromgeving, en scant je installatie tegelijk op andere beveiligingsproblemen.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;Craft::$app->response->headers->set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload');
Craft::$app->response->headers->set('X-Frame-Options', 'SAMEORIGIN');
Craft::$app->response->headers->set('X-Content-Type-Options', 'nosniff');
Craft::$app->response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin');De Content-Security-Policy
Een CSP is op Craft goed haalbaar omdat je de templates zelf in de hand hebt. Werk je met nonces, zet die dan per request. De hierboven genoemde Sherlock-plugin beheert de CSP vanuit de beheeromgeving; een SEO-plugin zoals SEOmatic kan het ook. Begin in report-only en zet hem pas af als niets legitiems meer geblokkeerd wordt.
- Zet de policy eerst in report-only (de Content-Security-Policy-Report-Only-header), dan breekt hij niets maar meldt hij wel wat hij zou blokkeren.
- Verzamel de meldingen met een tool als Sentry, Report URI of URIports, of lees ze in je browserconsole.
- Sta toe wat legitiem geblokkeerd wordt, tot er geen echte meldingen meer binnenkomen.
- Hernoem de header naar Content-Security-Policy om de policy af te dwingen.
In de pagina (hash op een script, trackers na toestemming)
Reparaties in de opmaak doe je in je Twig-templates: een integrity-hash op een extern script, of trackers die pas na toestemming laden. Laad analytics en advertenties via je consent-platform of een tag manager die op de toestemming wacht.
De verbinding (HTTPS en het certificaat)
HTTPS afdwingen en het certificaat regelt je host of CDN. Zorg dat http naar https doorstuurt en dat het certificaat geldig is en niet verlopen. De meeste hosts en CDN's doen dit met een schakelaar of een gratis Let's Encrypt-certificaat.
DNS-records (SPF, DMARC, DNSSEC, IPv6)
Deze staan los van je site: het zijn records bij je domein. Je zet ze bij je DNS-provider of domeinregistrar, niet in je CMS of op je host. SPF en DMARC gaan over wie mail namens je domein mag sturen, DNSSEC ondertekent je DNS, en IPv6 is de enige waar de host eerst een AAAA-record en verbinding moet aanbieden voordat je die kunt zetten.