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
- L'installation et les explications sur la configuration général de fail2ban est décrite dans cet article : Fail2ban : Installation et configuration.
- Fail2ban doit être installé et fonctionnel.
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 codeHTTP 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êtesPOST
à destination dewp-login.php
etxmlrpc.php
portant un codeHTTP 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