LINUX.ORG.RU

Опубликовал программу автоматической блокировки пакетов IPv4 от источников DDoS-атаки


0

0

Изначально, программа была написана на заказ для заказчика с свйта типа
Freelance.ru за небольшое вознаграждение. Программу заказчику передал,
но дальше он не стал проявлять инициативы по поводу развития программы,
поэтому решил по просьбе одного из читателей linux.org.ru, опубликовать
программу на условиях свободной лицензии GNU GPL Version 3.

Программа logipinspect предназначена для фильтрации файлов отчетов
Apache, и автоматической блокировки источников DDoS-атак посредством
команд iptables.

Дистрибутив: http://lubyagin.discrete.ru/download/logipinspect-0.0.1-5.tar.gz

Замечания направляйте по почте или по Jabber:
E-mail: lubyagin@yandex.ru
Jabber: lubyagin@jabber.ru

★★★★★

$ make
gcc -Wall --std=gnu99 -O3 -fno-strict-aliasing -o logipinspect logipinspect.c
strip --strip-all logipinspect
chmod u+x logipinspect

pacify ★★★★★
() автор топика
Ответ на: комментарий от sdio

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

pacify ★★★★★
() автор топика

особенность DDoS ещё в том, что source-address в пакетах может быть произвольным. Открывается raw-сокет, формируется заголовок, высчитывается контрольная сумма... ttl, src-address, src-port могут быть произвольными. И это только от одного источника. А если DDoS-источников море и на жирном канале?
Три-четыре источника с магистрального канала могут положить не то, чтобы любой сервер, а целые сети, провайдеров целиком - не спасает почти ничего :(

Да и не обязательно могут досить только 80-й порт.

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

> Открывается raw-сокет, формируется заголовок, высчитывается контрольная сумма... ttl, src-address, src-port могут быть произвольными.

Что-то я сомневаюсь, что провайдер выпустит пакет от обычного юзера с src-address != его айпишнику. Ты хочешь сказать, что остались еще коллокейшены, где можно задавать произвольный src-address ?

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от dimon555

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

xydo ★★
()
Ответ на: комментарий от true_admin

Увы, во времена моей молодости, никаких stdbool не было. :)

pacify ★★★★★
() автор топика
Ответ на: комментарий от sdio

> каков реальный смысл писать парсер логов на С относительно perl?

Не поверишь - переносимость. Ну и управляемость, до кучи. Скрптовые решения часть пишут "спустя рукава", заюзав какую-нибудь нагугленную либу, которая через месяц уже будет не совместима с этим кодом, а через полгода вообще заброшена.

Ну и потом, на машинах, которым нужен такой сфот, как у топикстартера, редко бывают лишие файлы в /usr/bin типа gcc, python, perl и т.п. ))

LamerOk ★★★★★
()

Разместил проект на страничке:
http://fireforge.net/projects/logipinspect/

* Development Status / Статус: 3 - Alpha
* Environment / Окружение: Console (Text Based) / Консольный режим, No Input/Output (Daemon) / Служба
* Intended Audience / Целевая аудитория: Developers / Разработчики, System Administrators / Системные администраторы
* License / Лицензия: GNU General Public License (GPL)
* Natural Language / Язык: Russian / Русский
* Operating System / Операционная Система: Linux
* Programming Language / Язык программирования: C
* Topic / Тема: Log Analysis / Анализаторы логов, WWW/HTTP, Firewalls

pacify ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

> Ну и потом, на машинах, которым нужен такой сфот, как у топикстартера, редко бывают лишие файлы в /usr/bin типа gcc, python, perl и т.п. ))

А так же php, sh и всего остальное :). Посмотрел бы я на современный дистр без python и перл :)

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

sh при определенных условиях вполне может не быть )) И это не дистр, да ))

LamerOk ★★★★★
()
Ответ на: комментарий от true_admin

>А так же php, sh и всего остальное :). Посмотрел бы я на современный дистр без python и перл :)

Это может быть не дистрибутив общего назначения. Для нужд самой системы ни пистон, ни перл нафиг не упали. Да и sh тоже может не случиться.

KblCb ★★★★★
()
Ответ на: комментарий от true_admin

>По-моему, выковыривание gcc итп это страдание фигнёй. selinux/apparmor гораздо более правильное решение этого вопроса.

Что, пардон? gcc, selinux, apparmor на роутере?

KblCb ★★★★★
()
Ответ на: комментарий от melkor217

> вы про это?

про это :). Чуть ли не половина проектов начинается с '#define TRUE 1'. Зачем тратить своё время на разработку своего булевого api когда есть универсальный кроссплатформенный стандартизированный интерфейс? :)

true_admin ★★★★★
()
Ответ на: комментарий от sdio

Кроме apache существует уева туча http-серверов, например ставят на одноплатниках есть не просят, не нужен там ни перл ни пистон, многие умеют вести логи в стиле apache, с cgi работают и весят килобайт 100 - зачем там монструозный перл ?

monika
()
Ответ на: комментарий от LamerOk

Это не kiss, это заблуждение что если нет компилятора то система засекурина.

