Alex 'AdUser' Z
8 years ago
3 changed files with 238 additions and 1 deletions
@ -0,0 +1,128 @@
|
||||
--- |
||||
title: Отчёт о ходе разработки f2b |
||||
tags: devel, f2b |
||||
--- |
||||
|
||||
Sep 9 23:06:55 f2b[10753]: jail 'asterisk': new ip found -- 89.163.146.93 |
||||
Sep 9 23:09:50 f2b[10753]: jail 'asterisk': new ip match -- 89.163.146.93 (2/3) |
||||
Sep 9 23:12:43 f2b[10753]: jail 'asterisk': new ip match -- 89.163.146.93 (2/3) |
||||
Sep 9 23:15:35 f2b[10753]: jail 'asterisk': new ip match -- 89.163.146.93 (2/3) |
||||
Sep 9 23:18:40 f2b[10753]: jail 'asterisk': banned ip 89.163.146.93 for 1.0hrs |
||||
# ... попался, ублюдок! |
||||
|
||||
Продолжаем неспешно пилить чудо-программу. |
||||
|
||||
С момента [предыдущего](/blog/2016/03/17/f2b/) поста темпы пиления упали, т.к. сказывается "эффект УМВР", |
||||
но тем не менее сделано следующее: |
||||
|
||||
--- |
||||
|
||||
Control socket для демона |
||||
------------------------- |
||||
|
||||
Над реализацией пришлось изрядно посидеть и поэкспериментировать. |
||||
|
||||
Изначально я хотел использовать ``SOCK_STREAM`` и обычный текстовый протокол. |
||||
Посидел, написал свою реализацию getline для сокета, |
||||
простенький аналог bison'а для разбора команд |
||||
и стало мне грустно от осознания объёма кода, который будет это всё обслуживать. |
||||
|
||||
Плюсы: |
||||
|
||||
* с этим может работать любая утилита с помощью netcat/telnet |
||||
|
||||
Минусы, навскидку: |
||||
|
||||
* разбор текстовых команд в виде нескольких токенов - достаточно сложное занятие. |
||||
Нужно вычленить строку (в экстремальном случае она может приходить по байту за раз), |
||||
побить её на токены, проверить синтаксис, количество аргументов. |
||||
Нужно достаточно сложное управление входным буфером: |
||||
если не распарсилось полностью - дождаться недостающего, осталось лишнее - хранить. |
||||
* перечисленное выше - работает с недоверенными данными из сети -> всё это надо выписывать с упором на безопасность. |
||||
* открывается дорога всем нашим любимым сетевым шалостям: |
||||
типа открытия 500 соединенений разом и заливки в каждое из них мегабайтной строки, |
||||
без малейших признаков "\r" или "\n" -> скажите "здравствуй" исчерпанию памяти или fd. |
||||
* ну и такой мелкий штрих: если мы хотим встроенный хелп - из-за тупости клиента, |
||||
будьте любезны тащить описание команд на серверную сторону. |
||||
|
||||
...ну и не стоит забывать, что ломание кривонаписанного парсера текстового протокола - это |
||||
старая-добрая традиция, ещё начиная со времён sendmail'а и irc. |
||||
А уж как народ с самой почтой развлекается, это просто песня. |
||||
|
||||
Поэтому плюнул я на это дело и взял ``SOCK_DGRAM``. |
||||
|
||||
Минусы: |
||||
|
||||
* нужен спецклиент |
||||
* негарантированная доставка |
||||
|
||||
Но плюсов в моём случае - много: |
||||
|
||||
* разом снимется проблема с разбором сообщений: readv + проверка длинны пакета. |
||||
* никаких висящих соединений: пришёл пакет - обработал, опционально ответил. |
||||
* бесплатно получаем управление несколькими инстансами в пределах локальной сети (udp+igmp)[^fn1]. |
||||
* возможность использовать тот же код в качестве source/backend: |
||||
если один хост в сети засёк пидараса - делается рассылка через тот же igmp и все остальные его дружно банят |
||||
ещё до того, как он полезет сканить порты на следующий узел. |
||||
|
||||
Простенький клиент |
||||
------------------ |
||||
|
||||
Появился в силу предыдущего пункта. |
||||
|
||||
Сейчас он умеет все базовые операции: показать статистику, забанить/разбанить, перечитать конфиг, завершиться. |
||||
|
||||
Есть задел и на больше - точная настройка конкретного jail'а, добавление регэкспов "на лету". |
||||
|
||||
redis-backend |
||||
------------- |
||||
|
||||
Написан черновик, но пока не тестировался: чтобы его использовать, нужен парный ему source, |
||||
а source у нас сейчас прибит гвоздями к файлам. |
||||
|
||||
Растущее время поиска/бана для конкретного ip |
||||
--------------------------------------------- |
||||
|
||||
Думаю, кто пробовал настроить fail2ban видел в логах "умных" ботов, |
||||
после первого бана подстраивающих частоту запросов так, чтоб не попасть под раздачу. |
||||
|
||||
Это работает, но только до той поры, пока период обнаружения фиксирован. |
||||
Если он уменьшается по мере того, как растёт число запросов - к ним приходит песец. |
||||
|
||||
На примере: допустим у нас настроено ограничение 5 неправильных запросов в 5 минут. |
||||
При фиксированном времени обнаружения бот может сделать 4 запроса, и пойти покурить, |
||||
передав эстафету другому боту. |
||||
|
||||
При динамическом времени обнаружения, на эти 4 запроса в первый раз боту придётся |
||||
так же подождать 5 минут, а вот в следующий раз - уже 5,5 минут, и т.д. |
||||
|
||||
Вторая идея, логически продолжающая первую - увеличение времени бана при рецидивах. |
||||
Это тоже сделано, потому что важно не просто забанить бота, но и порвать ему шаблон. |
||||
|
||||
Третья идея в этом плане - смотреть на "соседей" забаненного ip, |
||||
и расширять бан до подсети при необходимости. Этого у меня пока не реализовано. |
||||
|
||||
CMake |
||||
----- |
||||
|
||||
* добавлена поддержка GNUInstallDirs |
||||
* наведён порядок с путями конфигов, постараюсь больше не менять. |
||||
|
||||
Багфиксы |
||||
-------- |
||||
|
||||
Без них - никуда. Исправлена пара сегфолтов в коде фильтров. |
||||
После этого были сделаны оргвыводы, и притащен strlcpy() |
||||
на замену snprintf()/strncpy() из директории уровнем выше. |
||||
|
||||
Обеспечена сборка и работа под бзд. Там же был пойман забавный баг: |
||||
|
||||
fgets(buf, bufsize, file->fd); |
||||
|
||||
...это не работает, если у ``file->fd`` выставлен EOF, даже если файл после этого прибавил пару гигабайт. |
||||
Решение - сбрасывать руками перед каждым вызовом через clearerr(). |
||||
Допускаю, что это ``implementation-defined`` поведение. |
||||
|
||||
Ну и кое-что по мелочи, типа выключения буферизации у логфайла. |
||||
|
||||
[^fn1]: Это планируется, пока играюсь с point-to-point через unix-сокет. |
@ -0,0 +1,105 @@
|
||||
--- |
||||
title: Отчёт о ходе разработки f2b |
||||
tags: devel, f2b |
||||
--- |
||||
|
||||
Jan 4 19:52:33 f2b[4090]: jail 'portknock': restored ban of ip 85.121.165.15 (23.9hrs remain) |
||||
Jan 4 19:52:33 f2b[4090]: jail 'portknock': restored ban of ip 95.154.82.19 (23.9hrs remain) |
||||
Jan 4 19:52:33 f2b[4090]: jail 'portknock': restored ban of ip 78.171.148.130 (24.0hrs remain) |
||||
Jan 4 19:52:33 f2b[4090]: jail 'portknock': restored ban of ip 221.194.47.224 (24.0hrs remain) |
||||
# ... сидеть, обезьяны, срок ещё не вышел! |
||||
|
||||
С момента предыдущего [отчёта](/blog/2016/09/11/f2b-devel-status/) сделано следующее: |
||||
|
||||
--- |
||||
|
||||
source сделан загружаемым модулем |
||||
---------------------------------- |
||||
|
||||
... по аналогии с фильтром и бакендом. Ранее было прибито к файлам. |
||||
|
||||
Тоже через libdl, интерфейс смотреть в sources/source.h, примеры реализации - в том же каталоге, любой /*.c/ |
||||
|
||||
redis source/backend |
||||
-------------------- |
||||
|
||||
Предыдущий пункт позволил реализовать source для redis. |
||||
|
||||
Это позволило "делиться" банами с другими хостами. |
||||
Сейчас оно работает уже пару месяцев без перерыва, 4 хоста с f2b + 1 redis-сервер. |
||||
|
||||
mcast source/backend |
||||
-------------------- |
||||
|
||||
Также добавлен аналог предыдущего модуля, но работающий через multicast, |
||||
что позволяет обойтись без redis-сервера, но ограничивает расположение |
||||
хостов одним multicast-доменом (т.е. одна и та же сеть, если не применять |
||||
костыль в виде igmpproxy и подобного). |
||||
|
||||
Пока недостаточно оттестировано. |
||||
|
||||
portknock source |
||||
---------------- |
||||
|
||||
Для выявления заведомых ботов. Позволяет повесить, например, /типа/ открытый telnet, |
||||
а по коннекту -- банить подключившегося, ибо нехер. |
||||
|
||||
Если скомбинировать с вышеупомянутым redis'ом - получим распределённый honeypot. |
||||
Любой пидорас, спаленный за сканированием этого "telnet"'а будет немедленно забанен на всех хостах с f2b |
||||
(а то и во всей защищаемой сети в случае граничного роутера). |
||||
|
||||
Приготовьтесь сразу юзать ipset или нечто подобное, хостов будет много. |
||||
За три часа часа работы в таком режиме набегает под две сотни, а за сутки - тысяча-полторы хостов (при бане на сутки). |
||||
|
||||
doxygen и прочая документация |
||||
----------------------------- |
||||
|
||||
В всех заголовках добавлены doxygen'овы комментарии для структур, дефайнов и функций. |
||||
Вобщем, задокументировано всё, на что оно ругалось при генерации доков. |
||||
|
||||
Также, существенно расширены доки по установке и настройке, добавлены примеры конфигов. |
||||
|
||||
state |
||||
----- |
||||
|
||||
Добавлена возможность хранить и восстанавливать список банов при рестарте. |
||||
Сделано тупо через файлик с записямии, когда какой ip был забанен и когда его выпускать. |
||||
|
||||
Особой производительности там не требуется, файлик переписывается только при очередном бане. |
||||
Если будет тормозить - тогда будем думать. |
||||
|
||||
Клиент / управление |
||||
------------------- |
||||
|
||||
Реализована команда set для jail'ов. Теперь порог срабатывания и прочие параметры можно поменять без рестарта. |
||||
Реализована перезагрузка списка regexp'ов для фильтра (аналогично). |
||||
|
||||
Для пришедшего пакета теперь проверяется количество аргументов. |
||||
Сделано с прицелом на будущую реализацию управления по igmp. |
||||
|
||||
Утилиты |
||||
------- |
||||
|
||||
Переработаны утилитки для тестов различных компонентов. |
||||
Также, они переименованы для приведения к одному виду /f2b-*-test/. |
||||
Все утилиты сейчас могут использовать тот же кусок конфига, |
||||
что и сам демон (с минимальными исправлениями, вроде пути к библиотеке). |
||||
|
||||
Переименованы некоторые команды, в частности: |
||||
|
||||
* ban -> ip ban |
||||
* show -> ip status |
||||
* release -> ip release |
||||
* regex stats -> filter stats |
||||
* regex add -> regex reload |
||||
|
||||
TODO |
||||
---- |
||||
|
||||
Что ещё надо будет в ближайшее время. |
||||
|
||||
* select() вместо sleep() -- при большом списке файлов плывёт время обработки. |
||||
* белый список для подсетей (реализация ipv4-only сложности не представляет, но хотелось бы её сделать и для ipv6 тоже) |
||||
* реорганизовать имена загружаемых модулей (сложности с cmake, оно очень сильно хочет сделать именование вида libFOO.so) |
||||
* reload для конкретного jail'а |
||||
* добавить возможность использовать как просто udp, так и udp multicast для клиента (сейчас - только unix-сокет) |
Loading…
Reference in new issue