Назад | Перейти на главную страницу

Блокировка повторяющихся HTTP-запросов в Apache за балансировщиком нагрузки

У меня есть несколько серверов EC2 на AWS, на которых работает apache за балансировщиком нагрузки (ELB). Время от времени какой-либо IP-адрес злоупотребляет API, размещенным на серверах EC2, и вызывает отказ в обслуживании. У меня нет доступа к балансировщику нагрузки, поэтому мне нужно заблокировать доступ на уровне сервера.

Я изменил журнал доступа apache, чтобы отображать IP-адреса на основе заголовка X-Forwarded-For, предоставленного балансировщиком нагрузки (в противном случае он просто отображает IP-адрес балансировщика нагрузки), поэтому я могу идентифицировать эти IP-адреса и блокировать их (опять же, указав X- Forwarded-For) примерно таким:

<Directory api_dir>
                SetEnvIF X-FORWARDED-FOR "1.1.1.1" DenyIP
                Order allow,deny
                allow from all
                deny  from env=DenyIP
</Directory>

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

Каков рекомендуемый способ автоматического блокирования атак повторяющихся HTTP-вызовов, основанных не на IP-адресе, а на заголовке Forwarded-For, исходящем от балансировщика нагрузки.

Я написал расширенное сообщение в блоге о том, как это сделать с Apache 2.4, используя OSSEC (система обнаружения вторжений на базе FOSS). Вот TL; DR:

  1. Использовать mod_remoteip для регистрации IP-адресов клиентов вместо IP-адресов балансировщика нагрузки.
  2. В вашей конфигурации vhost используйте ВключитьДополнительно директива внутри RequireAll директива для источника в каталоге, который будет содержать другие mod_authz_host директивы, написанные OSSEC.
  3. Создать индивидуальный сценарий активного ответа для OSSEC, который добавит файл с директивой mod_authz_host, например Require not ip 1.2.3.4 в указанный выше каталог для каждого IP-адреса, с которого OSSEC обнаруживает вредоносную активность.
  4. Настройте OSSEC, чтобы начать использовать приведенный выше сценарий активного ответа - я бы рекомендовал скопировать настройки из command и active-response блоки конфигурации по умолчанию OSSEC хозяин-отказать active-response, который блокирует IP-адрес на 10 минут, если срабатывает предупреждение на уровне или выше уровень 6.
  5. Добавьте несколько пользовательских правил в OSSEC local_rules.xml файл определения для HTTP-запросов, зарегистрированных в вашем журнале доступа Apache, который вызовет вышеуказанный активный ответ при сопоставлении с X частота в Y временное ограничение (например, скажите более 50 раз за 10 секунд, или как вы считаете оскорбительным).

Если вы еще не используете OSSEC (или какой-либо другой HIDS), я бы настоятельно рекомендовал его - его очень легко настроить и он предоставляет множество функций прямо из коробки. DigitalOcean имеет хорошие Руководство по установке OSSEC для Ubuntu 14.04 (за которым вы можете неплохо следовать даже для других Linux). Вы можете просто установить его в «локальном» режиме на каждом из ваших серверов, чтобы начать работу, а затем переставить его, чтобы использовать его причудливую архитектуру клиент-сервер.

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

Вы можете сделать это с помощью mod_evasive в сочетании с mod_rpaf.

Первый позволяет вам ограничиваться IP-адресом (например, чтобы остановить атаки DOS), второй позволяет сделать так, чтобы адрес X-FORWARDED-FOR отображался как IP-адрес, как обсуждается в комментариях к ответу на этот вопрос.

(Если mod_rpaf у вас не работает, вам придется взломать исходный код mod_evasive.)