В своё время очень удивился тому, что Apache, так сказать, из коробки не может противостоять таким видам DDoS атак как SlowPOST и SlowHEADERS. Если учесть, что такого рода шалость может организовать любой школьник, то устранить этот недочёт показалось мне крайне необходимым.
Если затронуть немного теорию, то смысл этих атак в том, что в заголовках POST присутствует поле "Content-Length", которое определяет количество данных для передачи. Как только этот заголовок принимается WEB-сервером, может начаться очень медленная передача данных. При этом отвечать на другие запросы Apache не сможет, пока данные не передадутся от одного соединения. А если их тысячи, то ждать придётся долго. Т.е. все сайты, которые живут на WEB-сервере просто станут не доступны. Что самое интересное, так это отсутствие практически любых признаков атаки. Выдать сможет только выросшее количество TCP соединений.
Для предотвращения подобных проблем в Apache2 есть модуль reqtimeout. Смысл этого модуля в том, что он ограничивает время ожидания первого байта заголовков строки и тела запроса и устанавливает минимальную скорость для передачи данных, не взирая на настройки клиентской стороны. Для установки модуля выполняем команду
a2enmod reqtimeout
и перезапускаем Apache
service apache2 restart
Стандартных значений вполне достаточно, что бы предотвратить падение сайтов:
RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=10,minrate=500
</IfModule
Я не тестировал стойкость Apache при DDoS с несколькх IP адресов.
Всегда интересовало что же посылается на сайт с подобными запросами:
Начал разбираться. Наткнулся на какой-то mod dumpio. Ничего вразумительного он мне показал. Наверное даже и не заработал =)
Начал копать в сторону mod security. Назначений у него множество, но мне нужно только логирование POST запросов. Как обычно начинаем с установки MOD'a:
apt-get install libapache2-modsecurity
.htaccess - конфигурационный файл для управления web сервером Apache. Одной из замечательных возможностей является ограничение доступа к страницам и директориям сайта по IP адресу. Например:
нам нужно запретить доступ к директории в которой размещён сайт всем и разрешить доступ только с определённых IP адресов. Для этого создаём в директории с сатом файл с именем .htaccess и содержимым его будет
Deny from all
Allow from 80.69.14.23
Allow from 213.0.0.0/8
Allow from 192.168.1.0/24
Первая строчка означает то, что сначалы мы запрещаем доступ, потом разрешаем. Второй строкой мы запрещаем доступ всем. С третьей строки мы перечисляем IP адреса и сети с которых доступ к директории разрешён.
Стоит обратить внимание на то, что если IP адресов несколько и они из одной и той же сети, то их мы записываем в одну строчку через пробел, т. е. Allow from 80.69.14.23 80.69.14.21. Если указываем сети, то каждую с новой строчки.
Коротенькая зарисовка по настройкам Web-сервера Apache2 для работы с двумя сайтами и более. Web-сервер на Ubuntu 14.04.5.
Для того, что бы сайты были доступны с публичных сетях необходимо выполнить несколько условий:
- Обзавестись, так называемым, "белым", статическим (не динамическим, постоянным) IP адресом. Если используем хостинг, то это уже чужая головная боль.
- Определиться с названием сайтов и арендовать доменные имена у какого-нибудь регистратора имён. Рекомендую выбирать регистратора, который предоставляет редактировать записи в своих DNS серверах. Если сайты планируем хранить дома, в пыльном коридоре, то придётся клянчить у своего оператора связи прописать A-записи для IP адреса. Повторюсь, это если регистратор зажлопил свои DNS сервера.
- Ну, и сам сервер на котором у нас будет расположен Apache и сами сайты.
Каждый из этих пунктов требует определённых настроек. О каждом по-порядку.
По первому пункту, беседу нужно вести с оператором связи если, хостинг домашний. Просим выдать белый IP адрес и если есть тех. возможность, то первый пункт можно считать выполненным. Даже если нет, то второй пункт будет альтернативой.
Зарисовка о логировании в Apache.
По-умолчанию, файл лога Apache содержит в себе все события и от любого обратившегося к Web-серверу. Будь то пользователь или поисковый робот (бот, паук и как их там ещё называют). И тех и других может быть огромное количество и когда они будут храниться в одном файле, логи станет невозможно анализировать. Конечно, можно ловко орудовать всякими grep и выпендрёжными регулярными выражениями для сортировки, но всё же куда более проще искать действия ботов в одном файле, а действия пользователей в другом. Для этого необходимо немного поправить файл конфигурации для виртуального хоста. Вообще, файлы конфигурации могут находиться в нескольких директориях, в зависимости от настройки Apache. Например, /etc/apache2/conf-available/ и /etc/apache2/site-available/. Я приведу пример когда файл конфигурации расположен в директории /etc/apache2/site-available/.
ServerName site.ru
ServerAlias www.site.ru
ServerAdmin Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
DocumentRoot /path/to/site/
ErrorLog ${APACHE_LOG_DIR}/error-site.log
CustomLog ${APACHE_LOG_DIR}/access-site.log combined env=!botlog
SetEnvIf User-agent "bot|baidu" botlog
SetEnvIf User-agent "bot|bingbot" botlog
SetEnvIf User-agent "bot|AhrefsBot" botlog
SetEnvIf User-agent "bot|YandexBot" botlog
SetEnvIf User-agent "bot|Googlebot" botlog
SetEnvIf User-agent "bot|MJ12bot" botlog
SetEnvIf User-agent "bot|Yahoo" botlog
CustomLog ${APACHE_LOG_DIR}/bot-site.log combined env=botlog
</VirtualHost>
А теперь немного комментариев к конфигурации. До 6 строки значения знаем как Отче наш, да и шестая строка говорит о том, что лог с ошибками пишется в такой-то файл. Начиная с 7 строки начинаются изменения - в конец строки добавляется env=!botlog, что говорит о том, что в файл лога пишется всё, за исключением событий с маркером botlog. Маркером botlog мы пометили события, где User-agent являются наши боты. Предпоследняя строчка, говорит о том, что в этот лог пишем все события помеченные маркером botlog. Не забываем рестартонуть наш Apache:
sudo service apache2 restart
Файл логов создастся сам.