tm

   В своё время очень удивился тому, что Apache, так сказать, из коробки не может противостоять таким видам DDoS атак как SlowPOST и SlowHEADERS. Если учесть, что такого рода шалость может организовать любой школьник, то устранить этот недочёт показалось мне крайне необходимым.

   Если затронуть немного теорию, то смысл этих атак в том, что в заголовках POST присутствует поле "Content-Length", которое определяет количество данных для передачи. Как только этот заголовок принимается WEB-сервером, может начаться очень медленная передача данных. При этом отвечать на другие запросы Apache не сможет, пока данные не передадутся от одного соединения. А если их тысячи, то ждать придётся долго. Т.е. все сайты, которые живут на WEB-сервере просто станут не доступны. Что самое интересное, так это отсутствие практически любых признаков атаки. Выдать сможет только выросшее количество TCP соединений.

   Для предотвращения подобных проблем в Apache2 есть модуль reqtimeout. Смысл этого модуля в том, что он ограничивает время ожидания первого байта заголовков строки и тела запроса и устанавливает минимальную скорость для передачи данных, не взирая на настройки клиентской стороны. Для установки модуля выполняем команду

a2enmod reqtimeout

и перезапускаем Apache

service apache2 restart

 Стандартных значений вполне достаточно, что бы предотвратить падение сайтов:

nano /etc/apache2/mods-enabled/reqtimeout.conf
IfModule reqtimeout_module
RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=10,minrate=500
</IfModule

Я не тестировал стойкость Apache при DDoS с несколькх IP адресов.

   Всегда интересовало что же посылается на сайт с подобными запросами:

tail /log/apache/access.log
[30/Dec/2016:01:48:52 +0700] - - 5.141.8.114 "POST /index.php/index.php/3-install HTTP/1.0" 200 26760 "http://site.xx/index.php/index.php/3-install"

Начал разбираться. Наткнулся на какой-то mod dumpio. Ничего вразумительного он мне показал. Наверное даже и не заработал =)

Начал копать в сторону mod security. Назначений у него множество, но мне нужно только логирование POST запросов. Как обычно начинаем с установки MOD'a:

apt-get install libapache2-modsecurity 

   .htaccess - конфигурационный файл для управления web сервером Apache. Одной из замечательных возможностей является ограничение доступа к страницам и директориям сайта по IP адресу. Например:

нам нужно запретить доступ к директории в которой размещён сайт всем и разрешить доступ только с определённых IP адресов. Для этого создаём в директории с сатом файл с именем .htaccess и содержимым его будет

nano .htaccess
Order deny,allow
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.

Для того, что бы сайты были доступны с публичных сетях необходимо выполнить несколько условий:

  1. Обзавестись, так называемым, "белым", статическим (не динамическим, постоянным) IP адресом. Если используем хостинг, то это уже чужая головная боль.
  2. Определиться с названием сайтов и арендовать доменные имена у какого-нибудь регистратора имён. Рекомендую выбирать регистратора, который предоставляет редактировать записи в своих DNS серверах. Если сайты планируем хранить дома, в пыльном коридоре, то придётся клянчить у своего оператора связи прописать A-записи для IP адреса. Повторюсь, это если регистратор зажлопил свои DNS сервера.
  3. Ну, и сам сервер на котором у нас будет расположен Apache и сами сайты.

Каждый из этих пунктов требует определённых настроек. О каждом по-порядку.

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

   Зарисовка о логировании в Apache.

   По-умолчанию, файл лога Apache содержит в себе все события и от любого обратившегося к Web-серверу. Будь то пользователь или поисковый робот (бот, паук и как их там ещё называют). И тех и других может быть огромное количество и когда они будут храниться в одном файле, логи станет невозможно анализировать. Конечно, можно ловко орудовать всякими grep и выпендрёжными регулярными выражениями для сортировки, но всё же куда более проще искать действия ботов в одном файле, а действия пользователей в другом. Для этого необходимо немного поправить файл конфигурации для виртуального хоста. Вообще, файлы конфигурации могут находиться в нескольких директориях, в зависимости от настройки Apache. Например, /etc/apache2/conf-available/ и /etc/apache2/site-available/. Я приведу пример когда файл конфигурации расположен в директории /etc/apache2/site-available/.

nano /etc/apache2/sites-available/site.ru.conf
<VirtualHost *:80>
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

Файл логов создастся сам.