Cкрипт поиска незаблокированных URL (отчет в стиле SARG)

Обсуждение распределенного бан-листа
Ответить
Rus
Сообщения: 112
Зарегистрирован: Пт ноя 18, 2005 13:44

Cкрипт поиска незаблокированных URL (отчет в стиле SARG)

Сообщение Rus »

После тестирования скрипта который выложил asket. Пришлось немного его оптимизировать. Теперь поиск по ключевым словам в файле лога походит один раз да и вид стал нагляднее, чтоб можно было показать руководству.
У меня раз в неделю идет ротация логов. За пошедшую неделю логи со всех проксей (у меня их много) складируются на отдельную машину и там анализируются.
Собственно скрипт в каталоге отчета Sarg добавляет два файла porno.html и banner.html если кто знает об их существовании тот наберет ручками. Можно конечно подправить скрипт и модифицировать index.html сгенерированный sarg-ем (добавить две ссылки).


Собственно сам скрипт:
#!/bin/bash
sarg_conf_dir="/usr/local/sarg"
sarg_out_dir=$2;
key_word_porno="sex|porn|xxx|teens|slut|berkova|girls|erotic|pussy|bdsm|intim|adult|nude"
key_word_banner="adv|banner"
tmp_dir="/tmp"
squid_log=$1
main_dir="/usr/local/logs/conf"
charset ="Windows-1251"

