вторник, 1 июля 2014 г.

Скрипт блокировки брутфорсеров WordPress и Joomla

Я где-то писал, как можно блокировать ip-адреса с помощью nginx. Я смотрел адреса, которые имеют больше всего запросов за время ротации лога, вручную смотрел к каким страницам идёт соединение и если это были админки WordPress или Joomla, добавлял их в чёрный список и отдавал ошибку.
Автоматизировать это я решил самописным скриптом.
Скрипт анализирует лог, выделяет ip-адреса, которые более 3000 раз обращались к админке WordPress и Joomla и если этих ip-адресов ещё нет в чёрном списке, то добавляет их туда.
Скрипт запускается каждый час кроном.

Создаём файл скрипта:
# vim /etc/nginx/blockips.sh
#!/bin/bash
# Nginx block ip more than 3k connections to WordPress and Joomla admin panels
# [email protected]
# v0.1 29.06.2014
# v0.2 30.06.2014

# IP's > 3000 connections to WordPress and Joomla admin panels
command=$(cat /var/log/nginx/access.log | \
grep "administrator\|wp-login" | \
cut -f1 -d " " | \
sort | \
uniq -c | \
sort -n | \
awk '{ if ($1 > 2999) print $2}')

# Add new ip's to database
for word in $command; do
   # Is that ip already in database?
   grep $word /etc/nginx/blockips.conf > /dev/null
   if (( $? ));
   then 
      sed -i "s/allow all;/deny $word;\nallow all;/" /etc/nginx/blockips.conf
   fi
done
exit 0

Делаем скрипт исполняемым:
# chmod +x /etc/nginx/blockips.sh

Создаём файл, в котором будут храниться "плохие" ip-адреса:
# vim /etc/nginx/blockips.conf
allow all;

Адреса можно добавлять вручную, главное чтобы они находились перед allow all; формат файла такой:
deny ip_1;
deny ip_2;
...
allow all;

Подключаем этот файл в конфиг nginx (секция http):
# vim /etc/nginx/nginx.conf
http{
   ...
   include blockips.conf 
}

Добавляем скрипт в cron:
# crontab -e
...
*   *   *   *   *   /etc/nginx/blockips.sh
0   */1   *   *   *   /usr/bin/service nginx restart

3 комментария:

Анонимный комментирует...

При таком подходе остается нагрузка на nginx, лишнии записи в логе.
Сразу бы в iptables.
Да и конфиг nginx, разве не надо перечитывать каждый раз после добавления новых адресов?

Amet Umerov комментирует...

>Да и конфиг nginx, разве не надо перечитывать каждый раз после добавления новых адресов?
Да, надо

Amet Umerov комментирует...

В репозитории github описано, как пользоваться скриптом.