Drupal — en-têtes de sécurité, CSP et module Seckit
Configuration des en-têtes de sécurité HTTP pour Drupal via Seckit et le reverse proxy : Content-Security-Policy, HSTS, Referrer-Policy et protections contre le clickjacking.
Mise en place des en-têtes de sécurité HTTP pour une instance Drupal, combinant le module Seckit et la configuration du reverse proxy.
Contexte
Les en-têtes de sécurité réduisent l’impact des attaques côté client : Content-Security-Policy limite les sources de scripts (mitigation XSS, pertinente face à SA-CORE-2026-001), HSTS impose le TLS, et X-Frame-Options bloque le clickjacking. Drupal injecte des scripts et styles inline via son système d’agrégation, ce qui contraint la rédaction de la CSP.
Détection
Audit des en-têtes actuellement renvoyés :
curl -sI https://drupal.exemple.fr/ | grep -iE 'content-security-policy|strict-transport|x-frame|x-content-type|referrer-policy|permissions-policy'
Identification des violations CSP en mode rapport (collecte avant mise en application stricte) via un endpoint de report :
grep -a 'csp-report' /var/log/nginx/access.log | jq -r '.["csp-report"]["violated-directive"]' 2>/dev/null | sort | uniq -c
Durcissement
Configuration du module Seckit (admin/config/system/seckit) exportée en YAML de configuration :
seckit_xss:
csp:
checkbox: true
report-only: false
default-src: "'self'"
script-src: "'self' 'unsafe-inline'"
style-src: "'self' 'unsafe-inline'"
img-src: "'self' data:"
frame-ancestors: "'self'"
base-uri: "'self'"
form-action: "'self'"
seckit_clickjacking:
x_frame: 1
x_frame_value: SAMEORIGIN
seckit_ssl:
hsts: true
hsts_max_age: 31536000
hsts_subdomains: true
hsts_preload: true
Drupal nécessitant 'unsafe-inline' pour ses scripts d’agrégation, la mitigation XSS par nonce est préférable lorsque l’agrégation peut être configurée pour les émettre ; à défaut, le durcissement repose sur default-src 'self' strict et l’absence de domaines tiers non maîtrisés.
En-têtes complémentaires posés au niveau du reverse proxy Nginx, source d’autorité unique pour HSTS et les politiques transverses :
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;
L’usage de always est requis pour que les en-têtes soient émis sur les réponses d’erreur (4xx/5xx), souvent oubliées et exploitables.
Vérification
Confirmation que tous les en-têtes attendus sont présents, y compris sur une réponse 404 :
curl -sI https://drupal.exemple.fr/ | grep -i strict-transport
curl -sI https://drupal.exemple.fr/page-inexistante-404 | grep -i x-content-type-options
Test de la CSP : une ressource externe non autorisée doit être bloquée par le navigateur. Validation hors-ligne de la cohérence de la politique :
curl -sI https://drupal.exemple.fr/ | grep -i content-security-policy | grep -o "default-src[^;]*"
Aucun rapport de violation CSP ne doit apparaître pour les ressources légitimes de l’instance après stabilisation de la politique.
Vous avez un projet sur ces sujets ?
Nous contacter →