Nginx - Защита сайта на VDS от атаки ботами [Основные методы блокировки]

»

Регистрация

| Атаки на сайт довольно распространённый метод вредительства.


За последние 5 лет, среднее количество и сила атак увеличилась в 10 раз. Если атака на Ваш сайт доставляет дискомфорт и VDS лагает, зависает, может и вовсе падает, тогда Вам сюда!

Статья несёт в себе не только список команд или конкретный метод борьбы с атакой, следует тщательно прочитать всю информацию для полноты восприятия, Вы потратите немного больше времени на прочтение, но получите больше информации и у Вас с вероятностью 99% всё получится.

Начнём с того, что порекомендуем заранее использовать VDS хостинг с защитой от DDoS, что бы минимизировать атаки, нацеленные на забивание полосы или сетевого стека. Благодаря этому, мы не будем тратить время на атаки, с которыми невозможно бороться на уровне сервера, а займёмся полезным делом.

Существует множество видов атак, которые не только могут навредить сайту, а Вашему VDS в целом.
AlienVDS защищает от множества DDoS атак и флуда, но иногда боты подстраиваются таким образом, что защита пропускает запросы, так как думает что сделаны они от настоящих посетителей, ботов может быть много и IP адреса уникальны, что очень усложняет фильтрацию и дальнейшую защиту.

Прочитав нашу статью, Вы сможете защитить свой сайт с шансом в 90% и заблокировать будущий http(s) флуд который может быть. Посоветуем какие настройки требуется вносить.

Начнём с обычного флуда на сайт (bruteforce, POST\HEAD\GET флуд и другое вредительство)

Какие проблемы могут быть?
  1. Забивание inode на сервере, это количество максимальных файлов (не размер файлов) которые могут быть на диске. Обычно это сессии и временные файлы от CMS (движка сайта).
  2. Перегрузка MySQL, даже при нормально работающем nginx и apache2, нужно искать в логах, куда именно идёт флуд и на какой скрипт, который приводит к нагрузке на MySQL.
  3. Перегрузка nginx или apache2, нужно читать логи и выяснять, куда идёт атака. Если в логах информации нет, но нагрузка есть, следует настроить правила iptables и сделать дамп трафика утилитой tcpdump, что бы анализировать дальнейшую защиту.
  4. Вас могут брутить, т.е подбирать логины\пароли, в этом случае требуется каптча и опять же чтение логов и их анализ, для более лучшего эффекта.
  5. Самое плохое, что может случится, что Ваш сервер VDS будет просто виснуть, когда ресурсы будут переполнены и сервер перегружен, тогда для борьбы с атакими нужно повышать тариф и иметь запас мощности.

1. Немного настроим наш Nginx веб-сервер 

Открываем конфиг по адресу /etc/nginx/nginx.conf
worker_processes - параметр должен быть равен количеству ядер на вашем сервере
worker_rlimit_nofile - устанавливаем параметр на значение 65535, если его нет, добавляем строчку выше worker_processes 

Находим поле
events {
    worker_connections  100;
}

Делаем так
events {
    worker_connections  65535;
    use epoll;
}

Пишем
/etc/init.d/nginx restart
для перезагрузки nginx

Дальнейшая настройка будет чуть позже.
2. Собираем информацию для дальнейшего анализа 

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

Самые популярные места, если у вас установлена панель IspManager
  • /var/www/httpd-logs
  • /var/www/ПОЛЬЗОВАТЕЛЬ/data/logs/
Более точно можно узнать в конфиге nginx.
grep -lr 'access_log' /etc/nginx/
Данной командой мы ищем все файлы где есть упоминание о access_log
/etc/nginx/nginx.conf
/etc/nginx/vhosts/user/site.com.conf
/etc/nginx/vhosts/user/site.ru.conf
Нас интересует логи из конфига сайта, а не самого nginx, например наш сайт site.com
Пишем далее
cat /etc/nginx/vhosts/user/site.com.conf | grep access_log
Получаем ответ
access_log /var/www/httpd-logs/site.com.access.log;
Вот мы и выяснили где находится лог нашего сайта

3. Анализируем полученные логи

Приступаем к чтению лога
tail -n 100 /var/www/httpd-logs/site.com.access.log

Данной командой мы читаем последние 100 строк файла, что бы не читать его весь, это занимает намного меньше времени и ответ практически мгновенный, особенно если размер лога достигает нескольких сотен мегабайт или даже гигабайт.

Информацию из лога показывать сюда, совершенно нет никакого смысла, ведь у каждого она будет разная, покажем лишь пример как вообще всё выглядит.

