[РЕШЕНО] Защита от ботов fail2ban+csf сервера nginx c друпалом на борту

Ср, 26/11/2014 - 14:30

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

Настроим наш nginx сервер для победы над спам ботами --->>

Установка CFS (ConfigServer Firewall)

1. Качаем архив:

2. Распаковываем:

tar -xzf csf.tgz

3. Устанавливаем:

Если есть другие фаервольные скрипты, например UFW, то нужно их остановить. Правила в iptables удалятся автоматически.

ufw disable

cd csf

sh install.sh

Фаервол теперь установлен и теперь проверим все ли требуемы модули iptable доступны.

perl /usr/local/csf/bin/csftest.pl

Fail2ban будет работать, если при проверки везде OK.

Установка fail2ban

1. Устанавливаем модуль на друпал сайт:

Включаем syslog модуль.

2. Редактируем /etc/fail2ban/jail.conf, добавляем в конец файла:

[drupal-fail2ban]
enabled  = true
port     = http,https
protocol = tcp
filter   = drupal-fail2ban
action = csf-ip-deny[name=drupal]
logpath  = /var/log/messages
maxretry = 5
findtime = 86400

bantime  = 21600

3. Создаем фильтр /etc/fail2ban/filter.d/drupal-fail2ban.conf со следующим содержимым:

[Definition]
failregex = \|user\|<HOST>\|.*\|Login attempt failed (.+)\.$
ignoreregex =

4. Создаем фильтр /etc/fail2ban/action.d/csf-ip-deny.conf со следующим содержимым:

# CSF / fail2ban integration from The Digital FAQ (digitalFAQ.com)

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = csf -d <ip> Added by Fail2Ban for <name>
actionunban = csf -dr <ip>
 
[Init] name = default
 
# Read more: http://www.digitalfaq.com/forum/web-tech/5692-fail2ban-csf-blocking.html#ixzz3Jfzkmx00

5. Запуск

Останавливаем сервер:

/etc/init.d/nginx stop

рестартим fail2ban:

service fail2ban restart

Запускаем сервер:

/etc/init.d/nginx start

Смотрим работу командой:

tail -f /var/log/fail2ban.log

должно быть примерно так:

2014-11-24 16:02:22,881 fail2ban.actions: WARNING [drupal-fail2ban] 110.85.100.178 already banned

2014-11-24 16:02:25,884 fail2ban.actions: WARNING [drupal-fail2ban] 110.85.100.178 already banned

2014-11-24 16:11:01,528 fail2ban.actions: WARNING [drupal-fail2ban] 91.200.12.41 already banned

2014-11-24 16:12:10,612 fail2ban.actions: WARNING [ssh] Ban 178.254.22.90

2014-11-24 16:22:11,384 fail2ban.actions: WARNING [ssh] Unban 178.254.22.90

наконец то стало легче дышать, скорость сайта возросла в 10-15 раз, боты прибиты, переходить на более дорогой тариф не надо!

-----------------------------------------------------------------------------------------------------------------------------------------

Дополнение (для более тонкой настройки):

Обнаружение вражеской подсети:

1. Формат лог файла у fail2ban /var/log/fail2ban.log примерно такой:

...

2006-02-13 15:52:30,388 fail2ban.actions: WARNING [sendmail] Ban XXX.66.82.116

2006-02-13 15:59:29,295 fail2ban.actions: WARNING [sendmail] Ban XXX.27.118.100

2006-02-13 16:07:31,183 fail2ban.actions: WARNING [sendmail] Unban XXX.66.82.116

2006-02-13 16:14:29,530 fail2ban.actions: WARNING [sendmail] Unban XXX.27.118.100

2006-02-13 16:56:27,086 fail2ban.actions: WARNING [ssh] Ban XXX.136.60.164

2006-02-13 17:11:27,833 fail2ban.actions: WARNING [ssh] Unban XXX.136.60.164

2. Генерация простых отчетов:

Группировка ip-адресов:

awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq -c | sort -n

Примерный вывод:

...

4 XXX.124.81.130

5 XXX.248.175.246

