← Retour aux tutoriels

Drupal — Security Review, modules de durcissement et surveillance d'intégrité

Audit automatisé d'une instance Drupal avec le module Security Review, modules de durcissement (Seckit, Password Policy) et baseline d'intégrité du code.

Audit de configuration d’une instance Drupal avec le module Security Review et mise en place d’une surveillance d’intégrité du code.

Contexte

Le module Security Review vérifie un ensemble de points de configuration récurrents : permissions de fichiers, exécution PHP dans les uploads, droits d’accès anonymes, formats de texte dangereux et erreurs PHP exposées. Couplé à une baseline d’intégrité du code et à des modules de durcissement, il automatise le contrôle de l’état de sécurité applicatif.

Détection

Exécution de Security Review en ligne de commande via Drush :

drush pm:enable security_review -y
drush security:review --format=json | jq -r '.[] | select(.result=="fail") | .title'

Contrôle des formats de texte autorisant des balises dangereuses pour les rôles anonymes/authentifiés :

drush sql:query "SELECT format, name FROM filter_format WHERE status=1;"
drush config:get filter.format.full_html filters.filter_html.status

Vérification de l’exposition des erreurs et des modules à risque activés :

drush config:get system.logging error_level
drush pm:list --status=enabled --type=module --format=list | grep -iE 'php|devel|webform|views_ui'

Durcissement

Correction des points signalés par Security Review : masquage des erreurs, interdiction des uploads non sécurisés, retrait du module php s’il est présent :

drush config:set system.logging error_level hide -y
drush config:set system.file allow_insecure_uploads 0 -y
drush pm:uninstall php devel views_ui -y

Restriction des formats de texte : le format full_html ne doit être accessible qu’à des rôles de confiance, jamais aux rôles anonyme ou authentifié de base :

drush config:set filter.format.full_html roles.administrator administrator -y
drush eval '\Drupal\user\Entity\Role::load("anonymous")->revokePermission("use text format full_html")->save();'

Modules de durcissement complémentaires : politique de mot de passe et limitation des échecs de connexion (Flood control natif) :

drush pm:enable password_policy password_policy_length password_policy_character -y
drush config:set user.flood ip_limit 50 -y
drush config:set user.flood user_limit 5 -y
drush config:set user.flood user_window 3600 -y

Baseline d’intégrité du code et job de comparaison périodique (à planifier en cron) :

install -d -m 750 /var/lib/drupal-integrity
find /var/www/drupal.exemple.fr/web -type f \( -name '*.php' -o -name '*.module' -o -name '*.inc' -o -name '*.theme' \) \
  -not -path '*/sites/*/files/*' -exec sha256sum {} + | sort -k2 > /var/lib/drupal-integrity/baseline.sha256
sha256sum -c /var/lib/drupal-integrity/baseline.sha256 2>&1 | grep -v ': OK$' && logger -p auth.warning "Drupal integrity drift detected"

Vérification

Confirmation que Security Review ne signale plus d’échec critique :

drush security:review --format=json | jq -r '[.[] | select(.result=="fail")] | length'

Test de la limitation des échecs de connexion (le compte est bloqué après le seuil) :

for i in $(seq 1 6); do
  curl -s -o /dev/null -w '%{http_code} ' -d "name=test&pass=faux&form_id=user_login_form" https://drupal.exemple.fr/user/login
done; echo

Vérification que la baseline d’intégrité ne détecte aucune dérive sur du code intact :

sha256sum -c /var/lib/drupal-integrity/baseline.sha256 2>&1 | grep -c ': OK$'

Un nombre d’échecs Security Review à 0 et l’absence de dérive d’intégrité confirment l’état durci.

Vous avez un projet sur ces sujets ?

Nous contacter →