Против внутренних дыр в ПО(в т.ч. вебскриптах), шелл-кода и статических бинарников это бесполезно. Уж лучше в чрут всё поместить чем дистрибутив уродовать.

Щас трояны тянут за собой тянут набор бинарей сразу под несколько осей и платформ. В том числе статические ss, netstat, sshd итп.

true_admin ★★★★★
()

Автор проясни момент.
У тебя объявлено:

/* максимально допустимое число адресов IPv4 за одну минуту */
#define N_MAX_IP_A 100

a_ip = malloc(N_MAX_IP_A*sizeof(unsigned int));

a_ip[current_a_index] = t_ip;
current_a_index++;

И нигде я не вижу проверки (current_a_index < N_MAX_IP_A)
Т.е. если в минуту будет > 100 разных IP адресов, то мы вылазим за
границы массива a_ip.

Так? или я плохо глядел в исходники (посл. раз писал на С в 2001 году)

sdio ★★★★★
()
Ответ на: комментарий от true_admin

> Это не kiss, это заблуждение что если нет компилятора то система засекурина.

Каким боком первая часть утверждения (и мое утверждение выше) связана со второй частью?

> Против внутренних дыр в ПО(в т.ч. вебскриптах), шелл-кода и статических бинарников это бесполезно.


С первым согласен, со вторым и третьим - нет. Шелл-код нельзя выполнить не имея шелла (а так же всевозможных dd, cp, mv, ln, [ и т.п. Статические бинарники нужно еще куда-то записать.

Я лично прониковений с пачкой готовых бинарников не видел ни разу. Обычно вызывали на червя, куда потом через отверстие им пробуренное докидывались исходники нужных софтин и собирались на месте.

Что характерно - под никсами как правило спамбот/ирсбот, под вендой - варезный фтпсервер. ))

> Уж лучше в чрут всё поместить

Ну так и из чрута выходят. "Это заблуждение, что если чрут - то система засекурена"©

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

> Каким боком первая часть утверждения (и мое утверждение выше) связана со второй частью?
А какую цель ты тогда преследуешь удаляя компилятор из системы?

> Шелл-код нельзя выполнить не имея шелла

Шелл-код это не то что ты подумал. http://en.wikipedia.org/wiki/Shellcode

> Статические бинарники нужно еще куда-то записать.

На сервере нет жётского диска?

> Обычно вызывали на червя, куда потом через отверстие им пробуренное докидывались исходники нужных софтин и собирались на месте.

И я про то же. Зальют бинарь через upload в php а он утянет всё остальное.

> Ну так и из чрута выходят

Как ты бы вышёл из чрута? Воспользовавшись дырков в smbfs в старом ядре? :). Выходов из чрута не так много и они, при грамотном использовании не применимы.

true_admin ★★★★★
()

    ((unsigned char *)(&t_ip))[3] = t3;
    ((unsigned char *)(&t_ip))[2] = t2;
    ((unsigned char *)(&t_ip))[1] = t1;
    ((unsigned char *)(&t_ip))[0] = t0;

Сегодня вы игнорируете big-endian машины, завтра они игнорируют вас!

bvvv
()
Ответ на: комментарий от true_admin

> А какую цель ты тогда преследуешь удаляя компилятор из системы?
Убираю не нужное. На продакшн сервере компилятор никогда не будет запущен, при более или менее нормальном workflow.

> Шелл-код это не то что ты подумал.

Да, я подумал другое, хотя и очень близкое. Но суть не меняется:
> It is called "shellcode" because it typically starts a command shell

Отличия от exec /bin/sh мне встречались, но к запуску на исполнение двоичных данных они уже не имели отношения ))

> На сервере нет жётского диска?

Да, может не быть. Если есть, то rw разделы с noexec.

> Зальют бинарь через upload в php а он утянет всё остальное.

Проще уж сразу залить php-скрипт и его вызвать. )) Партишины для аплоадов как я уже сказал - noexec, а HttpRoot по хорошему на ro должен быть или как минимум не доступен для записи httpd.

> Выходов из чрута не так много

С этим я согласен - чрут достаточно секьюрен. Это я привел рассуждение по аналогии для иллюстрации )))

LamerOk ★★★★★
()
Ответ на: комментарий от true_admin

>Зачем тратить своё время на разработку своего булевого api когда есть универсальный кроссплатформенный стандартизированный интерфейс? :)

'#define TRUE 1' ничуть не менее кросплатформенно)) хотя это, конечно, менее эстетично.

melkor217 ★★★★★
()
Ответ на: комментарий от LamerOk

> Убираю не нужное. На продакшн сервере компилятор никогда не будет запущен, при более или менее нормальном workflow.

чтобы убрать что-нить ненужное нужно сначала поставить что-нить ненужное (с) матросскин.

То что ты описал всё правильно, но, может быть стоит профиль apparmor создать а не систему перелопачивать? :). Профиль потом взял и разнёс на все сервера.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Ну не знаю, как по мне - чем меньше элементов в системе, тем легче ею управлять. C apparmor дела не имел, а SELinux больше похож на затычку. Всю систему им огораживать - умаешься, можно обнести только критичные задачи. Хорошо для серверов, на которых потом бог знает что будет твориться. )))

