Beveiliging afstemmen op Joomla
Joomla heeft sinds versie 4 een ingebouwde plugin voor security-headers, dus veel kun je zonder code aanzetten. Hieronder per bevinding waar de fix woont.
Response-headers (HSTS, clickjacking, referrer, permissions)
Joomla levert sinds versie 4 een kernplugin "Systeem - HTTP Headers". Ga naar Systeem > Plugins, zoek op "HTTP Headers", open de plugin en zet hem op Ingeschakeld. Die zet onder meer X-Frame-Options (standaard SAMEORIGIN), Referrer-Policy, Cross-Origin-Opener-Policy, HSTS (standaard uit) en Permissions-Policy. Per header kies je waar hij geldt: de site, het beheer of beide. HSTS heeft eigen velden voor max-age, subdomeinen en preload, en werkt alleen over HTTPS. X-Content-Type-Options: nosniff zit niet meer in de plugin maar in de meegeleverde htaccess.txt (zie hieronder).
Wil je het liever op de server, dan levert Joomla een htaccess.txt in de siteroot. Hernoem die naar .htaccess en voeg je regels toe. Bewerk htaccess.txt zelf niet, want een update kan die overschrijven; je .htaccess wordt bij een update niet automatisch bijgewerkt.
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), camera=(), microphone=()"
</IfModule>De Content-Security-Policy
Dezelfde "Systeem - HTTP Headers"-plugin kan een Content-Security-Policy zetten, inclusief de report-only-variant. Met third-party extensies en templates breekt een te strak beleid snel iets, dus rol hem in stappen uit:
- 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 (SRI, trackers na toestemming)
Joomla heeft geen ingebouwde knop die een integrity-hash op externe scripts zet; dat doe je in de templatelaag (of een template-override) waar het script wordt ingeladen, met de integrity- en crossorigin-attributen. Let op de grens van Joomla's privacytools: de Privacy-component en de "Privacy Consent"-plugin vragen gebruikers akkoord op je privacybeleid, maar houden geen trackers van derden tegen tot een bezoeker toestemt. Trackers pas na toestemming laden regel je dus in de templatelaag of met een aparte consent-oplossing.
De verbinding (HTTPS afdwingen)
HTTPS afdwingen doe je in Systeem > Globale configuratie op de tab Server met "Forceer HTTPS". De opties zijn Geen, Alleen beheer en Hele site. Kies Hele site zodat elke pagina over https gaat; dit zet ook de sessiecookies op secure. Voorwaarde is een geldig certificaat op de server; dat regelt je host of CDN, niet Joomla. Zet daarna eventueel HSTS aan zodat browsers https onthouden.
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.