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

Что такое DDoS и чем он опасен

DoS (Denial of Service) — это атака на систему, основной целью которой является довести ее до состояния отказа. Иными словами: хакер создает такую нагрузку на сервер, что пользователи, пытающиеся получить доступ к ресурсам машины, не могут этого сделать.

DDoS (Distributed Denial of Service) — атака на систему, которая идет с большого числа компьютеров. Цель его та же, что и у DoS – довести систему до отказа в работе.

Суть DDoS состоит в следующем: с каждого компьютера отправляется такое количество пакетов с запросами к ресурсу, что на их обработку и отправку ответных пакетов уходит весь ресурс системы. Как результат: сервисы, работу которых данная система поддерживает, «падают», а клиенты теряют возможность зайти на сервер, получить доступ к сайту и т. д.

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

Превентивные меры защиты от DDoS

Для повышения сопротивляемости сервера DDoS-атакам можно воспользоваться различными инструментами, основные из которых:

  1. Настройка Apache;
  2. Установка и настройка Mod_security;
  3. Настройка связки Apache+nginx.

Ниже детально мы рассмотрим каждый из них.

Настройка веб-сервера Apache

Чтобы сервер был более защищен от DDoS-атаки, необходимо выполнить настройку конфигурационных файлов Apache, расположенных в каталоге /usr/local/etc/httpd/conf (3 шт.):

  • httpd.conf
  • srm.conf
  • access.conf

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

Например:

cp /etc/httpd/conf/httpd.conf ~/httpd.conf.backup

Не во всех версиях Apache доступны одинаковые настройки безопасности, поэтому получение злоумышленником информации о версии системы увеличивает его шансы атаковать сервер. Чтобы предотвратить утечку информации о системе, воспользуйтесь данными файла httpd.conf.

Для запрета вывода данных о версии сервера на странице при отображении ошибки, отключите директиву ServerSignature (укажите Off напротив нее). Также с помощью директивы ServerTokens необходимо ограничить объем информации, которую сервер сообщает о себе при ответе на http-запрос. Для этого напротив указанной директивы напишите «Prod». В результате сервер будет выводить в Server header только слово «Apache» вместо полной информации о его версии.

Теперь в httpd.conf установим определенные лимиты:

  1. Timeout — период времени, в течение которого сервер ожидает продолжения недополученного запроса клиента или пытается отправить ответ. Установленное по умолчанию значения (300 сек) можно уменьшить до 100 сек (в частности для VPS), что снизит влияние DDos-атак. При этом важно учесть скорость интернет-соединения и размер пакетов, которые планируете получать, чтобы сохранить нормальную работу сервисов;
  2. KeepAliveTimeout — время ожидания сервером следующего запроса клиента в рамках одного соединения. Рекомендуется снизить заданные изначально 15 секунд до 10 сек (при средней нагрузке) либо 5 сек (при высокой загруженности) сервера;
  3. Имя пользователя и группа. В качестве имени пользователя user и group, с которых будет запускаться сервер, укажите «apache» — так вы не поставите под удар почтовый сервер, если вдруг хакерам удастся обойти защиту;
  4. Директива Options. Используя директиву Options, которая содержится внутри тэга Directory, отключите некоторые опции, в частности: SSI, запуск CGI, FollowSymLinks. Для этого прописываем напротив них следующие значения:
  • Options -Includes – отключает SSI
  • Options -ExecCGI – отключает CGI
  • Options -FollowSymLinks – запрещает Apache следовать по символьным ссылкам

Если прописать для Options «None», то мы отключим их все. Чтобы отключить отдельно взятые опции, пишем:

Options -ExecCGI -FollowSymLinks -Indexes

В access.conf (одном из 3-х, упомянутых ранее файлов), тэг Directory, можно отключить поддержку .htaccess файлов, установив для директивы AllowOverride значение None. Однако, если вам необходимо, чтобы сервер читал такие файлы, оставьте AllowOverride включенной, прописав напротив нее All (позволяет использовать любые директивы .htaccess) либо ограничив его:

  • AuthConfig — доступ для директив разрешения
  • FileInfo — дает возможность использовать директивы, управляющие типами документов
  • Indexes — возможность использования директив управления индексацией каталога
  • Limit — разрешает только директивы управления доступом
  • Options — только директивы управления специфическими особенностями каталога.

Такие директивы, как LimitRequestFieldSize, а также LimitRequestFields и LimitRequestLine, в большинстве случаев выставлены автоматически на уровне, который приемлем для большей части серверов. Они призваны ограничить размеры клиентских запросов, что тоже помогает защитить сервер от DoS-атак. Ознакомившись с документацией, можно настроить их более тщательно, тем самым ограничив потребление ресурсов клиентами.

