ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Защита wp-login в WordPress с Nginx HTTP Auth + fail2ban

Защита wp-login.php для WordPress имеет важное значение для защиты от переборов хакеров. Большинство администраторов WordPress будет использовать плагин , как All-in-One Security  (рекомендуется) или Wordfence, чтобы блокировать пользователей, которые делают чрезмерные попытки входа в систему. Проблема с техникой плагина заключается в том, что эти грубые методы защиты силы все еще дороги для вашего веб – сервера. Когда пользователь пытается войти в систему, происходит обработка PHP и делаются запросы MySQL, чтобы проверить, является ли пользователь действительным или нет. Если вы получаете много неудачных попыток входа в систему, то вы увидите, что использование центрального процессора и оперативной памяти излишне израсходованы.

Использование основного метода аутентификации HTTP с Nginx будет потреблять гораздо меньше ресурсов, чем при использовании плагина. При авторизации HTTP не будет использоваться ни PHP, ни MySQL, ваш сервер будет использовать значительно меньше ресурсов, для защиты себя от злоумышленников и хакеров. Мы настроим fail2ban для сканирования файлов журнала Nginx и запретим злоумышленникам на автомате.

Для этого урока вам потребуется доступ оболочки (корневой доступ SSH) на веб-сервер под управлением Debian или Ubuntu.

У вас должны быть установлены Nginx, PHP и WordPress, чтобы использовать это руководство.

Настройка Nginx с базовой HTTP Auth для WordPress

Установите утилиты Apache, чтобы получить генератор файла .htpasswd и Fail2ban

sudo apt-get update
sudo apt-get install apache2-utils fail2ban -y

Создайте файл .htpasswd для вызываемого пользователя andreyex

sudo htpasswd -c /etc/nginx/.htpasswd andreyex

Вам будет предложено ввести пароль дважды. Этот пароль хешированный md5 и будет хранится в файле /etc/nginx/.htpasswd

New password:
Re-type new password:
Adding password for user andreyex

Посмотрите, и вы можете увидите файл .htpasswd, который содержит только урезанный вариант вашего пароля

cat /etc/nginx/.htpasswd

Теперь нам нужно включить .htpasswd в другое место для Nginx в wp-login.php, откройте файл виртуального хоста Nginx

nano /etc/nginx/sites-available/wordpress

Убедитесь, что у вас есть журнал ошибок Nginx, указанный в вашем блоке сервера. fail2ban необходимо сканировать журналы ошибок, чтобы найти неудачные попытки входа.

Добавьте раздел wp-login.php, настройте fastcgi_pass, если вы все еще используете PHP 5.

