Fail2ban : Protéger l’authentification WordPress sous Nginx

Fail2ban : Protéger l’authentification WordPress sous Nginx

Table of Contents

Introduction

WordPress est une application web extrêmement populaire. Il existe de nombreuses attaques de brute-force sur la page de login de WordPress. Ces attaques peuvent générées des milliers de tentatives de login à votre application WordPress.

Cet article fait suite à Fail2ban : Installation et configuration.

Par défaut fail2ban est embarqué avec de nombreuses jails mais aucune pour protéger l'authentification de WordPress. Avant de configurer une jail pour WordPress, il va falloir faire quelques modifications en son sein. En effet par défaut, lorsqu'un utilisateur tente de s'authentifier, un message s'affiche à l'écran indiquant une erreur mais surtout la page retourne un code HTTP 200 (le même que celui lors d'un succès d'authentification). Cela sera modifié.

Configuration

Prérequis

Modification du code HTTP

Comme expliqué en introduction, lors d'un échec d'authentification sur la page de login de WordPress, celui-ci génère un code http identique à celui d'un succès.

  • Modifier le fichier functions.php de votre thème WordPress pour y inclure :

    /* Change WP-Admin login error message to be more generic */
    function generic_login_msg ($msg) {
      global $errors;
      $err_codes = $errors->get_error_codes();
      if ( in_array( 'invalid_username', $err_codes ) || in_array('incorrect_password', $err_codes )) {
          $msg = 'ERROR: Invalid credential.';
      }
      return $msg;
    }
    add_filter('login_errors', 'generic_login_msg');
    
    /* Return 403 instead of 200 when wp-login failed */
    add_action( 'wp_login_failed', function () { 
      status_header(403); 
    } );

    Cela aura pour effet d'indiquer un message générique sur la page lors d'un échec d'authentification et surtout de générer un code HTTP 403. Le code HTTP 200 sera toujours le code retour lors d'un succès d'authentification.

    11.22.33.44 - - [26/Oct/2021:01:52:10 +0200] "POST /wp-login.php HTTP/1.1" 403 3149 "https://wordpress.example.com/wp-login.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30"

Création du filtre fail2ban

  • Fail2ban n'a pas de preset de filtre pour l'authentification de WordPress. Créer un filtre :

    sudo vi /etc/fail2ban/filter.d/wp-login.conf
  • Ajouter le filtre suivant :

    [Definition]
    _daemon = wp-login
    failregex = .*POST.*(wp-login\.php|xmlrpc\.php).* 403

    failregex va matcher sur les requêtes POST à destination de wp-login.php et xmlrpc.php portant un code HTTP 403.

  • Ajouter la jail dans /etc/fail2ban/jail.local :

    [wordpress]
    enabled  = true
    port     = http,https
    filter   = wp-login
    logpath  = /var/log/nginx/access.log
  • Redémarrer fail2ban :

    sudo systemctl restart fail2ban
  • Vérifier la prise en compte de la jail avec :

    sudo fail2ban-client status
  • Le retour doit être :

    Status
    |- Number of jail:      1
    `- Jail list:   wordpress
Les commentaires sont fermés.