Некоторые способы борьбы с DDoS

log2ban
Как работает log2ban
Для обнаружения ботов, каждый запрос к серверу, отмечается идентификатором из свойств запроса (например из IP адреса и URL: «1.2.3.4/login.php»). Когда количество обращений с определенным ID достигает установленного предела, в пределах временного окна обнаружения, IP клиента передается в качестве аргумента для внешней команды (BAN_IP_COMMAND) или собранных для пакетной блокировки (см. «Блокировка списков»).

Log2ban работает над логами сервера в реальном времени, и не предназначен для использования в качестве анализатора архива логов. Следует использовать средства файрволла, чтобы произвести саму блокировку (настройки и скрипты для ipset прилагаются в примере).

Скрипт читает лог в реальном времени, с помощью, например «tail -f» или аналогичную команду, как указано в конфигурации. Если команда посылает EOF, log2ban завершит свою работу. Если команда прекратить писать записи журнала на стандартный вывод, процесс log2ban будет висеть вечно.

Настройка
По умолчанию поддерживается шаблон логов Apache/Nginx. Изменения, внесенные в формат должны быть отражены в переменной ACCESS_LOG_RECORD_FORMAT.

Можно также настроить правила обнаружения. Наиболее важным параметром является TOLERANCE_MARGIN (количество хитов в окне). Второй наиболее важными являются WINDOW_SIZE (размер окна в слотах) и SLOT_INTERVAL. (размер слота в секундах) Более короткий интервал и увеличенный размер означает лучшее обнаружение (и худшую производительность).

Чтобы изменить правила вычисления ID, измените функцию «create_server_hit_id».

Чтобы изменить правила пропуска строки в логи, измените функцию «skip». По умолчанию пропускаются запросы на статические типы файлов.

Блокировка списков
Для использования блокировки по спискам, включите базу данных, обработайте логи какое-то время, а затем выполните
python log2ban.py print (banned | allbanned)

распечатать собранные IP-адреса на stdout. «banned» будет печатать только новые IP-адреса (с момента прошлого print banned), в то время как «allbanned» будет печатать каждый запрещённый IP, независимо от того, был он ранее напечатан или нет.

После нескольких дней IP-адреса будут разбанены, для получения их списка:
python log2ban.py print (unbanned)

Эта команда напечатает каждый IP, который был забанен в период current_time — DAYS_UNBAN, и удалит записи из базы данных.

Производительность
log2ban достаточно быстр сам по себе, но для очень быстрорастущих логов обработка запросов может стать проблемой. Рассмотрите возможность отключения регистрации запросов на статические ресурсы, такие как изображения, скрипты и таблицы стилей. Дальнейшая оптимизация может включать в себя более простой формате логов (CSV), вместо того чтобы использовать формат по умолчанию, который обрабатывается модулем apachelog через регулярные выражения.

Установка и интеграция с файрволлом
Процесс описан для Debian Squeeze 6.0, для других дистрибуций может отличаться.
Установите ipset:
sudo apt-get install module-assistant xtables-addons-source

sudo module-assistant prepare

sudo module-assistant auto-install xtables-addons-source

depmod -a

Проверьте что он работает
ipset -L

Если вы получаете не пустой ответ, например ошибки 'Module ip_set not found', то ipset не установлен правильно. Погуглите на предмет решения этой проблемы для вашей конкретной инсталляции. Общая идея в том, что модуль ядра ip_set должен быть локально скомпилирован и загружен в ядро.

Установите MongoDB, Python и PIP:
sudo apt-get install mongodb python-pip

Установите модули для питона:
sudo pip install apachelog pexpect pymongo

Склонируйте репозиторий log2ban:
git clone git://github.com/unicodefreak/log2ban.git

В файле log2ban.py, настройте следующую команду, если необходимо.
ECHO_LOG_COMMAND = "tail -f /var/log/nginx/access.log" 

Добавьте следующий текст в /etc/logrotate.d/nginx:
/var/log/nginx/*log {

 daily

 rotate 10

 missingok

 notifempty

 compress

 sharedscripts

 postrotate

 [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

 /etc/init.d/log2ban stop

 /etc/init.d/log2ban start

 endscript

}

Установите скрипты
sudo mkdir /opt/log2ban

sudo cp log2ban/log2ban.py /opt/log2ban/

sudo cp log2ban/ipset-control.sh /opt/log2ban/

sudo cp log2ban/init-scripts/log2ban-debian.sh /etc/init.d/log2ban

sudo chmod +x /etc/init.d/log2ban

sudo chmod +x /opt/log2ban/ipset-control.sh


Запустите MongoDB
sudo /etc/init.d/mongodb start

Запустите log2ban
sudo /etc/init.d/log2ban start


Добавьте в root cron script следующую команду, например для обновления адресов каждые 5 минут
*/5 * * * * /opt/log2ban/ipset_control.sh update


Пусть поработает какое-то время. Проверьте, если какие-либо IPs are blocked:
sudo ipset -L

Если список похож на правду, то остался последний шаг — подключить iptables.
Добавьте строку:
-A INPUT -m set --match-set autoban src -j DROP

в файл /etc/firewall.conf и выполните
sudo /etc/init.d/networking restart
comments powered by Disqus

0 комментариев

Оставить комментарий