###############################################################
####################### PORNO ################################
echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"'> ... porno.html
echo '<html><head><meta http-equiv="Content-Type" content="text/html; charset='$ charset '"></head><style>'>>$sarg_out_dir/porno.html
cat $sarg_conf_dir/css.tpl >> $sarg_out_dir/porno.html
echo '</style><body class="body"><center><table cellpadding="0" cellspacing="0">'>> $sarg_out_dir/porno.html
echo '<tr><th align="center" class="title">Squid User Access Report</th></tr>'>> $sarg_out_dir/porno.html
echo '<tr><td class="header3">PORNO links</td></tr></table></center>'>> $sarg_out_dir/porno.html
echo '<br><br><center><table cellpadding="1" cellspacing="2">'>> $sarg_out_dir/porno.html
echo '<tr><th class="header">Domain</th><th class="header" >User</th><th class="header">Download bad links</th></tr>'>> $sarg_out_dir/porno.html
##########
egrep "($key_word_porno)" $squid_log |egrep -v "(HIT|NONE|DIRECT/172.17.35.3)" >$tmp_dir/porno-links-tmp
rm $tmp_dir/tmp 2> /dev/null
test -f $main_dir/allow-ip &&for i in `cat $main_dir/allow-ip`; do `egrep -v "($i)" $tmp_dir/porno-links-tmp >> $tmp_dir/tmp`; done&& mv -f $tmp_dir/tmp $tmp_dir/porno-links-tmp
rm $tmp_dir/tmp 2> /dev/null
test -f $main_dir/old-porno-url && for i in `cat $main_dir/old-porno-url`; do `egrep -v "($i)" $tmp_dir/porno-links-tmp >>$tmp_dir/tmp`; done&&mv -f $tmp_dir/tmp $tmp_dir/porno-links-tmp
awk -Fhttp:\/\/ '{print $2}' $tmp_dir/porno-links-tmp|awk -F\/ '{print $1}'|awk -F: '{print $1}'|sort -u >$tmp_dir/new-porno-sites-tmp
grep -v "www\." $tmp_dir/new-porno-sites-tmp >$tmp_dir/tmp
awk -Fwww. '{print $2}' $tmp_dir/new-porno-sites-tmp >>$tmp_dir/tmp
sort -u $tmp_dir/tmp >$tmp_dir/new-porno-sites
for i in `cat $tmp_dir/new-porno-sites`;
do
echo '<tr><td class="data2"><a href="http://'$i'" target=_blank >'$i'</a></td>' >> $sarg_out_dir/porno.html
ip_user=(`cat $tmp_dir/porno-links-tmp | egrep "($i)" |awk '{print $3}'| sort -u`);
echo '<td class="data2">'>> $sarg_out_dir/porno.html
for (( k=0; k<${#ip_user[@]}; k++ )) do
echo ${ip_user[k]}'<br>' >> $sarg_out_dir/porno.html;
done
echo '</td>' >> $sarg_out_dir/porno.html;
bad_links=(`cat $tmp_dir/porno-links-tmp | egrep "($i)" |awk '{print $7}'| sort -u`);
echo '<td class="data2" align="left">'>> $sarg_out_dir/porno.html
for (( k=0; k<${#bad_links[@]}; k++ )) do
echo '<a href="'${bad_links[k]}'" target=_blank >'${bad_links[k]}'</a><br>' >> $sarg_out_dir/porno.html;
done
echo '</tr>' >> $sarg_out_dir/porno.html;
done
echo '</table></center></body></html>'>> $sarg_out_dir/porno.html
cat $tmp_dir/new-porno-sites >> $main_dir/old-porno-url


###############################################################
####################### BANNER ###############################

echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"'> ... anner.html
echo '<html><head><meta http-equiv="Content-Type" content="text/html; charset='$ charset '"></head><style>'>>$sarg_out_dir/banner.html
cat $sarg_conf_dir/css.tpl >> $sarg_out_dir/banner.html
echo '</style><body class="body"><center><table cellpadding="0" cellspacing="0">'>> $sarg_out_dir/banner.html
echo '<tr><th align="center" class="title">Squid User Access Report</th></tr>'>> $sarg_out_dir/banner.html
echo '<tr><td class="header3">BANNERs links</td></tr></table></center>'>> $sarg_out_dir/banner.html
echo '<br><br><center><table cellpadding="1" cellspacing="2">'>> $sarg_out_dir/banner.html
echo '<tr><th class="header">Domain</th><th class="header" >User</th><th class="header">Download bad links</th></tr>'>> $sarg_out_dir/banner.html
##########
egrep "($key_word_banner)" $squid_log |egrep -v "(HIT|NONE|DIRECT/172.17.35.3)" >$tmp_dir/banner-links-tmp
rm $tmp_dir/tmp 2> /dev/null
test -f $main_dir/allow-ip &&for i in `cat $main_dir/allow-ip`; do `egrep -v "($i)" $tmp_dir/banner-links-tmp >> $tmp_dir/tmp`; done&& mv -f $tmp_dir/tmp $tmp_dir/banner-links-tmp
rm $tmp_dir/tmp 2> /dev/null
test -f $main_dir/old-banner-url && for i in `cat $main_dir/old-banner-url`; do `egrep -v "($i)" $tmp_dir/banner-links-tmp >>$tmp_dir/tmp`; done&&mv -f $tmp_dir/tmp $tmp_dir/banner-links-tmp
awk -Fhttp:\/\/ '{print $2}' $tmp_dir/banner-links-tmp|awk -F\/ '{print $1}'|awk -F: '{print $1}'|sort -u >$tmp_dir/new-banner-sites-tmp
grep -v "www\." $tmp_dir/new-banner-sites-tmp >$tmp_dir/tmp
awk -Fwww. '{print $2}' $tmp_dir/new-banner-sites-tmp >>$tmp_dir/tmp
sort -u $tmp_dir/tmp >$tmp_dir/new-banner-sites
for i in `cat $tmp_dir/new-banner-sites`;
do
echo '<tr><td class="data2"><a href="http://'$i'" target=_blank >'$i'</a></td>' >> $sarg_out_dir/banner.html
ip_user=(`cat $tmp_dir/banner-links-tmp | egrep "($i)" |awk '{print $3}'| sort -u`);
echo '<td class="data2">'>> $sarg_out_dir/banner.html
for (( k=0; k<${#ip_user[@]}; k++ )) do
echo ${ip_user[k]}'<br>' >> $sarg_out_dir/banner.html;
done
echo '</td>' >> $sarg_out_dir/banner.html;
bad_links=(`cat $tmp_dir/banner-links-tmp | egrep "($i)" |awk '{print $7}'| sort -u`);
echo '<td class="data2" align="left">'>> $sarg_out_dir/banner.html
for (( k=0; k<${#bad_links[@]}; k++ )) do
echo '<a href="'${bad_links[k]}'" target=_blank >'${bad_links[k]}'</a><br>' >> $sarg_out_dir/banner.html;
done
echo '</tr>' >> $sarg_out_dir/banner.html;
done
echo '</table></center></body></html>'>> $sarg_out_dir/banner.html

cat $tmp_dir/new-banner-sites >> $main_dir/old-banner-url


Комментарии к самому скрипту:

sarg_conf_dir = из этой директории берется стиль оформления отчета
sarg_out_dir = директория отчета Sarg за период
main_dir = каталог данного скрипта.
charset = кодировка отчета Sarg
DIRECT/172.17.35.3 - необходимо заменить на IP куда режик перенаправляет, чтоб скрипт не обращал внимания на эти строки.
allow-ip адреса пользователей, исключаемых из контроля.
old-*****-url - список проверенных "плохих" URL (если проанализированный лог подставить еще раз отчет будет пустой, для тестирования предлагаю последнюю строчку в разделе PORNO и BANNER закомментировать)

Комментарии по использованию скрипта:
в качестве первого параметра скрипту передается файл лога сквида, а второй параметр - директория с уже готовым отчетом Sarg того же лога.
Пример:
rus.sh /usr/local/squid/var/logs/access.log /usr/local/www/sarg/23Jan2006-29Jan2006

P.S. У меня есть скрипт который заменяет в отчете sarg ip пользователей на ФИО + подразделение. Если кому надо поделюсь.

P.P.S.
Предложение к Славе:
этот скрипт можно еще усовершенствовать следующим образом:
Возле каждого выявленного правила добавить checkbox и внизу окна добавить кнопку отсылки выявленных URL (можно и с проверочными адресами) в DBL. После отсылки пользователю предлагается ввести пароль DBL для подтверждения действий.
Последний раз редактировалось Rus Ср фев 15, 2006 0:27, всего редактировалось 1 раз.

asket
Сообщения: 40
Зарегистрирован: Вт янв 24, 2006 19:32
Откуда: Москва

Сообщение asket »

Наверное, не получится сделать нечто универсальное.
Разные у всех ситуации. Мне, например, не нужна интеграция с sarg. Отчетности по работе в инете с меня не требуют, за исключением тех случаев, когда дневной трафик станет аномально большим (свыше 20-30 Гб), - тогда разбираются, ну или когда есть отдельный заказ на кого-то, а так - какая там отчетность при количестве пользователей свыше 500 челов, ничего кроме объема за день/за месяц регулярно просмотреть невозможно, объемы слишком велики. Трафик считается на циске. Логи сквида хранятся некоторое время - вдруг потребуются. Вот и всё.
Борьба же с порнухой нужна для другого. Новые порно-баны используются на отдельном "детском прокси", за которые платится клиентами отдельная плата. Только режика там уже недостаточно, поэтому используется более сложная проверка - по урлам, доменам, контенту (dansguardian). Получается, что 500 взрослых ищут баны, которые я использую для детей. взрослые опытнее, они лучше умеют найти ЭТО, т.е. взрослые косвенно помогают детям. Я лишь обрабатываю результаты их поиска.
Мне вполне достаточно списка новых банов, ничего более.
Посмотрел статистику - за то время как я написал о сложностях ввода по одному бану за раз, у меня поймалось уже 1200-1250 новых банов.
Жаль, что не могу этим добром поделиться. Кто-то искал, старался, а передать это другим пока сложно.

Мне кажется, не стоит затачивать работу DBL, под что-то конкретное.
И то, что предложил я - разрешить вводить более одного правила за раз для порно банов, - это рациональное улучшение, оно поможет всем у кого списки порождаются так или иначе автоматизированно, независимо от способа их получения.

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

Не въехал, а где в sarg-скрипте элементы ручной проверки? Типа - годен/не годен. Как без них? Список должен формироваться так, чтобы сомнительные урлы-домены попадали в него только после проверки. Или я что не понял?

Slava
Site Admin
Сообщения: 2251
Зарегистрирован: Пт апр 02, 2004 12:34
Контактная информация:

Сообщение Slava »

К сожалению, я пока не нашел способа дать возможность ввода списков (не по одному правилу) и сохранить при этом актуальность базы. Есть пара идей, но реализация потребует коренной переделки dbl. Планирую сделать. Когда - пока не знаю. Решил для себя дописать сначала четвертый режик, а потом браться за переделку DBL. А то как-то плохо получается, делать все сразу.. Точнее не получается..

Пока же, в качестве временного решения, могу предложить следующее: присылайте мне Ваши листы, которые надо добавить в DBL (с указанием группы и Вашего логина в DBL) по почте. Добавлю от Вашего имени в базу.

asket
Сообщения: 40
Зарегистрирован: Вт янв 24, 2006 19:32
Откуда: Москва

Сообщение asket »

Повторюсь, что и когда делать - решать только автору. Это правильно и это нормально со всех точек зрения.

А идея с отправкой списков меня устраивает. Просто жаль, что этим "добром" пользуюсь я один. И это гораздо проще, чем вводить по одному бану.
Наверное, часто этого делать не стоит, раз в 1-2 недели будет в самый раз.
Первый раз будет большой список, потом поубавится. И еще одна оговорка, - возможны повторения, т.е. в присылаемых списках могут быть уже забаненые ранее сайты (мной же), но этого будет мало.

Rus
Сообщения: 112
Зарегистрирован: Пт ноя 18, 2005 13:44

Сообщение Rus »

asket писал(а):Не въехал, а где в sarg-скрипте элементы ручной проверки? Типа - годен/не годен. Как без них? Список должен формироваться так, чтобы сомнительные урлы-домены попадали в него только после проверки. Или я что не понял?
В отчете выдается таблица: (домен) (ip пользователей) (спиок "плохих" URL с домена)
Проверка пока ориентирована на существующий "ручной" способ пополнеия DBL. Можно легко добавить отсылку выбранных доменов на e-mail Славы. :D Вопрос в протоколе взаимодействия!

Ответить