Борьба со спамерами китайцами

На днях столкнулся с непонятной для меня нагрузкой на сервер. LA превышало нормальное в 2-3 раза, при этом был очень высокий wa. Первое, что пришло в голову, — умирает винт. smartctl дал хороший результат да и никаких признаков болезни обнаружено не было. Следующий этап изучение логов сервера и разбор источника нагрузки. Проблема оказалась в очереди exim  порядка 300 000 писем!!! Первое, что я сделал это прибил очередь:

sudo exiqgrep -i | xargs exim -Mrm

Следующий этап поиск скрипта, который отправляет эти письма. Для этого надо заставить php писать в лог эти данные, то есть редактируем php.ini:

mail.add_x_header = On
mail.log = /home/my/phpmail.log

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

[02-Apr-2015 15:26:52 UTC] mail() on [/usr/share/roundcube/program/include/rcmail.php:1081]: To: ***

Дело, казалось, за малым удалять скрипты и поменять пароли. Но через 1-2 дня сервер опять начал рассылать спам, вот тут и началась война с «хакерами». Читаем логи дальше — fail2ban — там я увидел длинный листинг с банами/разбанами (стандартные настройки как оказалось вообще ни для чего не пригодны). Стандартные настройки заменил на следующие:

jail.conf:

bantime = 3000000  # Время бана в секундах
findtime = 1800  # Период за который анализируется лог
maxretry = 3  # количество попыток авторизации

action.d/iptables-blocktype.conf

blocktype = DROP

Последний был изменен из соображений, что REJECT —reject-with icmp-port-unreachable уязвим для DDoS атак, и подает признаки жизни на моем конце кабеля, чего я не очень хочу.

Дальше имея перед глазами список подозреваемых и сервисы 2ip.ru выбираем кандидатов на перманентный бан. Сразу говорю 90% были китайские IP их я списал без размышлений — явно не моя целевая аудитория.

Следующий лог — apache.log. Анализировать эту мусорку глазами очень тяжело, поэтому написал себе конфиг для 1С 7.7, который разбирает и выводит в удобоваримом виде и с возможностью фильтровать. (Разборщик apachelog у кого будут вопросы пишите в комментариях). Искал в нем обращения к нашим спам-скриптам. На выходе получил список вредоносных адресов.

Fail2ban имеет ряд недостатков и при определенном объеме логов тормозит систему, поэтому перед его правилами я решил создать свой фильтр, который будет отбрасывать любые попытки заблокированных адресов контактировать с моим сервером. Для этого внес небольшие изменения в файл конфигурации fail2ban — action.d/iptables-multiport.conf (Теперь правил fail2ban будут вторыми.)

actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I <chain> 2 -p <protocol> -m multiport —dports <port> -j fail2ban-<name>

и добавил 2 скрипта своей блокировки (скачать) myrules — содержит правила для запуска, restart — скрипт перезапуска блокировки с очисткой предыдущих правил. 2 скрипта сделано больше для удобства и простоты в работе. Далее в rc.local добавил вызов myrules и перезапуск fail2ban:

/home/myrules
service fail2ban restart

Список заблокированных IP можете найти в скрипте 😉

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.