5.42.16.17 - - [14/May/2019:14:20:07 +0300] "GET /request.html HTTP/1.0" 200 1859 "https://site.com/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 YaBrowser/19.4.0.2397 Yowser/2.5 Safari/537.36"

Здесь вы видим следующую информацию.

5.42.16.17 - IP адрес с которого делается запрос

[14/May/2019:14:20:07 +0300] - Время запроса\посещения и часовой пояс по которому работает сервер

GET /request.html - страница к которой делается запрос

200 - статус ответа вебсервера(это ОК)

1859 - размер запроса в байтах, переданный посетителем на страницу (может быть любая информация, включая загрузку файла или передачу данных, как логин\пароль)

https://site.com/ - реффер, это та страница с которой последовал запрос, на страницу /request.html

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 YaBrowser/19.4.0.2397 Yowser/2.5 Safari/537.36 - здесь предоставлена информация о браузере посетителя, который к сожалению можно подменить.

Теперь когда мы разобрались с логом, переходим далее.

4. Проверяем все подключения к серверу, ищем наличие атаки

Составляем команду для анализа текущий подключений к веб-серверу, независимо от логов.
netstat -ntu | grep ":443\|:80" | grep -v 127.0.0.1 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
Получим примерно такой ответ
3 2.92.2.14
1 93.15.12.82
1 81.3.90.10
1 5.42.16.17
1 27.6.13.14

Слева количество подключений на данный момент и рядом IP адрес.
Если адресов не много, но много подключений с одного IP адреса, в логах видно что с одного ип много запросов, то очень просто его заблокировать.

5. Блокируем "плохие" IP адреса, которые атакуют сайт

Зная где конфиг нашего сайта, немного подправим некоторые пункты.

НЕ ЗАБЫВАЕМ ПРИ ЛЮБОМ ИЗМЕНЕНИИ КОНФИГА, ДЕЛАТЬ РЕСТАРТ
/etc/init.d/nginx restart