8 XXX.29.45.142

Определяем самую зловредную субсеть:

zgrep -h "Ban " /var/log/fail2ban.log* | awk '{print $NF}' | awk -F\. '{print $1"."$2"."}' | sort | uniq -c | sort -n | tail

Примерный вывод:

...

75 83.110.

90 219.95.

154 210.213.

Анализируем зловредную сеть, сколько раз эта зараза появлялась в лог файлах:

zgrep -c 210.213. /var/log/fail2ban.log*

Примерный вывод:

fail2ban.log:39

fail2ban.log.1.gz:129

fail2ban.log.2.gz:55

fail2ban.log.3.gz:78

fail2ban.log.4.gz:22

Зловредную сеть определили, а там уже можно и внести её в фаервол, определить страну (я например, весь Китай забанил) и т.д.

3. Бан подсети:

Доступа SSH:

iptables -I INPUT -p tcp -s XXX.XXX.XXX.XXX/XX --dport ssh -j REJECT --reject-with tcp-reset

Доступа SMTP:

iptables -I INPUT -p tcp -s XXX.XXX.XXX.XXX/XX --dport smtp -j REJECT --reject-with tcp-reset

Доступа HTTP:

iptables -I INPUT -p tcp -s XXX.XXX.XXX.XXX --dport http -j REJECT

Доступа FTP:

iptables -I INPUT -p tcp -s XXX.XXX.XXX.XXX --dport ftp -j DROP

и по аналогии так можно защитить другие службы.

Блокировка страны

Сервер должен включать модуль --with-http_geoip_module

проверяем:

nginx -V

должно быть, примерно, так:

root@server1:~# nginx -V
nginx version: nginx/1.2.1
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-auth-pam --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-echo --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-upstream-fair --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-dav-ext-module
root@server1:~#

также устанавливаем базы данных:

apt-get install geoip-database libgeoip1

Обновляем базы на самые новые:

mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bak
cd /usr/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz

Если атака идет от определенной страны, то можно заблокировать доступ к серверу определенной стране, например Китаю:

vi /etc/nginx/nginx.conf

и вставляем в http {} блок:

[...]
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default yes;
        CN no;
        FM no;
        EH no;
    }
[...]

Коды стран

и вставляем в конфиг нашего сайта (лежат в /etc/nginx/sites-available) в контейнер server {}:

[...]
        if ($allowed_country = no) {
            return 444;
        }
[...]
0 Спасибо

Комментарии

Аватар пользователя Lotar
2 года 3 months назад Lotar #

Это интересно. А как он гуглояндексодругих ботов выделяет?

0 Спасибо
Аватар пользователя ttenz
2 года 3 months назад ttenz #
kosHta написал:
Фэйлтубан поможет на верхнем уровне, я верно понял?

на подступе, это тот же фаервол.

Lotar написал:
А как он гуглояндексодругих ботов выделяет?

см. фильтры в папке /etc/fail2ban/filter.d/

0 Спасибо
Аватар пользователя drupby
1 год 4 months назад drupby #

небольшой OFFTOP - недавно в поисковой выдаче яндекса обнаружил

зачем тебе реклама в директе?

0 Спасибо
Аватар пользователя Виктор Степаньков ака RxB
2 года 3 months назад Виктор Степаньк... #

Когда-то, года 4 назад, я в рамках патруля предлагал сделать свою сеть "вредных" ip.

0 Спасибо
Аватар пользователя ttenz
2 года 3 months назад ttenz #
RxB написал:
Когда-то, года 4 назад, я в рамках патруля предлагал сделать свою сеть "вредных" ip.

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

0 Спасибо
Аватар пользователя Виктор Степаньков ака RxB
2 года 3 months назад Виктор Степаньк... #
ttenz написал:
думаю, они не сделали, т.к. боты - это нагрузка на сервер, а нагрузка - это деньги, это и послужило причиной ухода с патруля.

Конечно не сделали. Как минимум, я перестал в патруле работать.
Единственное, что было, это ограничение по User-Agent в конфиге nginx

0 Спасибо