Durcir les en-tĂȘtes HTTP de sĂ©curitĂ©
Ce guide s'adresse Ă quelqu'un qui administre dĂ©jĂ un serveur web Apache et veut ajouter (ou renforcer) les en-tĂȘtes HTTP de sĂ©curitĂ©. On part du principe que vous savez Ă©diter une config Apache, activer un module et recharger le service. Objectif : une configuration centralisĂ©e, testable, et une trajectoire vers une CSP stricte.
1. Centraliser plutĂŽt que dupliquer
Configurez les en-tĂȘtes une seule fois, globalement, au lieu de les rĂ©pĂ©ter dans chaque VirtualHost. Cela Ă©vite les oublis et garantit une politique homogĂšne.
Activez le module headers :
sudo a2enmod headers
Créez un fichier de configuration dédié dans conf-available (par convention /etc/apache2/conf-available/security-headers.conf) :
<IfModule mod_headers.c> # Anti-clickjacking : interdit l'affichage du site en iframe Header always set X-Frame-Options "DENY" # EmpĂȘche le MIME sniffing Header always set X-Content-Type-Options "nosniff" # Limite les infos de provenance transmises Header always set Referrer-Policy "strict-origin-when-cross-origin" # DĂ©sactive les fonctions navigateur non utilisĂ©es Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" # Isolation cross-origin (renforce l'isolement du contexte navigateur) Header always set Cross-Origin-Embedder-Policy "require-corp" Header always set Cross-Origin-Opener-Policy "same-origin" Header always set Cross-Origin-Resource-Policy "same-origin" # Content-Security-Policy : voir section dĂ©diĂ©e. LaissĂ©e commentĂ©e # tant que des scripts inline hĂ©ritĂ©s subsistent. # Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'; frame-ancestors 'none';" </IfModule>
Le mot-clĂ© always garantit que l'en-tĂȘte est posĂ© mĂȘme sur les rĂ©ponses d'erreur (4xx/5xx).
Activez la config, vérifiez la syntaxe, rechargez :
sudo a2enconf security-headers sudo apache2ctl -t sudo systemctl reload apache2
2. Content-Security-Policy : la trajectoire
La CSP est l'en-tĂȘte le plus efficace contre le XSS et l'injection, mais aussi le plus susceptible de casser une page. Ne l'activez pas en aveugle sur un site existant.
Pour atteindre une politique stricte (sans 'unsafe-inline') :
- Externalisez tous les scripts inline dans des fichiers
.jsservis par votre origine. - Remplacez les styles inline, ou autorisez-les par hash/nonce plutĂŽt que par
'unsafe-inline'. - Retirez
'unsafe-inline'descript-src. - Décommentez et activez le header CSP.
3. CSP en mode Report-Only (pré-production)
Pour cartographier les besoins réels avant de bloquer quoi que ce soit, déployez d'abord une CSP en observation. Elle ne bloque rien : elle signale les violations.
# Endpoint de collecte des rapports â adaptez l'URL Ă votre domaine Header always set Reporting-Endpoints "csp-endpoint=\"https://<VOTRE_DOMAINE>/reports\"" # Politique en observation uniquement (aucun blocage) Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; frame-ancestors 'none'; report-to csp-endpoint"
Procédure :
- DĂ©ployez ces en-tĂȘtes en prĂ©-production.
- Naviguez sur les pages clés, ouvrez la console navigateur et collectez les rapports remontés.
- Recensez les ressources externes légitimes ; remplacez l'inline par des fichiers, ou autorisez-le via hash/nonce.
- Une fois la liste stabilisée, retirez
Report-Onlyet passez Ă uneContent-Security-Policystricte.
Références : documentation MDN sur la CSP et la Reporting API.
4. HSTS
Le Strict-Transport-Security (HSTS) force le navigateur à n'utiliser que HTTPS. Il se gÚre à part car il suppose que le TLS est déjà en place et fiable sur tout le domaine (sous peine de rendre un site inaccessible). Traitez-le dans la procédure dédiée Mettre en place SSL/TLS une fois HTTPS pleinement opérationnel.
5. Vérifier le résultat
Inspectez les en-tĂȘtes rĂ©ellement servis :
curl -sI https://<VOTRE_DOMAINE> | egrep -i "^(strict-transport-security|x-frame-options|x-content-type-options|referrer-policy|permissions-policy|cross-origin-.*|content-security-policy|content-security-policy-report-only|server|x-powered-by):"
Attendus :
- Présence : HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, COEP/COOP/CORP.
- CSP active ou en report-only selon l'environnement.
- SobriĂ©tĂ© : en-tĂȘte
Servernon verbeux ; pas deX-Powered-By(ces en-tĂȘtes rĂ©vĂšlent versions et stack, Ă masquer).
Outils en ligne pour un audit complémentaire :
- securityheaders.com
- Mozilla Observatory
Ă retenir
- Une config globale unique vaut mieux que des réglages par vhost.
- La CSP se déploie en deux temps : observation (Report-Only), puis blocage strict.
- HSTS uniquement quand HTTPS est solide sur tout le domaine.
- Réduisez la verbosité (
Server,X-Powered-By) : ne divulguez pas votre stack.