Защита WordPress от брутфорс атаки [11 способов]

Что такое брутфорс-атака? Это попытки получения несанкционированного доступа к сайту или серверу методом перебора всевозможных комбинаций из логина и пароля. Брутфорс в дословном переводе означает «грубая сила».

Возможно, вы считаете, что брутфорс атаки вас не касаются, потому что ваш небольшой и не очень популярный сайт не представляет интереса для хакеров. Вынуждены вам сообщить, что это давно уже не так. Любой ресурс в сети является объектом постоянных многочисленных атак. Целью таких атак является не сам сайт, а ресурсы сервера, на которых он размещается: взломанный сайт превращается в площадку для хостинга вирусов, рассылки спама, фишинга, майнинга криптовалют и т. д. Поэтому защищать админ-панель любого сайта — это необходимость. В противном случае рано или поздно доступ будет взломан.

В этот раз рассказываем, как защитить админ-панель WordPress от взлома через брутфорс — способов очень много, каждый найдет для себя самый простой и удобный, при этом эффективный.

1. Сложные пароли

Да-да, все так просто. Первый и главный способ защиты — использование надежных паролей и их регулярная замена. Вы должны всегда, ВСЕГДА использовать только сложные парольные комбинации. Это относится ко всем пользователям админ-панели сайта, а не только к главной учетной записи администратора. Также не забывайте использовать сложные пароли на панель управления хостингом, FTP, базу данных, и любые другие учетные записи, относящиеся к вашим сайтам.

На данный момент надежным можно считать пароль с длиной от 12 символов, содержащий буквы, цифры и специальные символы. Другой вариант, — если хотите использовать удобный к запоминанию пароль, — это использовать три или более слова, не взаимосвязанных по смыслу, между которыми будут какие-либо спец-символы в качестве разделителей. И третий вариант — используйте пароль, состоящий из понятных запоминаемых слов на русском языке, вводимых на английской раскладке клавиатуры.

Примеры надежных паролей по каждому из описанных способов их создания:

(?CeRo*S9&rWT^J=zPu_
Superterrestrial_nationalism-basket
Cfvsq-Kexibq-Cfqn_567

2. Изменение логина администратора

Для новых установок WordPress рекомендуем сразу указывать неочевидный логин. То есть не указывайте имя пользователя admin, administrator, webmaster, superadmin, test, testadmin и прочие. Если у вас уже есть учетка с логином admin — очень рекомендуем ее изменить. Сделать это очень просто в админ-панели. Нужно нажать Пользователи — Добавить нового. Не забудьте дать новому пользователю права администратора.

admin_wp

После этого нужно авторизоваться с новым логином и удалить пользователя с логином admin.

admin_wp1

3. Ограничение доступа по IP-адресам

Если ваш интернет провайдер предоставляет статический IP-адрес, или он редко изменяется, или же есть ограниченный список адресов, с которых может производиться доступ в админ-панель WordPress, то рекомендуется ограничить доступ этим самым списком адресов. Если управлением занимается несколько человек и адреса часто меняются, то данный способ защиты не будет удобным.

Настройка ограничения доступа по IP-адресам для Apache

Настроить ограничение по IP-адресу можно при помощи файла .htaccess, который нужно поместить в папку wp-admin/:

<IfModule mod_authz_core.c>
<RequireAny>
Require all denied #запретить всем
Require ip 127.0.0.1 #разрешить локальные подключения
Require ip 23.45.67.89 #один адрес
Require ip 10.20.30.40 #еще один адрес
Require ip 123.123.123.0/24 #блок адресов
</RequireAny>
</IfModule>

Указанная настройка актуальна для веб-сервера Apache 2.4+.

Настройка ограничения доступа по IP-адресам для Nginx

Если на вашем сервере используется Nginx + php-fpm, то добавлять ограничения нужно в файл конфигурации Nginx для соответствующего сайта (в блоке server):

location ~* ^/(wp-admin|wp-login.php)
{
allow 23.45.67.89; #один адрес
allow 123.123.123.0/24; #блок адресов
deny all; #запрет всем остальным
}

Обратите внимание на обязательные точки с запятой в конце каждой строки и на то, что все разрешения (allow) должны быть выше запретов (deny).

4. Двухэтапная авторизация

Защита файлов и директорий паролем в cPanel

Можно установить защиту паролем на любую директорию на сервере средствами встроенного модуля веб-сервера. Для хостинга на базе панели cPanel нужно нажать в панели Файлы — Конфиденциальность каталога.

cpanel, protect directory

На следующем экране выберите папку, которую вы хотите защитить (/home/username/public_html/wp-admin). При нажатии на иконку слева происходит открытие каталога, при нажатие на название каталога — выбор.

cpanel, choose dir to protect with password

Далее укажите логин и пароль и включите защиту. Вы же помните, что пароли должны отвечать критериям из пункта 1? Ну и, конечно, не устанавливайте одинаковые пароли на различные формы ввода.

setup directory protect in cpanel

В результате этих действий в папке wp-admin будет создан файл .htaccess с такими настройками:

AuthType Basic
AuthName "Autorize"
AuthUserFile "/home/username/.htpasswds/domain.com/passwd"
require valid-user

К сожалению, интерфейс панели управления не предусматривает защиту файла wp-login.php. Потому нужно скопировать фрагмент выше и вставить его в основной файл .htaccess в папке вашего сайта (обычно это /home/username/public_html) таким образом:

<FilesMatch "wp-login.php">
AuthType Basic
AuthName "Autorize"
AuthUserFile "/home/username/.htpasswds/domain.com/passwd"
require valid-user
</FilesMatch>

Защита файлов и директорий паролем в Apache

Если у вас панель управления не cPanel, или вообще нет панели управления на сервере, то можно просто добавить такие строки, как указано выше. После чего нужно сгенерировать сам файл доступа (прописан в строке AuthUserFile). Пароли в данный файл записываются в зашифрованном виде. Для шифрования пароля можно использовать сервис. Полученные строчки нужно вписать в файл паролей, который в примере записан как /home/username/.htpasswds/domain.com/passwd

Содержимое файла passwd должно выглядеть примерно так:

admin:$apr1$jO5DLVTA$/KiKawt4F52ZNnTISPC1y/
editor:$apr1$BsN/.Ddj$zSgP0RrJpvgazIS4D23Ce/

Защита файлов и директорий паролем в Nginx

И в случае использования только веб-сервера Nginx — добавьте такие строчки в файл конфигурации для сайта (в блоке server):

location   ~* ^/(wp-admin|wp-login.php)
{
auth_basic "Unauthorized";
auth_basic_user_file "/home/username/.htpasswds/domain.com/passwd";
}

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

Для проверки правильности конфигурационного файла Nginx и перезагрузки веб-сервера в командной строке нужно выполнить:

~# nginx -t
~# systemctl restart nginx

Путь к файлу, который выше указан как «/home/username/.htpasswds/domain.com/passwd» может быть любой. Главное, чтобы пользователь, от имени которого работает Nginx, имел права на его чтение. Содержимое данного файла формируется точно так же, как и при настройке для веб-сервера Apache.

5. Отключение xmlrpc.php

Атаки путем запросов к файлу xmlrpc.php очень популярны, поскольку таким образом за один запрос возможно перебрать десятки тысяч комбинаций различных логинов и паролей. Поэтому очень важная часть защиты админ-панели — это отключение или ограничение доступа к данному файлу. В WordPress протокол XML-RPC используется для взаимодействия движка с различными внешними приложениями, например, Jetpack. Как показывает практика, в 99% сайтов файл xmlrpc.php не используется вообще. Если вы сомневаетесь, используется он у вас или нет, то создайте резервную копию файлов, которые вы будете изменять перед выполнением дальнейших инструкций.

Отключение xmlrpc.php при помощи плагинов

Для отключения xmlrpc.php можно использовать различные плагины, которых на данный момент уже достаточно много. Просто напишите в поиске в маркетплейсе плагинов «xmlrpc»:

После установки не забудьте активировать плагин и включить саму защиту в настройках выбранного плагина.

Запрет доступа к  xmlrpc.php при помощи .htaccess

Первый вариант:

<IfModule mod_alias.c>
RedirectMatch 403 (?i)/xmlrpc.php
</IfModule>

Этот способ будет полезен, если у вас в одной папке несколько установок WordPress в разных подпапках. Достаточно разместить код настройки в главном .htaccess-файле, который располагается уровнем выше папок с WordPress, и все сайты будут защищены. Также защита регистронезависимая, то есть будет работать в случае атаки запросами с заглавными буквами.

Второй вариант:

<Files xmlrpc.php>
Require all denied
Require ip 127.0.0.1 #разрешить локальные подключения
Require ip 23.45.67.89 #один адрес
Require ip 10.20.30.40 #еще один адре
</Files>

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

Запрет доступа к  xmlrpc.php при помощи Nginx

Если на вашем сервере не используется Apache, то запрет доступа через Nginx будет выглядеть так:

location /xmlrpc.php
{
allow 23.45.67.89; #один адрес
allow 123.123.123.0/24; #блок адресов
deny all; #запрет всем остальным
}

Отключение xmlrpc.php при помощи пользовательской функции

Еще один вариант защиты связан с добавлением пользовательской функции в файл вашей темы сайта. В конце functions.php вашей темы добавьте код:

function shapeSpace_disable_xmlrpc_multicall($methods) {
unset($methods['system.multicall']);
return $methods;
}
add_filter('xmlrpc_methods', 'shapeSpace_disable_xmlrpc_multicall');

Данный метод позволяет не затрагивать настройки Apache или Nginx и будет полезен, если у вас ограниченный доступ к серверу, где расположен сайт. Но недостаток в том, что защита привязана к конкретной теме и при ее изменении или обновлении настройку нужно добавлять повторно.

6. Ограничение числа попыток входа в админ-панель

Для автоматической блокировки взломщиков можно использовать плагин, который ограничивает число неудачных попыток входа в админ-панель WordPress. Например, можно использовать Limit Login Attempts Reloaded. После установки и активации в настройках можно установить лимит попыток входа и время блокировки, а также добавить некоторые адреса или диапазоны адресов в белый или черный список на постоянной основе.

7. Использование двухфакторной аутентификации

При подключении двухфакторной авторизации для входа в админ-панель необходимо предоставить два типа данных — обычный пароль и некоторый одноразовый пароль, генерируемый вашим смартфоном в приложении Google Authenticator (Android | iOS). Подключение производится при помощи плагина, который также позволяет использовать приложения Authy Authenticator  и LastPass Authenticator, помимо Google Authenticator. Для начала настройки нужно будет зарегистироваться на сайте разработчика плагина (можно сделать прямо в админ-панели) и далее выбрать приложение для двухфактороной авторизации.

После подключения приложения не забудьте активировать защиту страницы авторизации.

8. Изменение секретных ключей для куки

Данные ключи находятся в файле конфигурации wp-config.php и выглядят так:

define('AUTH_KEY', 's0lj0b~7iR`EyyI36;A(1e,#yc|i(>YB8TER:<yBLoxx;w)KF@T{t2Gx%D++X7lj');
define('SECURE_AUTH_KEY', 'HtOFJu-|I7|&fz]8 b-)T0cT+DEmFP<yKpE0+F4]Rp>(9!F6ChL+)&k1G(Ch>L8`');
define('LOGGED_IN_KEY', '<.4=H2dN8+9pif2Zd*4N}Gra{+y TsxopbEf+&GoJ u7`:Cs]A}&L #dB&[b3k|0');
define('NONCE_KEY', 'PlRd6E.s`f&X)K%;-#`~Xni`0?(=nQl_Wl# ?AT+v,8k.1PrukCm?ax]55Q+&SH!');
define('AUTH_SALT', '0F24#]RP2h>!StYxA}Hvc[uJkqO]g`7xfLA&p{ F$7|bUfB{B<Hx 69y>zQ9gA|F');
define('SECURE_AUTH_SALT', 'S~IKi]Ok1=;EP8}u[B#s&BfGE]i*Z^JHXqc6&gJ1DJ3$W0Rs-o)@Mo|Iu:.?7A`/');
define('LOGGED_IN_SALT', '1;D~W]s&_7[XVJ]vx>HA|u=.JvcEHHTf),UZ$lN| kxIT-zdAkOi0kcq+IT]&E`!');
define('NONCE_SALT', '3vIG<DWecj+KXbA9zN8DSZsVt}CJn]|7Ol;zBFxepClZ*Y8QZ`oGtW/.?6 z=B5G');

При установке WordPress используется некторый набор ключей по умолчанию, который будет одинаковым для всех. Потому, если злоумышленник сможет заполучить хеш пароля администратора, то он сможет и расшифровать его с этими стандатртными ключами. Сгенерировать уникальные ключи можно на специальной странице.

Каждый раз при переходе или обновлении страницы ключи обновляются.

9. Установка капчи на форму авторизации в админ-панель

Еще один метод защиты от ботов — это включение капчи на странице авторизации (а также регистрации и комментариев). Как вариант, можно использовать плагин Captcha by BestWebSoft.

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

В результате страница авторизации будет выглядеть так:

10. Изменение адреса админ-панели

Возможно, это не самый простой и удобный способ защиты, но точно один из максимально эффективных. Изменить адрес (URL) для входа в админ панель можно вручную, если вы опытный администратор, или же при помощи специальных плагинов.

Вручную процесс состоит из нескольких этапов:

1. Переименуйте файл wp-login.php. Используйте случайную последовательность строчных латинских букв, цифры и тире. Например: some-new-page456.php
2. В получившемся файле найдите все упоминания wp-login.php и замените их на новое название.
3. Для корректной работы сайта замену необходимо проделать также в файлах: wp-activate.php, general-template.php, post-template.php, functions.php, class-wp-customize-manager.php, general-template.php, link-template.php, admin-bar.php, post.php, pluggable.php, ms-functions.php, canonical.php, functions.wp-scripts.php, wp-signup.php, my-sites.php, schema.php, ru_RU.po

После этого адрес админ панели будет располагаться по вашей новой ссылке https://site.com/some-new-page456.php. Доступ к новому файлу было бы полезно тоже ограничить и защитить паролем так, как указано выше.

Более простой способ — использование плагина, например, WPS Hide Login. После установки плагина в меню “Настройки” появится новый пункт WPS Hide Login.

11. Отключение вывода ошибок авторизации

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

Для этого достаточно добавить в functions.php темы вашего сайта всего одну строчку:

add_filter('login_errors',create_function('$a', "return null;"));

Редактировать файл можно любым удобным вам способом, как из админ-панели, так и по FTP или через файловый менеджер. Строчку нужно добавить в начале файла после открывающего тега (<?php ).

Это были самые на наш взгляд действенные методы защиты сайтов на WordPress от взломов методом брут-форс атаки. Вы можете выбирать какой-либо один или скомбинировать несколько. А в следующий раз мы познакомим вас с одним плагином, который объединяет в себе почти все описанные здесь методики защиты сайта.