Как защитить свой сервер от ботов

апреля 17, 2013 , , , , 0 Comments

ddos
Когда я начал знакомится с системным администрированием, я столкнулся с распространенной проблемой, когда большое количество зараженных или скомпрометированных компьютеров(ботнетов) пыталось получить доступ к моему серверу. Спустя какое то время у меня возник вопрос - как забанить много IP адресов на уровне файервола. Как защитится от брутфорса вашего сервера ботнетом. Как предотвратить простейшие DDOS атаки на него.





Изначально я решал эту проблему с помощью стандартного фаервола iptables, смотрел логи авторизации сервера и банил всех гадов, которые ломились по ssh. Затем к фаерволу добавился fail2ban, который сам выявлял попытки брутфорса на 22 и другие порты и сам заносил IP адреса в iptables, но ботов было очень много и постепенно правила фаера росли, что начало грузить нехило процессор. Покурив гугл я узнал о ipset(надстройка к iptables), который грузил процессор значительно меньше чем iptables. Впоследствии слегонца упростил задачу выявления и блокировки самих ботов.

Итак приступим.

Для начала нам понадобится сменить порт ssh. Зачем? Вы сразу обезвредите большую часть ботов, т.к. после попытки законектится на стандартный порт они обломаются и скорее всего занесут вас в какой нибудь блэклист, мол, сюда больше не ходим.

Редактируем конфиг ssh сервера:
# sudo nano /etc/ssh/sshd_config
В строчке Port меняем 22 на любой другой, например 1422 и сохраняемся.

Чтобы изменения вступили в силу - перезапускаем ssh сервер
# sudo /etc/init.d/ssh restart (во FreeBSD это делается так /etc/rc.d/sshd reload)


Теперь чтобы законектится по ssh нужно в команде еще указывать ключ измененного порта например ssh -p 1422 user@server Так же теперь порт ssh не будет палится при самом элементарном nmap yourserver.com


Установим fail2ban

Хоть порт мы и сменили, но для пущей уверенности было бы не плохо предотвращать любую попытку брутфорса
# sudo apt-get install fail2ban
# sudo nano /etc/fail2ban/jail.conf

Нам нужно изменить пару правил на свое усмотрение:
ignoreip = 127.0.0.1 xxx.xxx.xxx.xxx (вместо xxx вписываем свой ip чтобы fail2ban не забанил нас после неправильно введенного пассворда)
bantime = 600 (время действия бана в секундах, можно указать -1 то есть навсегда)
maxretry = 3 (количество неправильных попыток, после которых сработает правило блокировки)
ищем строку [ssh] и сменим стандартный 22 порт на измененный нами 1422

Сохраняем и перезагружаем fail2ban
# sudo /etc/init.d/fail2ban restart



Устанавливаем IPset

# sudo apt-get install module-assistant xtables-addons-source
# sudo module-assistant prepare
# sudo module-assistant auto-install xtables-addons-source
# sudo depmod -a


Соблюдаем меры предосторожности, т.к. если по ошибке добавить свой ip в список правил, то мы не сможем зайти на собственный сервер. Поэтому сделаем запись в планировщике крон, который будет удалать все правила каждые N минут. Для этого выполним
# sudo crontab -e
и добавляем туда
*/40 * * * * ipset -F

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


Теперь нам нужно создать 2 списка правил и подружить их с iptables:
# ipset -N dropip iphash (данный список предназначен для блокировки одиночных IP плохишей)
# ipset -N dropnet nethash (а в этом списке будем складывать подсети плохишей)


Пара примеров:
# ipset -A dropip 46.32.74.8 (мы добавили данный ip в список для блокировки одиночных IP)
# ipset -A dropnet 219.84.0.0/15 (мы добавили подсеть ip адресов c 219.84.0.0 по 219.85.255.255 в сумме 131,072 ip адресов)


В любой момент мы можем посмотреть все заблокированные ip командой #ipset -L (если нужен только 1 список то после -L вписываем его название)

Теперь подружим IPset с IPtables:
# iptables -A INPUT -m set --match-set dropip src -j DROP
# iptables -A INPUT -m set --match-set dropnet src -j DROP

-m set - используем модуль ipset
--match-set - dropip, dropnet задаем какой список будем использовать.
src - список сверяется с ip адресом источника
dst - список сверяется с ip адресом назначения


Сохранение правил

Завершающим шагом будет сохранение списка, иначе после ребута все правила пропадут.
# sudo mkdir /etc/ipsetsave && touch /etc/ipsetsave/ipset-save (создаем папку и фаил для сохранения правил)
# sudo ipset -S > /etc/ipsetsave/ipset-save (сохраняем список)

тоже самое делаем с iptables:
# sudo touch /etc/ipsetsave/iptables-save (создаем фаил для сохранения правил)
# sudo iptables-save > /etc/ipsetsave/iptables-save (сохраняем список)


Добавляем ipset в автозагрузку
# sudo nano /etc/rc.local
и перед exit 0 вставляем
# cat /etc/ipsetsave/ipset-save | /usr/sbin/ipset -R


Добавляем iptables в автозагрузку
# sudo nano /etc/rc.local
и перед exit 0 вставляем
# cat /etc/ipset/iptables-save | iptables-restore


То есть у нас получется вот так:
cat /etc/ipset/ipset-save | /usr/sbin/ipset -R
cat /etc/ipset/iptables-save | iptables-restore
exit 0


Рассмотрим на примере как заблокировать весь траффик из отдельной страны(например китая):

Создаем правило и сразу дружим его с iptables
# ipset -N chinasubnet nethash
# iptables -A INPUT -m set --match-set chinasubnet src -j DROP


Скачиваем список подсетей китая в формате CIDR отсюда и сохраняем в /home/china.txt
Выполняем в терминале:
# for i in $( cat /home/china.txt ) ; do ipset -A chinasubnet $i ; done
И сохраняем новые правила
# ipset -S > /etc/ipsetsave/ipset-save



Небольшоеь дополнение:

Вы наверное спросите, а как мне заблокировать эту подсеть? Или как подсчитать маску подсети? А ничего считать и не нужно, все уже за нас давным давно придумали. Заходим на сайт countryipblocks в поле вписываем неугодный IP и получаем информацию о подсети включая маску, которая нам нужна для списка dropnet.

Немного про dos и ddos

Теперь смоделируем ситуацию. Вы заходите на сервер и обнаруживаете подозрительную загруженность процессора, будем предпологать, что веб сервер вы более менее настроили. Скорее всего кто то решил побаловатся с F5, создавая большое количество воркеров веб сервера которые начинают отьедають драгоценную ОЗУ и Мегагерцы процессора. А может кто то решил уронить ваш сервер slowlories атакой на апач? К слову до сих пор не зашитой. Тогда вам вероятно пригодится такая вот команда, которая посчитает и выведет самое большое количество подключений с одного ip

# sudo netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

Еще бывает полезно посмотреть рефереров в аксесс логе, например когда кто то натравил на ваш ресурс парсер контента в несколько сотен потоков спомощью прокси:
# cat access.log | grep "GET" | awk -F '"' '{print $6}' | cut -d " " -f1 | grep -E '^[­[:alnum:]]' | sort | uniq -c | sort -rn

Находим вредителя и заносим его в бан навсегда. Автоматизировать процесс можно, но это тема отдельной статьи, если интересно более подробно можно почитать тут.

botnet


0 коммент.: