Динамический черный список на основе IP - PullRequest
6 голосов
/ 22 сентября 2008

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

Например: - кто-то пытается грубо взломать ваш экран входа - плохо написанный бот выдает очень странные HTTP-запросы на ваш сайт - скрипт-малыш использует сканер для поиска уязвимостей в вашем приложении

Мне интересно, сработает ли следующий механизм, и если да, знаете ли вы, есть ли инструменты, которые это делают:

  • В веб-приложении разработчик имеет ловушку, чтобы сообщить о "правонарушении". Правонарушение может быть незначительным (неверный пароль), и потребуется десятки таких правонарушений, чтобы попасть в черный список; или это может быть серьезным, и пара таких преступлений в течение 24 часов выбивает вас из колеи.
  • Некоторая форма блока уровня веб-сервера включается до загрузки каждой страницы и определяет, пришел ли пользователь с «плохого» IP.
  • Есть встроенный механизм "прощения": нарушения больше не учитываются по IP через некоторое время.

Спасибо!

Дополнительное примечание: было бы замечательно, если бы решение работало на PHP, но я хотел бы услышать ваши мысли о подходе в целом для любого языка / платформы

Ответы [ 6 ]

5 голосов
/ 22 сентября 2008

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

2 голосов
/ 22 сентября 2008

вы на * nix машине? Подобные вещи, вероятно, лучше оставить на уровне ОС, используя что-то вроде iptables

редактирование:

в ответ на комментарий, да (вроде). однако идея заключается в том, что iptables может работать независимо. Вы можете установить определенный порог для регулирования (например, блокировать запросы на порт 80 TCP, которые превышают x запросов / минуту), и все это прозрачно обрабатывается (т. е. вашему приложению действительно не нужно ничего знать об этом, чтобы иметь динамическая блокировка).

Я бы предложил метод iptables, если у вас есть полный контроль над блоком, и предпочел бы, чтобы ваш брандмауэр обрабатывал регулирование (преимущества в том, что вам не нужно встраивать эту логику в ваше веб-приложение, и это может сэкономить ресурсы поскольку запросы отбрасываются до того, как они попадают на ваш веб-сервер)

в противном случае, если вы ожидаете, что блокировка не будет огромным компонентом (или ваше приложение переносимо и не может гарантировать доступ к iptables), то было бы разумнее встроить эту логику в ваше приложение.

0 голосов
/ 29 января 2009

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

это просто и кратко объяснено здесь http://www.alandoherty.net/info/webservers/

написанные сценарии не могут быть загружены {так как в настоящее время комментарии не добавляются}, но отправьте мне электронное письмо с сайта выше, и я перешлю вам код и с радостью помогу с отладкой / настройкой его для вашего сервер

0 голосов
/ 22 сентября 2008

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

Обычно я работаю в Perl, а не в PHP, но, если у вас есть интерфейс командной строки к вашему механизму правил брандмауэра (например, / sbin / iptables), вы сможете сделать это довольно легко из любой язык, который может выполнять системные команды.

0 голосов
/ 22 сентября 2008

вы смотрите на пользовательский код блокировки. В мире открытого исходного кода есть приложения, которые содержат различные разновидности такого кода. Возможно, вам стоит взглянуть на некоторые из них, хотя ваши требования довольно тривиальны, поэтому отметьте комбинацию IP / имя пользователя и используйте ее для блокировки IP на некоторое время. (Обратите внимание, я сказал, что блокируйте IP, а не пользователя. Пользователь может попытаться подключиться к сети с помощью действующего сочетания IP / username / pw.)

Фактически, вы могли бы даже сохранить следы входов пользователей в систему, и при входе с неизвестного IP с комбо 3-х неудачного имени пользователя / pw заблокируйте этот IP-адрес на сколько угодно времени для этого имени пользователя. (Обратите внимание, что многие интернет-провайдеры имеют общие IP-адреса, поэтому ....)

Возможно, вы также захотите установить задержку аутентификации, чтобы IP-адрес не мог пытаться войти в систему чаще, чем один раз каждые 'у' секунд или около того.

0 голосов
/ 22 сентября 2008

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

...