Ограничить размер загружаемых файлов (LimitRequestBody — по умолчанию не лимитирован) и XML запросов (LimitXMLRequestBody — по умолчанию 1 МБ) можно в файле httpd.conf, прописав желаемое значение в байтах. Например, установить максимальный размер файлов на уровне 1 МБ, а XML запросов от 1 до 10 МБ (10485760 байт).

В зависимости от возможностей ОЗУ необходимо изменить настройки MaxClients. Здесь вы можете задать максимальное количество клиентских запросов, которые сервер будет обрабатывать одновременно. За счет этого MaxClients позволяет снизить либо увеличить нагрузку на машину.

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

Установка и настройка mod_security

Еще один способ защитить сервер от DDoS-атаки — установить модуль mod_security для Apache и настроить в нем необходимые фильтры. Для установки модуля используют следующие команды:

apt-get install libapache2-modsecurity – Ubuntu/Debian

yum install mod_security – CentOS,

где:

  • apt-get install и yum install — команды для установки программ для систем Ubuntu, Debian и CentOS соответственно;
  • libapache2-modsecurity и mod_security — имя программы, которую мы устанавливаем из хранилища системы

Чтобы убедиться, что mod_security загрузился, в командной строке пишем:

apachectl -M | grep --color security

Индикатором того, что загрузка прошла успешно, является сообщение:

security2_module (shared)

После этого необходимо завершить установку модуля, которая подразумевает переименование конфигурационного файла:

mv /etc/modsecurity/modsecurity.conf{-recommended,}

Перезагрузите Apache, чтобы внесенные нами изменения начали работать:

service apache2 reload

Теперь, когда все установлено, можно приступать к настройке mod_security. Оставлять конфигурационный файл modsecurity.conf без изменений не стоит, поскольку базово он настроен только отслеживать логи запросов, не осуществляя блокировку обнаруженных уязвимостей.

Чтобы перевести mod_security в режим распознавания и обезвреживания уязвимостей, в modsecurity.conf отредактируем строку SecRuleEngine, а именно: предустановленное для нее значение «DetectionOnly» меняем на «On»:

Было:

SecRuleEngine DetectionOnly

Стало:

SecRuleEngine On

Поскольку DDoS-атака связана напрямую с передачей данных, то следующим шагом будет ограничение их возможного объема. В mod_security за это отвечают директивы SecRequestBodyLimit и SecRequestBodyNoFilesLimit. Значение базово прописанной конфигурации составляет 12,5 МБ и 128 КБ соответственно. Их можно уменьшить, тем самым ограничив максимальный объем данных, которые могут быть отправлены серверу. При этом SecRequestBodyLimit уже учитывает объем передаваемых файлов загрузки, а SecRequestBodyNoFilesLimit — нет.

Откорректировать можно и максимальный объем тела запроса, помещаемый в RAM. Для этого воспользуемся настройками SecRequestBodyInMemoryLimit. Оставшиеся данные при этом уйдут в Swap. Чтобы снизить нагрузку на память, это значение (128 КБ) можно уменьшить.

Помимо корректировки директив modsecurity.conf необходимо подгрузить правила CRS (Core Rule Set – базовые правила фильтрации). Для этого отредактируем данные в /etc/apache2/mods-enabled/mod-security.conf.

В директорию с модулем security2_module добавляем каталоги с правилами, которые веб-сервер Apache прочтет при запуске:

