LINUX.ORG.RU

Deannoing — демон/фильтр мониторинга лог-файла

 


4

3

Deannoing — демон/фильтр мониторинга лог-файла с вызовом парных команд с ожиданием при успешном поиске regex-выражений.

Конечно, подобных программ в сети в достаточном количестве, но автору либо не хватало их функциональности (в данном демоне 21 ключ), либо они были написаны на интерпретируемых языках с солидной утилизацией ресурсов и с сомнительным способом мониторинга входного файла. Данный демон использует современный способ наблюдения за изменениями входного файла путем использования механизма inotify.

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

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

Программа написана на языке C.

>>> Подробное описание программы

★★★★★

Проверено: hobbit ()
Последнее исправление: unfo (всего исправлений: 4)

Deannoing — демон/фильтр мониторинга лог-файла с вызовом парных команд с ожиданием при успешном поиске regex-выражений.

Звучит как awk

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

Звучит как awk

Ну типа да: tail | awk { system() }. На rocket science демон не тянет, зато вот эти указанные сопли делает удобно и хорошо.

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

что-то навроде fail2ban, я так понял.

Ага, без главного недостатка — оно написано не микрософтом мной, потому ключи появлялись по мере необходимых в работе условий. Вообще всё начиналось с bash скрипта, где и демон, параллельность и сигналы даже работали (чего как тут предложили — awk как до Луны):

#!/usr/bin/env bash

FTP_LOG=/var/log/proftpd.log
LOG_OUT=/var/log/proftpd_deannoing.log
declare -i DENY_TIME=3600          # 1 hour
declare -a ANNOING_STR=(
	"^USER .*: no such user"
	"^SECURITY VIOLATION: Root login attempted"
	"^client sent HTTP command"
)

exec < /dev/null >> "$LOG_OUT" 2>&1
cd /
trap '' HUP USR1

alarm_daemon() {
	while true; do
		sleep 30
		kill -s USR1 $1
	done
}

alarm_daemon $$ &
D=$!

declare -a annoing
declare -i ct i signaled

unblock() {
	ip=${annoing[$1]%:*}
	echo "$date unblock[$1]=$ip"
	iptables -D INPUT -s "$ip" -p tcp --syn --dport 21 -j DROP
}

get_date() {
	IFS=: read ct date < <(date '+%s:%c')
}

alarm() {
	trap '' USR1
	if [[ signaled -ne 0 ]]; then
		get_date
		i=0
		while [[ ${annoing[i]} ]] && (( (ct - ${annoing[i]##*:}) >= DENY_TIME )); do
			unblock $((i++))
		done
		[[ i -gt 0 ]] && annoing=("${annoing[@]:i}")
		signaled=0
	fi
	trap 'signaled=1; alarm' USR1
}

block() {
	echo "$date block[$1]=$2"
	iptables -A INPUT -s "$2" -p tcp --syn --dport 21 -j DROP
}

all_unblock() {
	kill $D
	get_date
	for i in "${!annoing[@]}"; do
		unblock $i
	done
	annoing=()
	exit 0
}

trap 'all_unblock' EXIT INT TERM

while read date time host pid srv ip l
do
	trap 'signaled=1' USR1

	get_date
	for e in "${ANNOING_STR[@]}"; do
		if [[ $l =~ $e ]]; then
			ip=${ip##*\[}
			ip=${ip%%\]*}
			for r in "${annoing[@]}"; do
				[[ ${r%:*} == "$ip" ]] && break 2 # fast annoing
			done
			block ${#annoing[*]} "$ip"
			annoing+=("$ip:$ct")
			break
		fi
	done
	alarm
done < <(exec tail -q -n1 --follow=name --retry "$FTP_LOG")

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

;) Малось устал столько накатать и перепроверить...

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

Плюсую. Сейчас из браузеров FTP выпилили, пришлось wget расчехлять…
Опакечивать там особенно нечего — один сишный файл и мейкфайл к нему — а вот какой-нибудь гитхаб/гитлаб/git.org.ru вместо tgz по FTP действительно не помешал бы…

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

Плюсую. Сейчас из браузеров FTP выпилили, пришлось wget расчехлять…

Так вам и нада, в seamonkey ftp остался.

и мейкфайл к нему

к нему — сильно сказано, так, только ради общей культуры, там же всё по умолчанию.

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

Как раз присматривал что-то на замену кривоватому fail2ban. Автору всяческих успехов.

yu-boot ★★★★★
()

inotify

Снова вендорлок на онтопик. Нет бы кроссплатформенный fswatch взять, бздунов порадовать.

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

Снова вендорлок на онтопик.

Это ещё что, там для старого gcc даже не оттранслируется, ибо юзается __COUNTER__ , а для не gcc не прокатит __attribute__...

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

Не понятно, зачем анонсировать программу, когда она написана чисто под себя, специально так чтобы другие люди ей пользоваться не могли. Репозитория нет, сайт на plain http, тарболл не версионированный, лежит на ftp, документация на русском. Так бы я её опакетил под свою систему, ставил бы на машины штатным образом и пользовался. А это ни опакетить ни даже скачать.

slovazap ★★★★★
()

согласно поступающим в исходный лог-файл строк

fix: строкам

hobbit

firkax ★★★★★
()

Хорошая замена кривому fail2ban-у.

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

а вот какой-нибудь гитхаб/гитлаб/git.org.ru вместо tgz по FTP действительно не помешал бы…

На http не помешало бы, а гитхаб и ему подобные не нужны.

firkax ★★★★★
()

Deannoing — демон/фильтр мониторинга лог-файла

Звучит как journalctl.

Odalist ★★★★★
()

Как приятно видеть аккуратный код на C!

GFORGX ★★★
()

Интересное начинание. Нужно будет присмотреться к нему, как время будет. То, что на C написали — очень хорошо.

lucentcode ★★★★★
()

Почему бы не выложить на GitHub/GitLab/любой другой хостинг Git для ознакомления?

emorozov
()
Ответ на: комментарий от skyman

Что такое парные команды в этом контексте?

Вторая команда запускается после ожидания, например, закрыть доступ только на время.

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

А есть хотя бы в планах публикация результатов тестирования с красивыми графиками?
Сколько гигабитов нагрузочного трафика тянет и сколько килобайт памяти при этом потребляет?
Все тут говорят про плохой, плохой fail2ban, вот можно было бы его в качестве красной линии добавить на графики при тестировании

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

Сколько гигабитов нагрузочного трафика тянет

Вы о чём вообще, никакого трафика тут как и в fail2ban никуда не тянет.

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

С какой скоростью можно добавлять записи в лог, чтобы эта программа продолжала нормально работать?

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

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

Задача по защите от ddos логами

Лично у меня 2 года назад была задача не связанная с DDOS, но упёршаяся в производительность анализатора логов. Поэтому спрашиваю. Мы пользовались metricbeat-ом (написанным на Go), и в итоге он грузил процессор сильнее, чем проверяемые программы :)

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

и в итоге он грузил процессор сильнее, чем проверяемые программы :)

Это у меня вряд ли возможно, так как если логер программ в один файл - одна нить, то скорее всего производительность примерно будет не хуже. Я вот при тестировании столкнулся с тем, что iptables без -w не успевает отработать на ядерном локе управления таблицей фильтра и плакалась об этом.

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