LamerOk ★★★★★
()
Ответ на: комментарий от true_admin

>чтобы убрать что-нить ненужное нужно сначала поставить что-нить ненужное (с) матросскин.

Не матросскин, а дядя Федор.

sdio ★★★★★
()
Ответ на: комментарий от LamerOk

selinux вообще один из величайших позоров open source(имхо). Сложность запредельная для систем такого рода. apparmor, к сожалению, мало распространён и имеет несколько спорных вещей в реализайии. Но конфиг достаточно приятный. Вот, например, для bind он такой:

/usr/sbin/named {
[..]
capability net_bind_service,
capability setgid,
capability setuid,
capability sys_chroot,

/etc/bind/** r,
/var/lib/bind/** rw,
/var/lib/bind/ rw,
/var/cache/bind/** rw,
/var/cache/bind/ rw,
[..]
}

Всё просто и понятно, даже доки можно не читать(но лучше прочитать).

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Да, выглядит симпатично. Спасибо за наводку, будет время - покопаю.

LamerOk ★★★★★
()
Ответ на: комментарий от sdio

Да, именно так. Проверки на превышение значения индекса его максимально допустимого значения нет. Я не стал
дописывать эту проверку в программу, так как на это пока не было времени. Как следствие, программа работает
только при указанных условиях, т.е. при числе уникальных адресов IPv4 до заданного предела (N_MAX_IP_A).
Соответственно, превышение этого предела вызывает Segmenation fault.

pacify ★★★★★
() автор топика
Ответ на: комментарий от KblCb

>>apache на раутере?
> apache проглядел.
> KblCb * (*) (01.05.2009 13:40:29)

Для чистоты эксперимента можно поставить Apache на другой машине, а
отчеты пересылать на станцию (роутер блокировок) по сети через syslogd.

pacify ★★★★★
() автор топика
Ответ на: комментарий от bvvv

> Сегодня вы игнорируете big-endian машины, завтра они игнорируют вас!
subst(big-endian машины,мнение собеседника)

pacify ★★★★★
() автор топика
Ответ на: комментарий от true_admin

> Это не kiss, это заблуждение что если нет компилятора то система засекурина.
> true_admin * (*) (01.05.2009 15:54:34)

true_admin, по опыту мне известно, что сборка системы обычно производится на инструментальной, build-системе, для целевой, target-системы. Другими словами, компилятора на исходной машине может и не быть.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

да я не про это. вот есть у меня на фряшке компилер который входит в стандартную поставку ОС и вместе с ней ставится. Я не верю что если я его выкорчую оттуда то система сразу станет сильно секурней.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

> да я не про это. вот есть у меня на фряшке компилер который входит в
> стандартную поставку ОС и вместе с ней ставится. Я не верю что если я
> его выкорчую оттуда то система сразу станет сильно секурней.
> true_admin * (*)

Конечно нет, на то она и система.
Для проверки целостности ее защиты, я так полагаю, надо проводить отдельное исследование.

pacify ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

>Проверки на превышение значения индекса его максимально допустимого значения нет. Я не стал дописывать эту проверку в программу, так как на это пока не было времени. Как следствие, программа работает
только при указанных условиях, т.е. при числе уникальных адресов IPv4 до заданного предела (N_MAX_IP_A). Соответственно, превышение этого предела вызывает Segmenation fault.

Спасибо.
А теперь послушаем комментарии LamerOk'a к его словам: "Скрптовые решения часть пишут "спустя рукава", заюзав какую-нибудь нагугленную либу, которая через месяц уже будет не совместима с этим кодом, а через полгода вообще заброшена."

LamerOk, что там по-поводу скриптов? С перлом такого просто не возникло бы.


sdio ★★★★★
()
Ответ на: комментарий от sdio

> Спасибо.
> А теперь послушаем комментарии LamerOk'a к его словам: ...

Мне почему-то приходят на ум другие слова, из Священного Писания,
"Не судите, да не сидимы будете".

Кстати, новую версию программы, где эта ошибка исправлена, уже выложил:
http://lubyagin.discrete.ru/logipinspect.html
или http://fireforge.net/frs/download.php/283/logipinspect-0.0.1-6.tar.gz

pacify ★★★★★
() автор топика
Ответ на: комментарий от sdio

> С перлом такого просто не возникло бы.

И ты на полном серьёзе полагаешь, что небрежность программиста в коде на С никогда и ни при каких обстоятельствах не случится на божественном перле, защищающем программиста ото всех ошибок? ))

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

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

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

open XXX "bla-bla" or die "";

Повсеместно и несложно. Не от языка программирования зависит степень небрежности и невнимательности.

Slavaz ★★★★★
()
Ответ на: комментарий от pacify

К тебе претензий не было изначально. А вот Ламерок вылез с утверждением "на С пишут качественно, а скрипты на коленках"

sdio ★★★★★
()
Ответ на: комментарий от Slavaz

> Повсеместно и несложно.

В теории. На практике человеческая лень сильнее. ))

> Не от языка программирования зависит степень небрежности и невнимательности.


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

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.