Анализ логов

Проблемы с установкой, настройкой и работой системных и сетевых программ.

Модераторы: GRooVE, alexco

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

Анализ логов

Непрочитанное сообщение xaker1 » 2011-03-27 20:27:55

Здравствуйте в очередной раз.
Нужен анализатор логов nginx (либо apache), который в выдаст табличку, в которой будет информация о том, какой ip сколько запросов совершил за некоторое время, либо к какому сайту сколько раз обращались за последнее время. Причем желательно что бы эта табличка автоматически обновлялась, ну и естественно консольная работа.

Есть ли такое? Заранее благодарю.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.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/

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Анализ логов

Непрочитанное сообщение FreeBSP » 2011-03-28 1:52:31

awstat ???
плюс полно аналогов
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

Re: Анализ логов

Непрочитанное сообщение xaker1 » 2011-03-28 12:43:42

Насколько знаю, awstat и аналоги раз в какой-то период формируют отчеты в html. Мне же нужена статистика в реальном времени (т.е. пришел пользователь - тут же счетчик увеличился) через шел.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Анализ логов

Непрочитанное сообщение Alex Keda » 2011-03-28 14:01:14

Код: Выделить всё

man tail
=))
===========
на шелле парсер напишите...
====
а лучше задачу объясните, исходную. может быть вам и не нужно такой программы
Убей их всех! Бог потом рассортирует...

Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

Re: Анализ логов

Непрочитанное сообщение xaker1 » 2011-03-28 14:14:48

Хочется табличку в шеле вида
ip|общее_кол-во_запросов_за_последнее_n_минут и domen|общее_кол-во_запросов_на_домен
Причем не конкретный домен либо ip, а все появляющиеся в логе. С сортировкой по кол-ву запросов.
tail не подойдет)

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Анализ логов

Непрочитанное сообщение Alex Keda » 2011-03-28 14:19:43

ну а причина-то какая, или просто абстрактно хочетсяч и всё? так редко бывает
Убей их всех! Бог потом рассортирует...

Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

Re: Анализ логов

Непрочитанное сообщение xaker1 » 2011-03-28 14:22:29

Для более эффективной борьбы с DDOS. Что бы можно было увидеть "слишком назойливые" ip, ну и потом определить легитимные или нет запросы. Ну и доменами тоже.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Анализ логов

Непрочитанное сообщение Alex Keda » 2011-03-28 14:38:37

ну, если прям так сильно надо - могу вывалить своё поделие.
но вот тока с условием - минимум вопросов, максимум разбираться самому.
реально тяжёлый скрипт...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

Re: Анализ логов

Непрочитанное сообщение xaker1 » 2011-03-28 14:41:16

Согласен)

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Анализ логов

Непрочитанное сообщение Alex Keda » 2011-03-28 14:42:34

сам напросился =))
раз в 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: Анализ логов

Непрочитанное сообщение FreeBSP » 2011-03-28 16:15:07

хмм
а апач умеет в сислог писать? если да, то можно загнать лог в трубу к tee и потом обрабатывать на лету
или может сам апач умеет в трубу писать
потопал гуглить :Search:

http://httpd.apache.org/docs/current/logs.html#piped

PS скрипт не читал
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Анализ логов

Непрочитанное сообщение Alex Keda » 2011-03-28 16:20:50

дык как раз вопрос в том чтобы обрабатывать
Убей их всех! Бог потом рассортирует...

Bayerische
капитан
Сообщения: 1820
Зарегистрирован: 2010-12-25 20:41:50
Откуда: Хлебная столица

Re: Анализ логов

Непрочитанное сообщение Bayerische » 2011-04-01 17:57:02

Какой анализатор логов выбрать? Когда-то на шареде пробовал Webalizer, не впечатлило. LI даёт более востребованную информацию. Но, согласитесь, нелепость, иметь свой сервер и пользоваться аналитиксами/метриками.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Анализ логов

Непрочитанное сообщение Alex Keda » 2011-04-01 18:36:00

Bayerische писал(а):Какой анализатор логов выбрать? Когда-то на шареде пробовал Webalizer, не впечатлило. LI даёт более востребованную информацию. Но, согласитесь, нелепость, иметь свой сервер и пользоваться аналитиксами/метриками.
вы тему не спутали?
тот иной анализ обсуждается.

да и вообще, принято свою заводить а не в чужие лезть
Убей их всех! Бог потом рассортирует...

Bayerische
капитан
Сообщения: 1820
Зарегистрирован: 2010-12-25 20:41:50
Откуда: Хлебная столица

Re: Анализ логов

Непрочитанное сообщение Bayerische » 2011-04-01 18:52:29

вы тему не спутали?
тот иной анализ обсуждается.
Хм... Анализатор логов Апача интересует, именно он. Мне нравится то, что Апач может выдать в логи — кто, когда, откуда, на чём, под чем и даже, зачем. Хотелось бы фронт энд, чтобы можно было смотреть не напрягаясь, в наглядном виде с графиками, сортировкой.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Анализ логов

Непрочитанное сообщение Alex Keda » 2011-04-06 13:59:29

Bayerische писал(а):
вы тему не спутали?
тот иной анализ обсуждается.
Хм... Анализатор логов Апача интересует, именно он. Мне нравится то, что Апач может выдать в логи — кто, когда, откуда, на чём, под чем и даже, зачем. Хотелось бы фронт энд, чтобы можно было смотреть не напрягаясь, в наглядном виде с графиками, сортировкой.
ну так заведите себе тему и обсуждайте в ней.
зачем в чужие лезть, да ещё и с проблемами которые не по теме вообще?
Убей их всех! Бог потом рассортирует...