Открываем конфиг 
/etc/nginx/vhosts/user/site.com.conf
Находим первую строчку, имеющая такой вид
location / {
Потом ищем
        location / {
            try_files /does_not_exists @fallback;
        }
И делаем вот так
        location / {
        if ($http_user_agent ~* (Valve|nmap|nikto|wikto|sf|sqlmap|bsqlbf|w3af|acunetix|havij|appscan|WordPress|HTI-HTTP-Daemon|AskTbPTV|Bork-edition|^$) ) {
        return 403;
        }
        if ($http_referer !~* ^($|http://|https://) ){
         return 403;
        }
            try_files /does_not_exists @fallback;
        }
Этими строчками, мы запрещаем подключение с указанных юзер-агентов (зачастую боты используют эти user-agent) и отдаём им ошибку 403 - доступ запрещён.
Так же запрещаем переход на сайт без реффера, он должен быть в любом случае даже при прямо переходе, если его нет - это бот.

Как заблокировать юзер-агент который в логах? Например
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 YaBrowser/19.4.0.2397 Yowser/2.5 Safari/537.36 
Берём значение, по которому хотите фильтровать запросы, если Мы возьмём Mozilla/5.0, то с большой вероятностью, мы запретим доступ для всех посетителей. Выбираем то, которое относится только к боту, зачастую это такая информация Chrome/73.0.3683.8

Например, вот так можно заблокировать всех ботов, которые используют user-agent с браузером Chrome/73, но не делайте этого, так как браузер новый и очень много пользователей его использует. Этот метод эффективен, если множество запросов отличающихся от обычных пользователей. Например, если браузер старый, то будет версия например Chrome/43, спокойно блокируем её.
if ($http_user_agent ~* "Chrome/43" ) {
return 403;
}



Например, вы получаете от команды
netstat -ntu | grep ":443\|:80" | grep -v 127.0.0.1 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
ответ
564 2.92.2.14
10 93.15.12.82
8 81.3.90.10
6 5.42.16.17
4 27.6.13.14

В таком случае, сразу становится понятно что наш ип с которого идёт атака, 2.92.2.14
Блокируем его, методом отправки адреса в блекхол в таблице маршрутизации, нашего VDS\VPS или выделенного сервера:
ip route add blackhole 2.92.2.14
Это отправляет данный IP адрес в чёрную дыру, запрещая передавать ответ обратно пользователю, тем самым блокируется ип адрес и снижается нагрузка на вебсервер. Это эффективнее чем блокировка через iptables, но так мы запрещаем полностью любой доступ к серверу, а не только на сайт.

Разблокировать адрес можно так:
ip route del 2.92.2.14

Для блокировки IP только для доступа к сайтами (нужным портам), используем команду iptables
/sbin/iptables -I INPUT -p tcp --match multiport --dports 80,443 -s 2.92.2.14 -j DROP

Разблокировать IP по данной команде
/sbin/iptables -D INPUT -p tcp --match multiport --dports 80,443 -s 2.92.2.14 -j DROP

Разблокировать IP 2.92.2.14 полностью, если есть и другие порты для блокировки, кроме этого правила, можно так:
/sbin/iptables-save | grep -v 2.92.2.14 | iptables-restore

Этой командой, мы сохраняем правила iptables, удаляя при этом любую строчку правила на блокировку, где имеется IP адрес 2.92.2.14

6. Переходим к автоматизации процесса блокировки и обнаружения атаки.
Не будем изобретать велосипед, а воспользуемся готовыми скриптами которые есть в интернете, но немного модернизированными!

Мы взяли публичный скрипт и переделали его так, что бы обнаруживать вредоносные запросы HEAD\POST и общие запросы к сайту.

Скачать можно с сайта alienflood.zip [7.29 Kb] (cкачиваний: 1)
Либо по прямой ссылке сразу на сервер через wget
cd /usr/local/ ; wget https://alienvds.com/uploads/files/alienflood.zip

Как настроить скрипт? Всё просто, распишем по пунктам.
Папка со скриптом называется alienflood, должна быть размещена в /usr/local/
В папке находятся все нужные скрипты, начнём с разбора какой файл за что отвечает.

Файл 
alienflood.conf

Внутри файла описаны на русском языке все необходимые параметры.
  • FREQ= здесь указывается интервал запуска скрипта, параметр средней важности, так как в крон мы добавим задания вручную.
  • TAILCOUNT= количество строк, читаемых с лога, этот параметр на каждый сайт уникален, чем больше запросов у сайта, тем больше указывайте значение, на 1000 посетителей, которые что-то делают на сайте или открывают, желательно указать 10000, считайте дальше сами, если Вы не знаете что лучше указать, напишите нам в поддержку.
  • LOGPATH= это путь к вашему access_log логу сайта, как его найти мы читали выше.
  • GREP_FILTER= желательно не трогать, здесь указан фильтр по которому считать запросы..
  • NO_OF_CONNECTIONS= количество одновременных запросов к сайту, по умолчанию 100, обычно хватает.
  • APF_BAN= не трогаем, здесь указывается метод блокировки, через iptables или APF
  • KILL= не трогаем, указывается блокировать ип адреса которые флудят или нет, при настройке скрипта можете поменять, что бы не банить настоящих пользователей в процессе настройки.
  • EMAIL_TO= здесь заполняем свой email куда будут отправляться отчёты о блокировках, должен быть установлен почтовый сервер, по умолчанию уже должен быть установлен, если нет, то (apt-get install exim4)
  • BAN_PERIOD= период бана IP адреса, указывается в секундах, разблокировка происходит при последующих запусках скрипта.
Файл ignore.ip.list - сюда записываются заблокированные IP адреса, что бы они больше не учитывались при блокировке.
Файл ignoreds.list - сюда записываются IP адреса, которые НЕ НУЖНО блокировать, укажите сюда ваш IP адрес сервера.

Установим редактор nano и добавляем задание в крон, команды пишите по очереди.
apt-get install nano
export EDITOR=nano
crontab -e
В самый конец записываем:
#antiddos
*/3 * * * *     /usr/local/ddos/ddos.sh ; /usr/local/ddos/ddos2.sh ; /usr/local/ddos/ddos3.sh

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

Всем клиентам AlienVDS, данная настройка делается сотрудниками поддержки абсолютно бесплатно.

Рекомендуемые статьи этой категории:

картинка Установка сервера MineCraft на Linux [Debian\Ubuntu]
Установка сервера MineCraft на Linux [Debian\Ubuntu]

Для любителей игрового мира мы подготовили...

Подробнее
картинка Дешевый VPS
Дешевый VPS

Рассказываем о недостатках дешевого vps хостинга....

Подробнее
картинка Чем отличается VDS от VPS
Чем отличается VDS от VPS

Узнайте чем отличается VDS от VPS и какую...

Подробнее
картинка Купить VDS сервер дешево
Купить VDS сервер дешево

Даже если Вы только новичок и не имеете опыта при...

Подробнее
картинка Подробнее об используемом дата-центре
Подробнее об используемом дата-центре

Мы выбрали наиболее стабильный и качественный...

Подробнее