База знаний по Open Source
Авторизация
Поиск по базе знаний

Для защиты сайтов на 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 и всё должно работать.

3 комментария: fail2ban для защиты WordPress

Добавить комментарий