Небось снова про блокчейн, только в профиль?

— А вот и не угадали! На этот раз – ничего ни про блокчейн, ни про Emercoin! В конце концов, имеем же мы право делать что-либо помимо основного проекта!


А сделали мы на этот раз утилиту для защиты веб-сервера от вездесущих кульхацкеров, которые постоянно пытаются залить эксплойт в веб-сайт и получить неавторизованный доступ к серверу, чтобы потом прямо на Вашей площадке заниматься всякими непотребствами. Вот об этой утилите под названием BanMoron и пойдёт речь ниже.

BanMoron – это маленькая программа (исходник меньше текста этой статьи), написанная на языке C, и предназначенная для эффективного противодействия попыткам взломать WEB-сервер путём использования стандартных уязвимостей WEB-систем типа Wordpress, PhpMyAdmin и им подобных.


Алгоритм работы программы прост:

  1. Программа ставится под WEB-сервер в качестве обработчика ошибки 404 (страница не найдена). То есть попытка хакера получить доступ к несуществующей странице или скрипту приведёт к запуску этой программы.
  2. После запуска программа анализирует строку-запрос клиента (REQUEST_URI), и ищет в ней подстроки-шаблоны, соответствующие попыткам получить доступ к тем или иным ресурсам для взлома системы (таким как setup.php).
  3. В случае нахождения какой-либо подстроки-шаблона, программа применяет тот или иной модуль противодействия, ассоциированный с данным шаблоном. Если же ни один шаблон не найден, программа просто выводит стандартную страницу, содержащую текст ошибки 404.

В настоящее время реализованы следующие модули противодействия:


  1. ban_moron_pf – добавляет IP-адрес клиента в таблицу блокировки файрвола pf. В результате, IP хакера попадает в чёрный список, и все запросы с этого IP игнорируются. Во избежание переполнения списка из него ежесуточно удаляются IPs, с которых в течение 3х последних суток не было более попыток соединиться с сервером. Удаление делается командой из crontab, пример таковой для pf приведёт в файле pf.crontab.
  2. zip_bomb – в ответ на запрос отправить ZIP-бомбу – бесконечный файл-поток, выглядящий как сильно закомпресованный html-файл с бесконечной вложенностью таблиц. Предназначен для исчерпания ресурса атакующей машины и вывода из строя атакующего скрипта. К сожалению, в настоящее время эта штука обладает низкой эффективностью, так как, если смотреть исходники зловредов, то видно, что там вовсю используется CURL, который zip-поток просто не распаковывает. Но для любителей вручную скачать биткоин-кошелёк браузером, эта штука всё ещё годится.
  3. zip_ban – комбинация первых двух. Сначала отправляет zip-бомбу, а потом – банит IP.


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


Сама программа легковесная, бинарник занимает всего 6 килобайт (наверное, все уже и забыли про такие размеры программ), и требует только одной разделяемой библиотеки libc. Таким образом, при её использовании снижения производительности WEB-сервера не наблюдается по сравнению с HTML-страницей 404.


Для повышения производительности, при сравнении строки REQUEST_URI с шаблонами правил, применён алгоритм Рабина-Карпа, позволяющий сравнить строку с множеством шаблонов за один проход, O(N). Универсальное хеширование делает практически невозможным создание специально подобранной строки REQUEST_URI, снижающей эффективность хеш-функции.


Ниже – ответы на типичные вопросы:


Почему такое название программы – BanMoron?
— Потому что, как видно из названия, основное назначение программы – держать всяких придурков подальше от работающих серверов, чтоб не дай бог ничего не сломали.



А почему вы хакеров называете придурками?
— Потому что эти «хакеры» придурки и есть. Берут готовый скрипт, который кто-то когда-то написал, и даже не удосуживаются его хоть как-то разнообразить, ума на такое уже не хватает. И по структуре запросов видно, что за скрипт используется. Напрашивается прямая аналогия с уличными “активистами”, которые где-то находят арматурину, и потом бьют стёкла на первых этажах. Интеллектуальный уровень обоих занятий примерно одинаков.


