Анализ логов
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
- xaker1
- сержант
- Сообщения: 204
- Зарегистрирован: 2010-03-10 21:26:33
Анализ логов
Здравствуйте в очередной раз.
Нужен анализатор логов nginx (либо apache), который в выдаст табличку, в которой будет информация о том, какой ip сколько запросов совершил за некоторое время, либо к какому сайту сколько раз обращались за последнее время. Причем желательно что бы эта табличка автоматически обновлялась, ну и естественно консольная работа.
Есть ли такое? Заранее благодарю.
Нужен анализатор логов nginx (либо apache), который в выдаст табличку, в которой будет информация о том, какой ip сколько запросов совершил за некоторое время, либо к какому сайту сколько раз обращались за последнее время. Причем желательно что бы эта табличка автоматически обновлялась, ну и естественно консольная работа.
Есть ли такое? Заранее благодарю.
Услуги хостинговой компании Host-Food.ru
Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
- FreeBSP
- майор
- Сообщения: 2020
- Зарегистрирован: 2009-05-24 20:20:19
- Откуда: Москва
Re: Анализ логов
awstat ???
плюс полно аналогов
плюс полно аналогов
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!
- xaker1
- сержант
- Сообщения: 204
- Зарегистрирован: 2010-03-10 21:26:33
Re: Анализ логов
Насколько знаю, awstat и аналоги раз в какой-то период формируют отчеты в html. Мне же нужена статистика в реальном времени (т.е. пришел пользователь - тут же счетчик увеличился) через шел.
- Alex Keda
- стреляли...
- Сообщения: 35465
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: Анализ логов
Код: Выделить всё
man tail
===========
на шелле парсер напишите...
====
а лучше задачу объясните, исходную. может быть вам и не нужно такой программы
Убей их всех! Бог потом рассортирует...
- xaker1
- сержант
- Сообщения: 204
- Зарегистрирован: 2010-03-10 21:26:33
Re: Анализ логов
Хочется табличку в шеле вида
ip|общее_кол-во_запросов_за_последнее_n_минут и domen|общее_кол-во_запросов_на_домен
Причем не конкретный домен либо ip, а все появляющиеся в логе. С сортировкой по кол-ву запросов.
tail не подойдет)
ip|общее_кол-во_запросов_за_последнее_n_минут и domen|общее_кол-во_запросов_на_домен
Причем не конкретный домен либо ip, а все появляющиеся в логе. С сортировкой по кол-ву запросов.
tail не подойдет)
- Alex Keda
- стреляли...
- Сообщения: 35465
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: Анализ логов
ну а причина-то какая, или просто абстрактно хочетсяч и всё? так редко бывает
Убей их всех! Бог потом рассортирует...
- xaker1
- сержант
- Сообщения: 204
- Зарегистрирован: 2010-03-10 21:26:33
Re: Анализ логов
Для более эффективной борьбы с DDOS. Что бы можно было увидеть "слишком назойливые" ip, ну и потом определить легитимные или нет запросы. Ну и доменами тоже.
- Alex Keda
- стреляли...
- Сообщения: 35465
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: Анализ логов
ну, если прям так сильно надо - могу вывалить своё поделие.
но вот тока с условием - минимум вопросов, максимум разбираться самому.
реально тяжёлый скрипт...
но вот тока с условием - минимум вопросов, максимум разбираться самому.
реально тяжёлый скрипт...
Убей их всех! Бог потом рассортирует...
- xaker1
- сержант
- Сообщения: 204
- Зарегистрирован: 2010-03-10 21:26:33
Re: Анализ логов
Согласен)
- Alex Keda
- стреляли...
- Сообщения: 35465
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: Анализ логов
сам напросился )
раз в 2 минуты запуск. это важно.
раз в 2 минуты запуск. это важно.
Код: Выделить всё
srv0$ cat /root/scripts/work/ddos.detect.sh
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
# блокировочный файл
test -f /tmp/run.ddos.detect.lock && pgrep -F /tmp/run.ddos.detect.lock >/dev/null && exit
echo $$ > /tmp/run.ddos.detect.lock
# тип обработки по умолчанию similar|pages
type="similar"
# сколько страниц в минуту для смены типа обработки
type_limit="1000"
# Сколько запросов считается DDoS (за минуту)
ddos_limit="60"
# host limit (banned per iteraion)
host_limit="40"
# c какого числа запросов в минуту начинается анализ
ddos_begin="`ls /home | wc -l`"
if [ $ddos_begin -ge 400 ]
then
# если больше 400 - то приравниваем к 400
ddos_begin=400
fi
###############################################
# сообщение для отправки на мыло
msg_out="/tmp/$$.msg"
# файл с укзанием владельца и сайта что залочены в результате DDoS
ddos_lock_file="/root/scripts/db/DDoSes.site.txt"
# table
table="/root/scripts/db/table.80.txt"
# файл логов
log_file="/tmp/ddos.banned.`date +%Y-%m-%d`.log"
# start time
start_time="`date +%Y-%m-%d` in `date +%H:%M:%S`"
# date part for grep (format is [16/Jun/2010:17:12:20 +0400])
datepart="/`date -v-1M +%Y:%H:%M:`"
datepart1="/`date +%Y:%H:%M:`"
# временный файл
tmp_file="/tmp/$$.$$"
# файл забаненых на этом цикле работы
old_banned0="/tmp/ddos.old.0.txt"
# файл забаненых из предыдущего цикла работы
old_banned1="/tmp/ddos.old.1.txt"
# файл забаненых из пред-предыдущего цикла работы
old_banned2="/tmp/ddos.old.2.txt"
# файл шаблонов сетей исклюений
patterns_file="$tmp_file.lans"
# файл с масками сетей и адресов исключений. требует подготовки - уборка пустых строк и т.п.
exclude_patterns="/root/scripts/db.all/white.IP.address.list.txt"
# файл с сайтами-исключениями
ddos_exclude_sites="/root/scripts/db/ddos.exclude.sites.txt"
# calculate load averrage
la_full="`sysctl vm.loadavg | awk '{print $3}' | tr ',' '.'`"
la="`echo $la_full | awk -F '.' '{print $1}'`"
# число процов
num_cpu="`sysctl -n hw.ncpu`"
# create message file
echo -n > $msg_out
# prepare exclude file
grep -v ^\$ $exclude_patterns | grep -v ^# > $patterns_file
if test -f $ddos_exclude_sites
then
part="grep -v -x -f $ddos_exclude_sites"
else
part="cat"
fi
# grep requests for work
#tail -20000 /var/log/nginx-access.log | $part | grep $datepart | grep -v "www.test-hf.ru" | grep -v -f $patterns_file > $tmp_file.log
# 'grep -v -f $patterns_file' - вынесено вниз, в точку бана IP адресов, иначе
# были проблемы при ДДоСе IP адреса сервера. совсем это не снимает проблему,
# но, хотя бы такие запросы банятся
tail -20000 /var/log/nginx-access.log | $part | grep $datepart | grep -v "www.test-hf.ru" > $tmp_file.log
log_lines="`wc -l $tmp_file.log | awk '{print $1}'`"
#echo "handled by nginx: $log_lines request per minute" >> $msg_out
if test -f $ddos_lock_file
then
# надо делать обработку
else
# если есть залоченные за предыдущий цикл - надо обрабатывать
if test -s $old_banned0
then
# надо обрабатывать
else
# можно и остановиться
if [ $log_lines -lt $ddos_begin ]
then
rm -f /tmp/run.ddos.detect.lock
# удаляем временные файлы
rm -f $patterns_file
rm -f $tmp_file
rm -f $tmp_file.log
rm -f $old_banned2.$$
rm -f $msg_out
exit;
fi
# дополнительно оцениваем LA
if [ $la = 0 ]
then
rm -f /tmp/run.ddos.detect.lock
# удаляем временные файлы
rm -f $patterns_file
rm -f $tmp_file
rm -f $tmp_file.log
rm -f $old_banned2.$$
rm -f $msg_out
exit;
fi
fi
fi
# create firewall table file
touch $table
# разгребаемся со старыми файлами зобаненых
touch $old_banned0
touch $old_banned1
touch $old_banned2
# ротация файлов
mv $old_banned2 $old_banned2.$$
mv $old_banned1 $old_banned2
mv $old_banned0 $old_banned1
touch $old_banned0
# исключаем из файрволла тех кто есть в файле $old_banned1 (забанен на предыдущем заходе)
grep -v -x -f $old_banned1 $table > $tmp_file && mv $tmp_file $table
for ip in `cat $old_banned1`
do
ipfw table 80 delete $ip >/dev/null 2>&1
#echo unbanned previous banned $ip >> $msg_out
done
# get site with maximum num requests
cat $tmp_file.log | awk '{print $3}' | sort | uniq -c | sort | tail -1 |
{
while read max_count max_site
do
# достаём владельца сайта - его может и не быть
if grep ^$max_site: /root/scripts/db/domain.owners.txt >/dev/null 2>&1
then
owner="`grep ^$max_site: /root/scripts/db/domain.owners.txt | head -1 | awk -F ':' '{print $3}'`"
else
owner="non-existent-user"
fi
# считаем процент страниц этого сайта от общего числа
tmp_var="`expr $max_count \* 100`"
percent="`expr $tmp_var / $log_lines`"
# если % больше 95 - понижаем порог (при сильно распределённом
# DDoS - запросов много, но сами сайты не успевают по многу страниц запрашивать)
# вариант что ддосят несколько сайтов - снижаем порог до 50% если LA > 10
if [ $la -ge 10 ]
then
lock_limit_percent="50"
echo "high LA detected ($la) -> change lock percent to 50%" >> $msg_out
else
lock_limit_percent="95"
fi
if [ $percent -ge $lock_limit_percent ]
then
ddos_limit="`expr $ddos_limit / 3`"
host_limit="`expr $host_limit \* 10`"
#echo "handled by nginx $log_lines requests per minute" >> $msg_out
echo "big DDoS detected -> changed limits to ddos_limit=$ddos_limit; host_limit=$host_limit" >> $msg_out
# если число запрошенных за минуту страниц больше 5k - лочим сайт
if [ $log_lines -ge 5000 ]
then
# лочим только если существует владелец
if [ $owner != "non-existetnt-user" ]
then
# проверяем, не залочен ли уже
if grep ^$max_site $ddos_lock_file >/dev/null 2>&1
then
# уже залочен
echo "'$max_site' with owner '$owner' already locked" >> $msg_out
else
echo "Locked site '$max_site'" >> $msg_out
# вообще, по уму, надо бы разобраться - с www или без сайт... и открутить www
fetch -T 10 -o - "https://`hostname`/manager/ispmgr?domain=$max_site&name=%2F&code=seeother&url=http%3A%2F%2Fwww.test-hf.ru%2Fddos%2F&func=wwwredirect.edit&sok=ok&out=xml&su=$owner" >/dev/null 2>&1 && \
sleep 1 && \
echo $max_site $owner > $ddos_lock_file
/usr/local/etc/rc.d/apache22 restart >/dev/null 2>&1 &
# добавлено 2010-11-11 in 16:55 MSK
if test -f /var/db/resusage/users_limits/$owner
then
# load user variables
. /var/db/resusage/users_limits/$owner
echo "Your account '$owner' on server '$ServerName' is locked, because it is undergo DDoS attack. After its completion it will be unlocked" | mail -s "Your account '$owner' on server '$ServerName' is locked" $UserEmail
fi
fi
fi
fi
else
# смотрим процент страниц. если он меньше 70% - снимаем блокировку
if [ $percent -le 70 ]
then
# если файл существует - надо разлочить
if test -f $ddos_lock_file
then
locked_site="`cat /root/scripts/db/DDoSes.site.txt | awk '{print $1}'`"
locked_owner="`cat /root/scripts/db/DDoSes.site.txt | awk '{print $2}'`"
fetch -T 5 -o - "https://`hostname`/manager/ispmgr?func=wwwredirect.delete&elid=$locked_site%2F&sok=ok&out=xml&su=$locked_owner" >/dev/null 2>&1
sleep 1
/usr/local/etc/rc.d/apache22 restart >/dev/null 2>&1 &
rm -f /root/scripts/db/DDoSes.site.txt
echo "Unlocked site '$max_site'" >> $msg_out
fi
fi
fi
# если число запрошенных за минуту страниц больше $type_limit - меняем тип обработки с похожих
# страниц на общее число страниц сайта
if [ $log_lines -ge $type_limit ]
then
type="pages"
echo "num requests > $type_limit; changed handling type to '$type'" >> $msg_out
fi
# дополнительно снижаем лимиты в случае > 5k запрсов
if [ $log_lines -ge 5000 ]
then
ddos_limit="`expr $ddos_limit / 3`"
host_limit="`expr $host_limit \* 5`"
echo "big DDoS detected -> changed limits to ddos_limit=$ddos_limit; host_limit=$host_limit" >> $msg_out
fi
# дополнительно снижаем лимиты в случае > 10k запрсов
if [ $log_lines -ge 10000 ]
then
ddos_limit="`expr $ddos_limit / 3`"
host_limit="`expr $host_limit \* 5`"
echo "big DDoS detected -> changed limits to ddos_limit=$ddos_limit; host_limit=$host_limit" >> $msg_out
fi
# в зависимости от типа обработки строим разные хэши
if [ $type = "pages" ]
then
handler='$1'
else
handler='$1" "$3" "$7" "$12'
fi
# выбираем из лога все записи для этого сайта, строим уникальные хэши по ip/сайт/запрос/юзер-агент
grep $max_site $tmp_file.log | awk "{print $handler}" | sort | uniq -c | sort | \
grep -v -f $patterns_file | tail -$host_limit |
{
while read count ip site request useragent
do
# если этот хэш сделал больше запросов чем лимит, то его баним
if [ $count -ge $ddos_limit ]
then
# add to ipfw table file
echo $ip >> $table
# добавляем в таблицу файрволла
ipfw table 80 add $ip >/dev/null 2>&1
# если IP нету в файле позапрошлого захода, то вносим
# его в файл для разбанивания на следующем цикле
if grep -x $ip $old_banned2 >/dev/null 2>&1
then
# nothing
else
echo $ip >> $old_banned0
fi
# write to counter
echo $count $ip $site $request $useragent >> $tmp_file.counter.txt
# add to log file
echo $start_time $site $count $ip >> $log_file
# echo to out
#echo "banned $ip: requested $count similar pages with limit $ddos_limit/minute for site $site" >> $msg_out
fi
done
}
# echo to out
if test -f $tmp_file.counter.txt
then
# сколько зарефьюжено коннектов
datepart2="`date -v-1M +%H:%M:`"
refused=`grep $datepart2 /var/log/httpd-error.log | grep MaxClientsVhost | grep $max_site | wc -l`
# были баны
echo "DDoS begin with: $ddos_begin requests/minute" >> $msg_out
echo "handled by nginx: $log_lines requests/minute" >> $msg_out
echo "banned `wc -l $tmp_file.counter.txt | awk '{print $1}'` numbers IP, with limit $ddos_limit/minute, for site 'http://$max_site/' (owner: $owner)" >> $msg_out
echo "total banned: `ipfw table 80 list | wc -l` IP addresses" >> $msg_out
echo "LA: $la_full" >> $msg_out
echo "MaxClientsVhost refused: $refused" >> $msg_out
fi
rm -f $tmp_file.counter.txt
rm -f $tmp_file.site.txt
done
}
# rebuilding table
grep -v -x -f /root/scripts/db/local_interfaces.txt $table | grep -v -x -f $patterns_file | \
sort | uniq > $tmp_file && mv $tmp_file $table
# set permission
if test -f $log_file
then
chmod 640 $log_file
fi
# шлём сообщение почтой - если были забанены адреса
if test -s $old_banned0
then
subj="DDoS detected on [`hostname`]"
. /root/scripts/work/parts/send.email.2.all.personal.sh
fi
# clear $old_banned0 if LA > num.cpu
if [ $la -gt $num_cpu ] # may be -ge if it have hyperthreading
then
echo -n > $old_banned0
fi
# если запросов много - очищаем файл забаненых
if [ $log_lines -gt 2000 ]
then
echo -n > $old_banned0
fi
#cat $msg_out
# удаляем временные файлы
rm -f $patterns_file
rm -f $tmp_file
rm -f $tmp_file.log
rm -f $old_banned2.$$
rm -f $msg_out
# удаляем блокировочный файл
rm -f /tmp/run.ddos.detect.lock
# post-execution
num_connections="`netstat -na | grep FIN_WAIT_2 | wc -l`"
if [ $num_connections -ge 4000 ]
then
sysctl net.inet.ip.fw.dyn_keepalive=0 >/dev/null
else
sysctl net.inet.ip.fw.dyn_keepalive=1 >/dev/null
fi
Убей их всех! Бог потом рассортирует...
- FreeBSP
- майор
- Сообщения: 2020
- Зарегистрирован: 2009-05-24 20:20:19
- Откуда: Москва
Re: Анализ логов
хмм
а апач умеет в сислог писать? если да, то можно загнать лог в трубу к tee и потом обрабатывать на лету
или может сам апач умеет в трубу писать
потопал гуглить
http://httpd.apache.org/docs/current/logs.html#piped
PS скрипт не читал
а апач умеет в сислог писать? если да, то можно загнать лог в трубу к tee и потом обрабатывать на лету
или может сам апач умеет в трубу писать
потопал гуглить
http://httpd.apache.org/docs/current/logs.html#piped
PS скрипт не читал
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!
- Alex Keda
- стреляли...
- Сообщения: 35465
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: Анализ логов
дык как раз вопрос в том чтобы обрабатывать
Убей их всех! Бог потом рассортирует...
-
- капитан
- Сообщения: 1820
- Зарегистрирован: 2010-12-25 20:41:50
- Откуда: Хлебная столица
Re: Анализ логов
Какой анализатор логов выбрать? Когда-то на шареде пробовал Webalizer, не впечатлило. LI даёт более востребованную информацию. Но, согласитесь, нелепость, иметь свой сервер и пользоваться аналитиксами/метриками.
- Alex Keda
- стреляли...
- Сообщения: 35465
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: Анализ логов
вы тему не спутали?Bayerische писал(а):Какой анализатор логов выбрать? Когда-то на шареде пробовал Webalizer, не впечатлило. LI даёт более востребованную информацию. Но, согласитесь, нелепость, иметь свой сервер и пользоваться аналитиксами/метриками.
тот иной анализ обсуждается.
да и вообще, принято свою заводить а не в чужие лезть
Убей их всех! Бог потом рассортирует...
-
- капитан
- Сообщения: 1820
- Зарегистрирован: 2010-12-25 20:41:50
- Откуда: Хлебная столица
Re: Анализ логов
Хм... Анализатор логов Апача интересует, именно он. Мне нравится то, что Апач может выдать в логи — кто, когда, откуда, на чём, под чем и даже, зачем. Хотелось бы фронт энд, чтобы можно было смотреть не напрягаясь, в наглядном виде с графиками, сортировкой.вы тему не спутали?
тот иной анализ обсуждается.
- Alex Keda
- стреляли...
- Сообщения: 35465
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: Анализ логов
ну так заведите себе тему и обсуждайте в ней.Bayerische писал(а):Хм... Анализатор логов Апача интересует, именно он. Мне нравится то, что Апач может выдать в логи — кто, когда, откуда, на чём, под чем и даже, зачем. Хотелось бы фронт энд, чтобы можно было смотреть не напрягаясь, в наглядном виде с графиками, сортировкой.вы тему не спутали?
тот иной анализ обсуждается.
зачем в чужие лезть, да ещё и с проблемами которые не по теме вообще?
Убей их всех! Бог потом рассортирует...