server {
        listen 80;
        server_name andreyex.ru;
        access_log /var/log/nginx/andreyex.ru.access.log;
        error_log /var/log/nginx/andreyex.ru.error.log;

location = /wp-login.php {
        
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }

Нажмите Ctrl + X, Y и Enter для сохранения и выхода.

Проверьте синтаксис конфигурации Nginx на правильность заполнения.

nginx -t

Перезапустите Nginx, если вы не получили ошибки.

service nginx restart

Теперь мы создаем некоторые данные журнала, журнал Nginx заполняется с ошибками авторизации HTTP. Это позволит нам проверить, если fail2ban обнаружит неудачные попытки входа.

Убедитесь в том, используйте правильное имя пользователя и неправильный пароль. Также используйте неправильный пользователь и пароль, каждая неудача генерирует различные данные журнала.

Посмотрите в ваш файл журнала Nginx

cat /var/log/nginx/andreyex.error.log

Будет примерно следующее:

2017/02/03 08:12:11 [error] 21122#21122: *1 user "wp" was not found in "/etc/nginx/.htpasswd", client: 192.168.60.1, server: 192.168.55.095, request: "GET /wp-login.php HTTP/1.1", host: "192.168.55.095"
2017/02/03 08:12:11 [error] 21122#21122: *1 user "andreyex": password mismatch, client: 192.168.60.1, server: 192.168.55.095, request: "GET /wp-login.php HTTP/1.1", host: "192.168.55.095"

Теперь пришло время, чтобы создать фильтр для Nginx

Настройка fail2ban для запрета взломов в WordPress

Fail2ban использует фильтры для выявления нарушений, чтобы запретить пользователей, которые нарушают фильтр.

Создание фильтра Fail2ban для Nginx HTTP Auth

Создадим фильтр Nginx, если вы находитесь в Fail2ban и у вас уже есть этот файл, в этом случае вы можете переходить к тестированию с помощью команды fail2ban-regex.

sudo nano /etc/fail2ban/filter.d/nginx-http-auth.conf

Добавьте код ниже, который является регулярным выражением для логов выше, взято из источника

[Definition]
failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S*, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"(, referrer: "\S+")?\s*$

ignoreregex =

 

Нажмите Ctrl + X, Y + Enter, чтобы сохранить изменения и выйти.

Теперь мы можем проверить фильтр аутентификации Nginx HTTP, сканируя журнал ошибок, указанный в файле виртуального хоста Nginx.

fail2ban-regex /var/log/nginx/andreyex.error.log /etc/fail2ban/filter.d/nginx-http-auth.conf

Вы увидите этот вывод, показывающий, наши неудачные попытки входа, которые мы сгенерировали ранее.

Running tests
=============

Use   failregex file : /etc/fail2ban/filter.d/nginx-http-auth.conf
Use         log file : /var/log/nginx/andreyex.error.log


Results
=======

Failregex: 2 total
|-  #) [# of hits] regular expression
|   1) [2] ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: , server: \S+, request: "GET /wp-login.php.*$
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [2] Year/Month/Day Hour:Minute:Second
`-

Lines: 2 lines, 0 ignored, 2 matched, 0 missed

Создание Fail2ban для Nginx Jail HTTP Auth

Убедитесь, что у вас есть каталог jail в Fail2ban.

sudo mkdir -p /etc/fail2ban/jail.d

Создание конфигурационного файла Fail2ban jail для Nginx HTTP аутентификации

sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf

Вставьте конфигурацию, использующая фильтр, который мы создали ранее, она будет сканировать все файлы журнала Nginx и банить пользователей в течение 6000 минут, которые зашли с ошибками 3 раза в 60-секундный период.

[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/*.log
findtime = 60
bantime = 6000
maxretry = 3

Теперь, когда мы настроили jail, проверим синтаксис Fail2ban, убедившись, что это все работает

sudo fail2ban-client -d

Если вы не увидели каких-либо ошибок (предупреждения OK), то мы можем перезапустить fail2ban

service fail2ban restart

Проверка статуса Nginx HTTP Auth Fail2ban

Fail2ban клиент может быть использован, чтобы показать статистику.

sudo fail2ban-client status nginx-http-auth

Во время местного теста нам удалось получить заблокированный шлюз IP.

Status for the jail: nginx-http-auth
|- filter
|  |- File list:        /var/log/nginx/andreyex.error.log /var/log/nginx/error.log
|  |- Currently failed: 0
|  `- Total failed:     3
`- action
   |- Currently banned: 1
   |  `- IP list:       192.168.55.5
   `- Total banned:     1

Вы также можете перечислить IPTables

sudo iptables -L -n

Это показывает цепочку IPtables для ограничения Nginx HTTP Auth запросов

Chain f2b-nginx-http-auth (2 references)
target     prot opt source               destination
REJECT     all  --  192.168.0.1          0.0.0.0/0            reject-with icmp-port-unreachable
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Вы увидите много ботов сканирования и положить пароли по умолчанию. Они будут быстро запрещены. После того как я установил это решение безопасности WordPress мне не нужны никакие тяжелые PHP плагины как WordFence для блокировки пользователей. Мой веб-сервер может тратить больше времени, используя свои ресурсы более разумно, как обслуживания контента для быстрой доставки пользователю.

Защита wp-login d WordPress с Nginx HTTP Auth + fail2ban

Exit mobile version