суббота, 17 марта 2018 г.

Как защититься от DDoS-атаки

Итак, вы находитесь под DoS/DDoS атакой.
Как определить что это именно DDoS-атака? Если трафик поступает из нескольких разных сетей, то это распределенная атака (DDoS), если трафик идет из одной подсети, то это DoS.
На Linux-сервере проверить текущее количество сетевых соединений можно с помощью утилиты netstat:
$ netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -3
    312 192.168.0.10
    256 192.168.1.32
    121 192.168.0.11

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

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

Для анализа трафика можно использовать утилиты tshark, tcpdump, iftop.
Как правило DDoS-атаки идут из ботнета, это огромное количество зараженных серверов, которые могут централизованно в единый момент времени могут создавать большое количество трафика.

Многие хостинг-провайдеры игнорируют атаки на единичные сервера и просто добавляют адрес сервера в blackhole (отключают адрес из глобальной маршрутизации в сети) с требованием подключить услугу защиты от DDoS, либо воспользоваться сторонними сервисами по защите от DDoS (CloudFlare, Akamai и прочие).
Поэтому стоит заранее позаботиться об использовании сервисов хостинга, если ваш сервер потенциально может находиться под угрозой DDoS.

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

При атаке, в которой используется не консолидация всего сетевого канала, а атака на конкретный сервис, резко увеличивается нагрузка на сервере, проверить это можно с помощью команд uptime, w, ps и прочих.

В лог-файлах может оказаться большое количество записей, анализируя которые можно определить какие-нибудь общие особенности атакуемых серверов, например подсеть IP-адресов, User-Agent с которым направляются запросы к веб-серверу. Однако не стоит открывать полностью лог-файл, так как большое количество записей в файле может существенно нагрузить уже итак нагруженную систему. Для просмотра файла стоит использовать такие утилиты как head, tail, grep и less.

Например если на веб-сервер Nginx поступает большое количество запросов в юзер-агенте которых присутствует слово WordPress, то можно блокировать такие соединения строкой в виртуальном хосте:
if ($http_user_agent ~ WordPress) { return 444; }

Или же можно блокировать адрес с помощью iptables, ipset или fail2ban:
# iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "WordPress" -j DROP

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

При атаках могут использоваться уязвимости в используемом ПО или в его неверной настройке, например DNS amplification, NTP amplification и другие. В таком случае рекомендуется обновить ПО до новых версий и корректно его настроить. IPTables также может ограничить число одновременных соединений с одного IP-адреса, тем самым оградив злоумышленников от частых запросов к уязвимым сервисам.
Также стоит отключить неиспользуемые сервисы, они могут создавать дополнительные векторы для атак, например если вы не используете на сервере Samba, то лучше отключить этот сервис.

Проверить открытые внешние порты на сервере можно с помощью nmap:
$ nmap -PN google.com
...
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https

Комментариев нет: