Защита веб-сервера Apache от атаки медленного чтения, а так же некоторых других направленных атак

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

Рассмотренный способ позволяет обезопасить работу сервера с помощью расширений mod_evasive и mod_security, а главное — требует менее получаса времени на реализацию. Настройка производилась на Ubuntu версии 12.04 + Apache 2.2. Настройка для других версий веб-сервера, а так же для других операционных систем отличается, в основном, особенностями установки программных пакетов и, собственно, версиями устанавливаемых программ и модулей для них.



Установка пакетов
Поскольку защищаемый сервер установлен на Ubuntu, установка необходимых модулей для Apache выполняется одной командой:
sudo apt-get install libapache2-mod-evasive libapache-mod-security

Пакет mod_evasive обеспечит защиту от DDOS flood-атак прикладного уровня, в то время как mod_security обеспечит защиту от направленных атак, в том числе и атаки медленного чтения.

По своей сути, mod_security — это программный фаервол с открытым кодом, защищающий вебсервер, и разрабатываемый Trustwave SpiderLabs.

Настройка mod_evasive
Для работы модуля понадобится папка для сохранения логов с правами для записи Apache (предполагается, что веб-сервер запущен от пользователя www-data):
sudo mkdir /var/log/mod_evasive
sudo chown www-data:www-data /var/log/mod_evasive/


Создадим файл с настройками:
sudo nano /etc/apache2/conf.d/modevasive
<ifmodule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 90
DOSLogDir /var/log/mod_evasive
DOSEmailNotify EMAIL@DOMAIN.com
DOSWhitelist 127.0.0.1
</ifmodule>

Email необходимо заменить на адрес получателя информации об обнаруженной атаке (для отправки писем понадобится sendmail/postfix).
На этом настройка mod_evasive завершена.

Настройка mod_security
Поскольку mod_security — это фаервол, для работы ему необходим набор правил.
Скачать свежую версию правил можно со странички на SourceForge. Кроме того, есть возможность настроить автоматическое обновление правил, более подробно это описано тут.
В скачанном архиве Вы обнаружите несколько папок. Нас интересуют базовые правила, находящиеся в папке base_rules.
Создадим папку для правил, скопируем их из скачанного с SourceForge и распакованного файла.
sudo mkdir /etc/apache2/mod_security_rules
sudo mv base_rules/* /etc/apache2/mod_security_rules
sudo chown -R root:root /etc/apache2/mod_security_rules

Создадим файл конфигурации для mod_security с таким содержимым:
sudo nano /etc/apache2/conf.d/modsecurity
<ifmodule mod_security2.c>
Include mod_security_rules/*.conf
SecWriteStateLimit 100
</ifmodule>

Данный конфиг подключит только что скопированные нами правила, а кроме того — установит лимит на количество потоков на каждый отдельный IP, которые могут находиться в режиме SERVER_BUSY_WRITE, что предотвратит возможность выполнения атак типа Slow Loris/SlowHttp.

Для 32-битной версии Ubuntu настройка на этом заканчивается.
В x64 существует баг с modsecurity, связанный с отличием путей к библиотекам, из-за которого не подключается libxml. Для исправления первым делом нужно определить, где находится Ваша библиотека libxml2.so.2:
locate libxml2.so.2
Возможны 2 варианта: /usr/lib/x86_64-linux-gnu/libxml2.so.2 или /usr/lib/i386-linux-gnu/libxml2.so.2. Далее необходимо отредактировать файл /etc/apache2/mods-enabled/mod-security.load, заменив путь, по которому расположена подключаемая библиотека с /usr/lib/libxml2.so.2 на путь к библиотеке в Вашей системе.

Убедимся, что модули подключены:
sudo a2enmod mod-evasive
sudo a2enmod mod-security

и перезапустим Apache для применения конфигов:
service apache2 restart


Тестирование
Для тестирования используем утилиту slowhttptest. Об ее настройке и установке можно прочитать на страницах проекта, поэтому перейдем сразу к применению:
slowhttptest -c 65539 -B -g -o my_server_stats -i 110 -r 200 -s 8192 -t FAKEVERB -u DOMAIN.COM -x 10 -p 3

Если верить выводу программы, то уже на пятой секунде сервер становится недоступен:
Sat Jun 2 16:41:37 2012:slow HTTP test status on 5th second:
initializing: 0
pending: 564
connected: 217
error: 0
closed: 0
service available: NO

А вот, что записал в логи Apache:
tail /var/log/apache2/error.log
[Sat Jun 02 16:41:38 2012] [warn] ModSecurity: Access denied with code 400. Too many threads [101] of 100 allowed in WRITE state from xxx.xxx.xxx.xxx - Possible DoS Consumption Attack [Rejected]


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

Основные преимущества такого способа защиты: простота и скорость настройки, использование OpenSource решений.
Слабым местом может стать распределенная атака, производимая с множества разных IP адресов.
Поделиться публикацией

Комментарии 16

    –1
    Неправильно вы, батенька, статью начинаете.

    Статью вот как начинать надо.

    Или можно сказать: "Тут было описано." Или: «О том, что это такое, можно почитать в интернете.»
      +9
      Забыли дать ссылку, где рассказывается, что за Apache имелся ввиду. Так же пропущены ссылки с разъяснениями о настройке sendmail и postfix, что такое IP адрес, какая Ubuntu сейчас актуальна, DDOS, режим SERVER_BUSY_WRITE. Если уж викифицировать статью, так викифицировать, а гугл еще не закрыли.
        +2
        Точняк. Но, на самом деле, вы очень сильно запамятовали, когда не дали ссыки на толковый словарь и как-то мы с вами забыли упомянуть азбуку.

        А по факту, всему есть предел.

        Просто если пишешь статью про хрюмзиков, хорошо дать ссылку на хрюмзиков. Не то, чтобы я не нагуглю, но просто из приличия.
          +1
          Спасибо за комментарии!
          Постарался внести все необходимые правки.
      0
      Я бы сделал apt-get install nginx, настроил проксирование и забыл бы о проблеме.
        –1
        Nginx тоже надо настраивать, т.к. в стандартной конфигурации он тоже подвержен атаке медленного чтения. По крайней мере, на другом сервере сейчас стоит связка nginx + apache, правда под win. Nginx тоже падает, хотя и не так быстро, как apache.
          0
          > т.к. в стандартной конфигурации он тоже подвержен атаке медленного чтения

          А можно об этом по-подробнее?
            –1
            Пока толком не разбирался в настройке, но если запустить агрессивно настроенный slowhttp против ngnix в стандартной конфигурации, то сервер перестает отвечать на запросы, а в логи пишется, что не хватает worker_connections. Изначально прописано значение 1024. Если ставить значение больше — начинает писать, что максимально разрешенное количество дескрипторов — 1024. Увеличение worker_processes тоже не дало желаемого результата. Если найду хорошее решение и оно будет достойно отдельной статьи — напишу, как настраивал защиту на nginx.
              0
              Если ставить значение больше — начинает писать, что максимально разрешенное количество дескрипторов — 1024
              Увеличение worker_processes тоже не дало желаемого результата.

              Разумеется! Смотрим: nginx.org/ru/docs/windows.html#known_issues
            0
            Да и плевать. nginx для того и нужен, чтобы разбираться с неприятностями, ибо он асинхронный и отлично держит множество медленных клиентов. Смысл установки nginx в том, что он лично с апача заберет контент быстро. Т.е. апач не увидит медленных клиентов.
              0
              nginx/Windows != nginx

              Для nginx под никсами данная атака не представляет проблемы.
                0
                Статья написана о защите Apache, а не возможностях ngnix, и в ней рассмотрено лишь одно из доступных решений. О том, что можно сделать и другими способами — никто не спорит.
                С другой стороны, modsecurity с базовым набором правил так же предусматривает защиту от SQL инъекций, XSS, локального и удаленного инклуда + имеет наборы правил для различных фреймворков и CMS. Обычным apt-get install nginx такого Вы не добьетесь. Конечно, если хостится только свой код, надежность которого сомнений вызывает немного, то это излишки.
                  0
                  С другой стороны, modsecurity с базовым набором правил так же предусматривает защиту от SQL инъекций, XSS, локального и удаленного инклуда + имеет наборы правил для различных фреймворков и CMS. Обычным apt-get install nginx такого Вы не добьетесь.
                  Обычным apt-get install apache, насколько я понимаю, тоже.
              0
              Для 32-битной версии Ubuntu настройка на этом заканчивается.
              В x64 нужно произвести еще одно действие — в файле /etc/apache2/mods-enabled/mod-security.load нужно заменить путь, по которому расположена подключаемая библиотека с /usr/lib/ на /usr/lib/x86_64-linux-gnu/.


              У меня в Ubunt 12.04 x64 путь к библиотеке /usr/lib/i386-linux-gnu/libxml2.so.2
                0
                Ваша Ubuntu ставилась как 12.04 или обновлялась с предыдущего релиза?
                И тот, и другой пути возможны с точки зрения multiarch.
                Проблема с расположением библиотеки — это баг, связанный с отсутствием адаптации modsecurity к мультиархитектурной версии libxml. Судя по всему, его планируют исправить к 12.04.1.
                  0
                  ставилась как 12.04

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

              Самое читаемое