🗏 fail2ban для защиты WordPress

Для защиты сайтов на WordPress от грубого переборы паролей существует множество плагинов, но все они банят злоумышленников на уровне самого WordPress. А это совсем не здорово. Хотелось бы банить их на уровне iptables.

Сразу же на ум приходит замечательная программа fail2ban, но сразу же возникает вопрос — как отловить ошибку авторизации. WordPress ее никак не отлавливает и тупо возвращает код 200. Пока идут дискуссии по поводу ошибки авторизации WordPress, в дебрях интернета был найден прекрасный плагин, выдающий в указанный log сообщение об ошибке авторизации и прикрутить fail2ban оказалось достаточно просто. Вот сам плагин:

<?php
/*
Plugin Name: Lumpy Login Protect
Description: Protect the WordPress login screen by blocking common usernames and writing failed attempts to the error log (for use by fail2ban)
Version: 0.2
License: GPL version 2 or any later version
Author: Simon Blackbourn
Author URI: http://lumpylemon.uk

https://twitter.com/lumpysimon

*/

defined( 'ABSPATH' ) or die();

$ll_login_protect = new ll_login_protect;

class ll_login_protect {

	function __construct() {

		add_action( 'muplugins_loaded', array( $this, 'maybe_block' ) );
		add_action( 'wp_login_failed',  array( $this, 'log_failure' ) );

	}

	function maybe_block() {

		$blocked = array(
			'admin',
			'administrator'
			);

		if ( isset( $_POST[ 'log' ] ) and isset( $_POST[ 'pwd' ] ) and in_array( trim( $_POST[ 'log' ] ), $blocked ) ) {
			error_log( 'WordPress login fail: ' . $_POST[ 'log' ] );
			die();
		}

	}

	function log_failure( $username ) {
		error_log( 'WordPress login fail: ' . $username );
	}


} // class

Создаем файл с именем login-protect.php с указанным выше содержимым и кидаем его в директорию wp-content/plugins или wp-content/mu-plugins. Заходим в «плагины» в панели управления и активируем плагин Lumpy Login Protect.

В файл ошибок htth сервера теперь при любой ошибочной авторизации будет выдаваться сообщение

WordPress login fail: <имя_пользователя>

и ip адрес клиента.

Далее настраиваем fail2ban. Здесь приведены настройка для nginx+php-fpm. Для apache — нечто подобное, только другой файл логов и иная структура сообщения об ошибке в фильтре.

В конец файла /etc/fail2ban/jail.conf добавляем что-то типа:

[wordpress]

enabled = true
port = http,https
filter = wordpress-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 1200
findtime = 600

Создаем новый файл фильтра /etc/fail2ban/filter.d/wordpress-auth.conf:

[Definition]
#По моему для apache будет так
#failregex = [[]client <HOST>[]] WordPress login fail.*

#Для nginx+php-fpm
failregex = .*WordPress login fail.*client: <HOST>.*
ignoreregex =

Перегружаем сервис fail2ban и всё должно работать.

При перепечатке просьба вставлять активные ссылки на oslogic.ru
Copyright oslogic.ru © 2021 . All Rights Reserved.