← Retour aux tutoriels

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 →