Как защитить сайт на WordPress от взлома брутфорсом (перебором паролей)?

Всё началось с письма. Ну прямо как у Гарри Поттера.

1

С той, правда, разницей, что письма были электронные, приносили их вовсе не ночные пернатые хищники, и отправитель не в Хогвардсе. Итак, сижу, никого не трогаю, как вдруг приходит на почту вот это.

Your website, Мобильный блог Доктора Лексиума, is undergoing a brute force attack.

There have been at least 10 failed attempts to log in during the past 120 minutes that used one or more of the following components:

Component                    Count     Value from Current Attempt
------------------------     -----     --------------------------------
Network IP                       1     xxx.xxx.xxx.*
Username                        10     admin
Password MD5                     1     210282d0570bafea643b1884e1a74737

The most recent attempt came from the following IP address: 109.160.202.130

The Login Security Solution plugin (0.50.0) for WordPress is repelling the attack by making their login failures take a very long time.  This attacker will also be denied access in the event they stumble upon valid credentials.

Сказано, что мой сайт пытались взломать перебором паролей. Я, как дядя Вернон, письмо уничтожил. Ну зашел некто, ну попробовал 10 раз ввести пароль, ну обломался. Тоже мне невидаль.

Однако, через пару часов, пришло еще одно такое письмо.

3

За неделю их набралось так много, что я не выдержал. Врезал кулаком по столу, нахмурился и гордо продекламировал знаменитое: «Хватит это терпеть».

Откуда взялись письма, или как защитить сайт от взлома I

Конечно, письма ко мне пошли не просто так. Однажды сайт чебурахнулся или, говоря более простым языком, упал. Я его поднял, но… через пару часов он снова… Чебурашка, ытить. Полез в логи сервера и обнаружил, что на сайт ломится толпа ботов, обращающихся по всем возможным путям к странице авторизации. В тот день, я поставил редирект с блога на свою страничку в ЖЖ, а сам пошел штудировать мануалы.

После этого, сделал три вещи:

1. Создал нового пользователя с зубодробительным логином, а пользователя admin грохнул. Именно с админа боты и начинают перебирать. Пароль сменил на длинный и случайный набор знаков.

Важное замечание! Отображаемое имя ни в коем случае не должно совпадать с логином! Убедись в этом, зайдя в пункт меню админки «Пользователи» и проверь каждого.
nelogin
Иначе быстро срисуют и начнут перебирать пароли уже по нему, а не по admin.

2. Поставил каптчу (плагин SI CAPTCHA Anti-Spam) на страницу авторизации. Конечно, она не спасает прям на 100%, ведь есть сервисы распознавания каптч. Благодаря школоло-фактору, они эффективны и дешевы, но все-таки платные, что отобьет охоту у некоторых хакеров.

3. Поставил плагин Login Security Solution, который ограничивает количество неудачных попыток авторизации. Теперь, после десяти неправильных паролей, логин блокируется на 2 часа. Чуть позже, увеличил интервал до 8 часов. Вот этот самый плагин и шлёт письма с предупреждениями, за что ему спасибо.

Это помогло. Я уже и забыл, что меня пытались взломать. Но вот, прошла пара месяцев и письма стали приходить снова. Вновь поднялся вопрос о защите сайта от атак.

Как защитить сайт от взлома II

Для начала, я заблокировал доступ к папке wp-admin всем, кроме нескольких IP-адресов, с которых хожу в сеть. Для этого, разместил в указанной папке файл .htaccess вот с такими строчками:

order deny,allow
deny from all
allow from 213.180.193.11

Данные директивы запрещают пускать туда всех, кроме того, кто пришел с IP адреса 213.180.193.11 (т.е. с моего).

Если у тебя нет постоянного IP (например ходишь в сеть с телефона), такой вариант не подойдет. Есть другой способ, но о нем дальше.

Через 2 часа пришло письмо счастья, радуя новостью, что меня снова пытались взломать. Учитывая, что логин уже давно не admin, а ломали именно через него, я особенно не нервничал. Но сам факт раздражает.

4

Тогда, я запретил доступ и к файлу wp-login.php (что в корне сайта) и мерзко ухмыльнулся, думая, что дело в шляпе. Каптчу обошли, но это ботам точно не по зубам.

Кстати, есть похожий метод, когда данный файл переименовывают. Подробности тут http://prostolinux.ru/kak-zashhitit-sajt-wordpress-ot-vzloma/ Однако, я идейно против того, чтобы ломать движок костылями. Опыт подсказывает, что в будущем подобный подход может аукнуться. Хотя, вариант вполне действенный, так что сбрасывать его со счетов не стоит.

Так что, просто добавил вот эти строчки в файл .htaccess в корне сайта.

<Files wp-login.php>
order deny,allow
deny from all
allow from 213.180.193.11
</Files>

Через 2 часа в ящик упало новое уведомление. Моя челюсть брякнулась об стол, от удивления. КАК!?

5

Ну хорошо! Закрыл файл wp-login.php еще и дополнительным паролем. Как думаешь, что пришло на почту через 2 часа? У меня глаза на лоб полезли. Ну невозможно же! Этого быть не может!