<IfModule security2_module>
Include “/usr/share/modsecurity-crs/*.conf”
Include “/usr/share/modsecurity-crs/activated_rules/*.conf”
</IfModule>

Правила для mod-security находятся в каталогах:

  1. /usr/share/modsecurity-crs/base_rules
  2. /usr/share/modsecurity-crs/optional_rules
  3. /usr/share/modsecurity-crs/experimental_rules

Теперь необходимо в activated_rules каталоге создать символические ссылки для активации нужных нам правил. Здесь же сразу задаем правило для защиты от ввода SQL-кода, что не позволит злоумышленникам получить доступ к базам данных MySQL через фиктивные логин-пароль:

cd /usr/share/modsecurity-crs/activated_rules/
ln -s /usr/share/modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf

Чтобы внесенные изменения стали активны, перезапустите Apache.

Если все сделали верно и включили SecRuleEngine, то при попытке обойти фаервол и получить доступ к БД SQL, система выдаст ошибку «403 Forbidden».

В случае, если после введения произвольного SQL-кода вы успешно зашли, значит DetectionOnly не было заменено на On для параметра SecRuleEngine.

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

Установка и настройка связки Apache+nginx

Другой вариант защиты — установить прокси-сервер nginx в связке с Apache, что усиливает безопасность вашей системы. При такой кооперации nginx усиливает (страхует) Apache, забирая на себя обработку статического контента.

Nginx устанавливается в консоли с помощью команды:

apt-get install nginx — для Debian/Ubuntu

yum install nginx — для CentOS

Как и в Apache, здесь также имеются свои настройки безопасности, доступные в /etc/nginx/nginx.conf. Наиболее важными параметрами для нас здесь являются:

  1. client_max_body_size — ограничивает максимальный размер тела запроса. Как правило, устанавливается в пределах от 1 до 24 МБ;
  2. сlient_body_buffer_size — определяет размер буфера для чтения тела запроса от клиента (от 16 КБ);
  3. client_header_timeout — ограничивает время передачи полного заголовка запроса (как правило задается в пределах 10-20 секунд);
  4. client_body_timeout — определяет время передачи тела запроса (обычно устанавливается такое же значение, как для параметра client_header_timeout);
  5. keepalive_timeout — устанавливает длительность соединения клиента с сервером (15-30 секунд);
  6. send_timeout — время, выделяемое клиенту на принятие ответа (2-10 секунд).

Теперь вы знакомы с 3-я основными способами, которые помогают защитить сервер от DDoS-атак. К сожалению, никакие настройки и фильтры не могут стопроцентно оградить нас от проблемы. Такие методы — скорее барьер, который позволит нам смягчить последствия атаки и выиграть время, чтобы понять, как лучше обороняться, когда атака на сайт или сервер уже началась.

Как защититься от DDoS-атаки, если она уже идет

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

Первое, что необходимо сделать: проанализировать логи и понять, кто и в каком направлении ведет атаку, определить превалирующий тип трафика. Для этих целей хорошо подойдет утилита tcpdump, которая позволяет посмотреть, какой тип пакетов приходит чаще всего, а также host-name и IP-адрес, с которых они были отправлены.

Результат анализа трафика, полученный с помощью tcpdump, можно записать в файл для дальнейшего изучения, добавив ключ -w (в командной строке — tcpdump -w <имя файла>). Кроме того, определенные ключи позволяют сразу задать параметры фильтрации и вывода информации:

  1. -n — заменяет hostname на IP-адрес;
  2. -nn — отображает номер порта, а не используемый им протокол;
  3. -q — обеспечивает минимальный вывод информации (имя протокола, маршрут пакета, номера портов, объем переданных данных);
  4. -r <file> — читает трафик из файла, предварительно записанный с помощью ключа -w, например, tcpdump -r dumpfile;
  5. -T <type> — интерпретирует пакеты определенного типа;
  6. -tttt — выводит дату и время;
  7. -v — показывает детальную информацию о трафике: TTL, ID, длину заголовка запроса и данные о нем);
  8. -с <number> — предписывает утилите tcpdump завершить работу после получения заданного числа пакетов.

Когда IP-адреса, с которых приходит нежелательный трафик, определены, их необходимо заблокировать. Для этого подойдут утилиты (фаерволы), способные отфильтровать и ограничить получение нежелательных пакетов: iptables, fail2ban, APF, ipfw.

Чтобы добавить в список фильтра iptables определенный адрес и тип пакета, передачу которого мы хотим ограничить, используем команду:

iptables -A INPUT -p tcp --dport 80 -s 95.153.67.144 -j DROP

где:

  1. -A — говорит о необходимости добавить правило
  2. INPUT — обозначает все входящие пакеты (трафик, который необходимо ограничить)
  3. -p <protocol> — указывает протокол, для которого будет действовать добавляемое правило
  4. –dport <port number> — порт, на который будет идти трафик (только если нам заранее известна эта информация)
  5. -s <address> — указывает на источник отправки пакетов (можно прописать как IP-адрес, так и имя сети или hostname)
  6. -j — сообщает команду, которую необходимо применить, если входящий пакет отвечает всем указанным ранее условиям.

Когда нам известен только IP-адрес, с которого приходит вредоносный трафик, есть возможно заблокировать его полностью:

iptables -A INPUT -s 95.153.67.144 -j DROP

Другим не менее популярным и действенным способом отражения атаки является настройка утилиты fail2ban.

Кроме бесплатных вариантов противодействия DDoS-атакам не помешает и, даже является желательным, воспользоваться платными системами защиты, наподобие CloudFlare, Comodo, Cisco, Wanguard.