Рейтинг:0

заблокировать соединение nginx после нескольких 404 на одном и том же соединении tcp

флаг de

Я хотел бы защитить два сервера от злоумышленников, которые слепо исследуют URL-адреса.

моя идея состоит в том, чтобы блокировать запросы после определенного количества кодов состояния 404.

Я мог бы сделать это с помощью fail2ban.

Однако один из серверов находится за обратным прокси что я не контролирую и что не передает исходный IP-адрес (и потребуется очень много времени, прежде чем будет обработан запрос на переадресацию исходного IP-адреса), что означает, что с точки зрения nginx, все запросы исходят от IP-адреса уважаемого прокси-сервера. и, очевидно, я не хочу блокировать весь входящий трафик, если кто-то спровоцирует слишком много ошибок 404.

Есть ли способ (без fail2ban, с помощью fail2ban или с помощью любого другого инструмента) обнаружить не менее 404 ошибок с того же https соединения и разорвать это соединение или дать ему 404 безоговорочно для любого последующего запроса?

Пожалуйста, сообщите мне, если мой вопрос не ясен, и я попытаюсь перефразировать его, чтобы дать больше информации.

Рейтинг:1
флаг cn

Вы можете настроить Nginx для кэширования ответов, в том числе ответов с ошибкой, такой как 404. Однако, насколько я знаю, вы не можете подсчитать количество ошибок (но это не должно иметь значения).

Единственная проблема здесь в том, что если вы создаете новую страницу, а ранее она кэшировалась как 404, то она не будет работать. По крайней мере, не сразу (в зависимости от того, сколько времени требуется вашему кешу до тайм-аута).

Хотя это определенно сильно поможет. Все обращения, которые в противном случае перешли бы к вашему бэкенду и сгенерировали ошибку 404, будут остановлены в экземпляре Nginx и снова и снова будут возвращать одну и ту же ошибку 404.

Другой способ - определить местоположение и запустить команду (которая затем может запустить ipset чтобы добавить IP-адрес). Итак, что-то вроде:

расположение /phpmyadmin.php {
  content_by_lua_block {
    os.execute("/usr/bin/block-ip.sh")
  } 
}

Однако я не слишком уверен, как вы могли справиться со многими путями.


Мой собственный опыт с фейл2бан заключается в том, что он довольно медленный и «отсталый» (не активный). Однако, если вы действительно хотите полностью заблокировать IP-адрес, проще всего иметь свое приложение. отправить сообщение на внешний интерфейс, где вы можете запустить iptables заблокировать ИП. Для этого вам нужно перенаправить исходный IP-адрес, который Nginx не делает по умолчанию, но легко добавить X-переадресовано-для заголовок, что ваше приложение. затем можете отправить обратно в небольшой инструмент, который вы используете для добавления IP-адресов в свой iptables. Обратите внимание, что вы не должны напрямую добавлять его в iptables. Вместо этого вы должны использовать список. Для этого посмотрите на ipset.

Если вы не можете изменить свои приложения для таких и хотите использовать фейл2бан, вам придется проверить журналы Nginx и обнаружить те пути, которые вам не нравятся.

gelonida avatar
флаг de
Спасибо за Ваш ответ. да, кэширование 404-х может уменьшить DOS-атаки, если несколько злоумышленников сканируют сервер в течение срока действия кэша; Однако я действительно предпочел бы остановить кого-то, кто пытается угадать URL-адреса. И на серверах, где я не могу этого сделать из-за отсутствия исходного IP-адреса, я хотел бы, по крайней мере, избежать того, что одно SSL-соединение может проверять слишком много URL-адресов. Из любопытства: Какова будет настройка для кэширования ошибок 404? Кэширование должно быть на стороне сервера, так как я хочу смягчить атаки ботов, а не атаки из браузера.
флаг cn
@gelonida Если подумать, вы можете запустить команду оболочки из Nginx, чтобы использовать ее для немедленной блокировки IP (вы все равно можете получить еще 2 или 3 попадания, но это будет очень быстро). Чтобы сделать это быстро, обязательно используйте правило, указывающее на список IP-адресов, управляемых `ipset`.
gelonida avatar
флаг de
спасибо за ваш обновленный ответ. Я до сих пор не уверен, как это поможет в моем текущем случае. Вероятно, мне придется подождать, пока обратный прокси не добавит заголовок X-Forwarded-For, но тогда мне все равно нужно посмотреть, как блокировать запросы (пожалуйста, см. связанный вопрос: https://serverfault.com/questions/1094926/ can-fail2ban-add-deny-rules-to-nginx-вместо-использования-iptables)
Рейтинг:0
флаг il

Nginx имеет limit_req модуль, так что вы можете использовать его в качестве предварительной фильтрации.

Видеть https://stackoverflow.com/questions/37877242/nginx-limit-req-based-on-http-header на аналогичный вопрос.

Например, подсчитав и ограничив 404 попытки (например, в соответствующем месте ошибки) и/или отфильтровав их с помощью fail2ban в дальнейшем, если вы будете регистрировать только ограниченные запросы. Таким образом, вы можете уменьшить максретри и найти время для джейла в fail2ban и может избежать слишком большой нагрузки из-за большого количества сообщений в логе (см. fail2ban :: wiki / Лучшие практики).

Для примера фильтра (в основном вам не нужен фильтр, который вы можете просто установить отказоустойчивое выражение прямо в тюрьме), см. filter.d/nginx-limit-req.conf. Вы также можете настроить nginx для регистрации X-переадресовано-для заголовок вместо или дополнительно к реальному IP. И даже забанить их обоих, используя разные максретри/найти время в сочетании с различными лимитами и всплесками в limit_req модуль.

gelonida avatar
флаг de
Я изменил заголовок и выделил некоторые части своего сообщения. На самом деле основная проблема в том, что я хочу обнаружить 404 на одном и том же http-соединении. Боюсь, потребуется много времени, прежде чем обратный прокси будет изменен и предоставит мне информацию. что мне действительно нужно.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.