6

Тогда я, внезапно, вспомнил про один любопытный факт. Дело в том, что для движка WordPress есть замечательные приложения для Android и Apple. Они позволяют управлять сайтом со смартфона или планшета. Тут тебе и возможность публиковать посты, и оперативно отвечать на комментарии, и даже выкладыать фото-видео.  Всё это можно делать, как ты понимаешь, из любой точки, где есть интернет. Хоть из туалета. Удобно — не то слово.

Однако, не смотря на всю мою защиту, эти приложения ее проигнорировали, что как бы намекает на то, что для них есть отдельный черный ход, не связанный никак с wp-login.php

Черный ход

Оказалось, приложения авторизуются через файл xmlrpc.php (тоже в корне сайта). Но, и боты повадились перебирать пароли тоже через него. Встал вопрос о том, как закрыть проход, но так, чтобы приложения и дальше могли авторизовываться. Понятно, что просто перекрыть — не вариант. Закрыть по IP, тоже не то. У мобильного интернета IP динамический, т.е. каждый раз разный.

Решение оказалось простым. Достаточно установить доступ к файлу xmlrpc.php по паролю.

Рецепт:

1. Идём на сайт http://seriyps.ru/crypt/htpasswd/ и вводим придуманные логин и пароль, жмем кнопку, получаем строчку, где вначале логин, потом двоеточие, а дальше непонятная последовательность символов.

7

Вот что получилось у меня: loginn:zLgH8tq9vTxPs

2. В корне сайта создаем файл .htpasswd и вписываем в него полученную строчку loginn:zLgH8tq9vTxPs обычным блокнотом. Сохраняем.

3. Открываем файл .htaccess в корне сайта и вписываем в него вот это:

<Files xmlrpc.php>
AuthName "Пшол вон отсюда!"
AuthType Basic
AuthUserFile '/полный_путь_к_корню_сайта/.htpasswd'
Require valid-user
</Files>

Собственно, это всё. Сохраняем и радуемся. Главное, не забудь заменить «полный_путь_к_корню_сайта» на ПОЛНЫЙ путь к корню сайта.

Я еще добавил в .htaccess еще и вот эти строки:

<Files license.txt>
order deny,allow
deny from all
</Files>

<Files readme.html>
order deny,allow
deny from all
</Files>

Для чего? А для того, чтобы боты не могли по этим файлам понять, какую версию WordPress я использую на данный момент.

Как быть с приложениями?

Для работы приложений, которые управляют движком WordPress нужно добавить логин/пароль к файлу. Покажу на примере Андроида. Картинки кликабельны!

Итак, открываем приложение.

w1

Жмем кнопочку вызова меню.

w2

В меню выбираем пункт «Настройки». Не забываем, что по картинкам можно кликнуть, чтобы рассмотреть в подробностях.

w3

Выбираем нужный нам блог. Да, да! Их может быть несколько!

w4

Вносим логин и пароль, которыми защитили файл xmlrpc.php в те поля, что я выделил красной рамочкой.

Дело сделано! Теперь ты можешь и дальше публиковать посты с телефона.

Резюме

Чтобы защитить сайт на WordPress от брутфорса:

1. Удаляем пользователя с логином admin, заменив его другим.

2. Ставим плагин ограничивающий попытки авторизации и плагин каптчи.

3. Устанавливаем пароль на файл xmlrpc.php

8

Послесловие

Я ждал неделю, но никаких писем о взломе больше не приходило. Благодать… Я наконец выдохнул и налил чаю. Победа, маленькая, но моя!)

Конечно, перебрать пароли и логины к файлу тоже можно. Но когда это произойдёт и пойдёт перебор пароля уже к админке, я получу письмо от плагина, и просто сменю реквизиты доступа. Пусть боты стараются дальше.Теперь, предстоит установить защиту на пару десятков сайтов, которыми занимаюсь. Так что, допив чай, придвигаю клавиатуру поближе и приступаю.

Update 14.02.2015: Все перечисленное помогло, но не на 100%. На сайты, где wp-login.php не был закрыт по IP, атаки продолжились, хоть и не так активно. Плагин Bluetrait Event Viewer показал, что перебор ведется не только по логину admin. Перебираются и близкие к нему сочетания. Например administrator. Решением будет закрытие админки (и файла для авторизации) от всех IP, кроме доверенного. Получить его можно, используя тунельное подключение (см. по ссылке). О том, как закрыть, читай в самом начале поста.

Update 12.08.2015: Боты научились подбирать логин. Делается это с помощью формы восстановления пароля. Если подбираемый логин совпал с тем, что есть в базе WordPress, система управления выводит уведомление, мол вам на почту отправилось письмо со ссылкой на восстановления. Письмо злоумышленник не получил, но теперь знает логин. Лечится параноидальной защитой админки и файлов авторизации паролем, допуском по IP, созданием нового пользователя с правами админа и удалением старого, которого вычислили (перекинув его публикации на нового в момент удаления).

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *