Защита 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, чтобы использовать это руководство.
Установите утилиты 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 использует фильтры для выявления нарушений, чтобы запретить пользователей, которые нарушают фильтр.
Создадим фильтр 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
Убедитесь, что у вас есть каталог 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
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 для блокировки пользователей. Мой веб-сервер может тратить больше времени, используя свои ресурсы более разумно, как обслуживания контента для быстрой доставки пользователю.