— Небось снова про блокчейн, только в профиль?
— А вот и не угадали! На этот раз – ничего ни про блокчейн, ни про Emercoin! В конце концов, имеем же мы право делать что-либо помимо основного проекта!
А сделали мы на этот раз утилиту для защиты веб-сервера от вездесущих кульхацкеров, которые постоянно пытаются залить эксплойт в веб-сайт и получить неавторизованный доступ к серверу, чтобы потом прямо на Вашей площадке заниматься всякими непотребствами. Вот об этой утилите под названием BanMoron и пойдёт речь ниже.
BanMoron – это маленькая программа (исходник меньше текста этой статьи), написанная на языке C, и предназначенная для эффективного противодействия попыткам взломать WEB-сервер путём использования стандартных уязвимостей WEB-систем типа Wordpress, PhpMyAdmin и им подобных.
Алгоритм работы программы прост:
- Программа ставится под WEB-сервер в качестве обработчика ошибки 404 (страница не найдена). То есть попытка хакера получить доступ к несуществующей странице или скрипту приведёт к запуску этой программы.
- После запуска программа анализирует строку-запрос клиента (REQUEST_URI), и ищет в ней подстроки-шаблоны, соответствующие попыткам получить доступ к тем или иным ресурсам для взлома системы (таким как setup.php).
- В случае нахождения какой-либо подстроки-шаблона, программа применяет тот или иной модуль противодействия, ассоциированный с данным шаблоном. Если же ни один шаблон не найден, программа просто выводит стандартную страницу, содержащую текст ошибки 404.
В настоящее время реализованы следующие модули противодействия:
- ban_moron_pf – добавляет IP-адрес клиента в таблицу блокировки файрвола pf. В результате, IP хакера попадает в чёрный список, и все запросы с этого IP игнорируются. Во избежание переполнения списка из него ежесуточно удаляются IPs, с которых в течение 3х последних суток не было более попыток соединиться с сервером. Удаление делается командой из crontab, пример таковой для pf приведёт в файле pf.crontab.
- zip_bomb – в ответ на запрос отправить ZIP-бомбу – бесконечный файл-поток, выглядящий как сильно закомпресованный html-файл с бесконечной вложенностью таблиц. Предназначен для исчерпания ресурса атакующей машины и вывода из строя атакующего скрипта. К сожалению, в настоящее время эта штука обладает низкой эффективностью, так как, если смотреть исходники зловредов, то видно, что там вовсю используется CURL, который zip-поток просто не распаковывает. Но для любителей вручную скачать биткоин-кошелёк браузером, эта штука всё ещё годится.
- 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 запускается только в тот момент, когда надо что-то сделать, и не отбирает на себя системных ресурсов постоянно. И банит хакера по первому же его запросу. Оперативность на высоте!
— Почему Ваша программа написана на языке С?
— Тому есть ряд причин:
- Поднятие приоритета посредством S-бита можно сделать только для бинарной программы. При использовании интерпретатора S-бит игнорируется. А он нужен, чтоб поднять привилегии от www до root для внесения IP в бан-таблицу morons.
- Скомпилированная бинарная программа – наиболее легка для запуска, и не тянет за собою запуск интерпретатора, который сам тянет за собою кучу разделяемых библиотек.
- Язык C – классический язык во всех OC, и везде точно есть.
— Почему правила забиты непосредственно в код программы? Может, их надо бы вынести в конфиг-файл?
— А как потом программе указывать, где брать этот самый конфиг? WEB-сервер не позволяет передать программе конфигурационный параметр “от себя”. Можно конечно прикрутить к делу mod_rewrite, и параметр пробрасывать через QUERY_STRING, или сделать что-нибудь подобное. Но нам такое решение кажется и «развесистым» в плане администрирования, и неэффективным в процессе работы. Это ж надо читать .htaccess, запускать mod_rewrite, править строку, потом программа по этой строке должна открыть файл и его читать… В общем, ситуация напоминает реакцию адмирала из фильма «Горячие Головы»: Разверните авианосец, у меня фуражка за борт улетела, надо подобрать. Нам кажется, не стоит оно того.
— А почему в качестве файрвола использован какой-то pf?
— Потому, что программа разрабатывалась на FreeBSD, а там дефолтным файрволом является именно pf, который нас полностью устраивает. Если Вы желаете, чтобы программа работала с iptables или другим Вашим файрволом – напишите соответствующие модули (обработчик, и примеры конфигов), сделайте pull request на Github, и мы примем Ваш вклад в общее дело. Человечество Вам будет благодарно.
— Где и на каких условиях я могу получить программу BanMoron?
— Вы можете скачать её из GitHub репозитория Emercoin и использовать совершенно бесплатно, так как эта программа OpenSource и распространяется под лицензией BSD.