У меня есть несколько серверов 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:
Require not ip 1.2.3.4
в указанный выше каталог для каждого IP-адреса, с которого OSSEC обнаруживает вредоносную активность.command
и active-response
блоки конфигурации по умолчанию OSSEC хозяин-отказать active-response, который блокирует IP-адрес на 10 минут, если срабатывает предупреждение на уровне или выше уровень 6.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.)