И чем ваша программа лучше fail2ban?
— Fail2ban использует другой подход. У него постоянно запущен процесс (демон), который мониторит логи, и по ним находит шаблон активности, после чего и банит соответствующий IP. Для реакции fail2ban должен обнаружить активность, то есть обработать множество запросов. Учитывая, что Apache буферизует запись в лог, и чтение из лога далеко не мгновенно, fail2ban имеет задержку реагирования в несколько секунд. Кроме того, должно пройти несколько событий 404, чтобы fail2ban смог обнаружить активность и среагировать. В настоящее время, разработчики эксплойтов тоже не сидят сложа руки, и уже появляются версии, которые делают множество параллельных запросов к жертве – наверное, как раз для того, чтобы успеть внедрить эксплойт до того, как fail2ban среагирует. Кроме того, fail2ban – скрипт на интерпретируемом языке, то есть постоянно держит в памяти интерпретатор Питона, что тоже не добавляет ему ни скорости, ни экономии ресурсов. BanMoron запускается только в тот момент, когда надо что-то сделать, и не отбирает на себя системных ресурсов постоянно. И банит хакера по первому же его запросу. Оперативность на высоте!


Почему Ваша программа написана на языке С?
— Тому есть ряд причин:

  1. Поднятие приоритета посредством S-бита можно сделать только для бинарной программы. При использовании интерпретатора S-бит игнорируется. А он нужен, чтоб поднять привилегии от www до root для внесения IP в бан-таблицу morons.
  2. Скомпилированная бинарная программа – наиболее легка для запуска, и не тянет за собою запуск интерпретатора, который сам тянет за собою кучу разделяемых библиотек.
  3. Язык C – классический язык во всех OC, и везде точно есть.



Почему правила забиты непосредственно в код программы? Может, их надо бы вынести в конфиг-файл?
— А как потом программе указывать, где брать этот самый конфиг? WEB-сервер не позволяет передать программе конфигурационный параметр “от себя”. Можно конечно прикрутить к делу mod_rewrite, и параметр пробрасывать через QUERY_STRING, или сделать что-нибудь подобное. Но нам такое решение кажется и «развесистым» в плане администрирования, и неэффективным в процессе работы. Это ж надо читать .htaccess, запускать mod_rewrite, править строку, потом программа по этой строке должна открыть файл и его читать… В общем, ситуация напоминает реакцию адмирала из фильма «Горячие Головы»: Разверните авианосец, у меня фуражка за борт улетела, надо подобрать. Нам кажется, не стоит оно того.

А почему в качестве файрвола использован какой-то pf?
— Потому, что программа разрабатывалась на FreeBSD, а там дефолтным файрволом является именно pf, который нас полностью устраивает. Если Вы желаете, чтобы программа работала с iptables или другим Вашим файрволом – напишите соответствующие модули (обработчик, и примеры конфигов), сделайте pull request на Github, и мы примем Ваш вклад в общее дело. Человечество Вам будет благодарно.



Где и на каких условиях я могу получить программу BanMoron?
— Вы можете скачать её из GitHub репозитория Emercoin и использовать совершенно бесплатно, так как эта программа OpenSource и распространяется под лицензией BSD.

Поделиться с друзьями
-->

Комментарии (4)


  1. Temmokan
    11.08.2017 11:57
    -1

    > А как потом программе указывать, где брать этот самый конфиг?

    Переменная среды? Легко настроить индивидуально для каждого VirtualHost (или аналога для других Web-серверов).


  1. vilgeforce
    11.08.2017 12:05
    +1

    Отлично же! Берем невинного юзверя, даем ему ссылку на сайт, находящийся под заSHITой этой системы, юзер получает вышедший из строя браузер, пытающийся распаковать ZIP-бомбу. После ребута, юзер уже не может пользоваться сайтом, поскольку его еще и по IP забанили. И поменять пароль он через сайт уже не может. Заблокировать аккаунт — не может, и так далее. Чего «придуркам» и надо — можно использовать юзверьский аккаунт!


    1. pyrk2142
      11.08.2017 13:09
      +2

      Делаем на популярном сайте и баним всех пользователей)

      А если серьёзно, то серьёзную опасность представляют далеко не те, кто загрустит после такого бана и забудет о сайте.


      1. vilgeforce
        11.08.2017 13:10
        +1

        Куда большую опасность представляют сайтостроители, решившие сделать наколеночное решение… :-/