Инструменты пользователя

Инструменты сайта


www:squidguard

SquidGuard - борьба с нарушителями

Вступление

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

Конечно это можно сделать и с помощью самого squid, с помощью acl, но на мой взгляд для этих целей более подходит squidGuard. Принцып работы тот же, т.е. мы создаем acl (Access Control List) списки управления доступом и затем разрешаем/запрещаем определенным классам пользователей те или инные категории.

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

Настройка squidguard

Итак, как всегда, устанавливаем все ПО из портов, squidguard не исключение.

# cd /usr/ports/www/squidguard/
# setenv SQUID_UID squid
# setenv SQUID_GID squid
# make install clean
# rehash

Вместе с squidGuard идет так называемый blacklist, т.е. список запрещенных сайтов, разбитых по категориям. Но я не рекомендовал бы его использовать, так как он довольно таки старый и маленький. Я рекомендую скачать bigblacklist. Хоть занимает он много ~18 МБ, но он того стоит.

# cd /tmp
# tar zxvf bigblacklist.tar.gz
x blacklists/
x blacklists/CATEGORIES
x blacklists/ads/
x blacklists/ads/domains
x blacklists/ads/urls
x blacklists/ads/expressions
x blacklists/adult/
...
...
...
x blacklists/weather/urls
x blacklists/webmail/
x blacklists/webmail/domains
x blacklists/webmail/urls
x blacklists/whitelist/
x blacklists/whitelist/domains
x blacklists/whitelist/urls

После этого, удаляем текущие базы и копируем новые

# rm -fr /var/db/squidGuard/*
# cp -R blacklists/ /var/db/squidGuard/

Если вы все сделали правильно, то у нас должна получиться такая структура папок

# ls -l /var/db/squidGuard/
total 132
-rw-rw----  1 root   wheel  3664 May  9 17:55 CATEGORIES
drw-rw----  2 root   wheel   512 May  9 17:55 ads
drw-rw----  2 root   wheel   512 May  9 17:55 adult
drw-rw----  2 root   wheel   512 May  9 17:55 aggressive
drw-rw----  2 root   wheel   512 May  9 17:55 antispyware
drw-rw----  2 root   wheel   512 May  9 17:55 artnudes
drw-rw----  2 root   wheel   512 May  9 17:55 audio-video
drw-rw----  2 root   wheel   512 May  9 17:55 banking
drw-rw----  2 root   wheel   512 May  9 17:55 beerliquorinfo
drw-rw----  2 root   wheel   512 May  9 17:55 beerliquorsale
drw-rw----  2 root   wheel   512 May  9 17:55 cellphones
drw-rw----  2 root   wheel   512 May  9 17:55 chat
drw-rw----  2 root   wheel   512 May  9 17:55 childcare
drw-rw----  2 root   wheel   512 May  9 17:55 cleaning
drw-rw----  2 root   wheel   512 May  9 17:55 clothing
drw-rw----  2 root   wheel   512 May  9 17:55 culinary
drw-rw----  2 root   wheel   512 May  9 17:55 dating
drw-rw----  2 root   wheel   512 May  9 17:55 dialers
drw-rw----  2 root   wheel   512 May  9 17:55 drugs
drw-rw----  2 root   wheel   512 May  9 17:55 ecommerce
drw-rw----  2 root   wheel   512 May  9 17:55 entertainment
drw-rw----  2 root   wheel   512 May  9 17:55 frencheducation
drw-rw----  2 root   wheel   512 May  9 17:55 gambling
drw-rw----  2 root   wheel   512 May  9 17:55 games
drw-rw----  2 root   wheel   512 May  9 17:55 gardening
drw-rw----  2 root   wheel   512 May  9 17:55 government
drw-rw----  2 root   wheel   512 May  9 17:55 hacking
drw-rw----  2 root   wheel   512 May  9 17:55 homerepair
drw-rw----  2 root   wheel   512 May  9 17:55 hygiene
drw-rw----  2 root   wheel   512 May  9 17:55 instantmessaging
drw-rw----  2 root   wheel   512 May  9 17:55 jewelry
drw-rw----  2 root   wheel   512 May  9 17:55 jobsearch
drw-rw----  2 root   wheel   512 May  9 17:55 kidstimewasting
drw-rw----  2 root   wheel   512 May  9 17:55 mail
drw-rw----  2 root   wheel   512 May  9 17:55 mixed_adult
drw-rw----  2 root   wheel   512 May  9 17:55 mobile-phone
drw-rw----  2 root   wheel   512 May  9 17:55 naturism
drw-rw----  2 root   wheel   512 May  9 17:55 news
drw-rw----  2 root   wheel   512 May  9 17:55 onlineauctions
drw-rw----  2 root   wheel   512 May  9 17:55 onlinegames
drw-rw----  2 root   wheel   512 May  9 17:55 onlinepayment
drw-rw----  2 root   wheel   512 May  9 17:55 personalfinance
drw-rw----  2 root   wheel   512 May  9 17:55 pets
drw-rw----  2 root   wheel   512 May  9 17:55 phishing
drw-rw----  2 root   wheel   512 May  9 17:55 porn
drw-rw----  2 root   wheel   512 May  9 17:55 proxy
drw-rw----  2 root   wheel   512 May  9 17:55 radio
drw-rw----  2 root   wheel   512 May  9 17:55 reaffected
drw-rw----  2 root   wheel   512 May  9 17:55 religion
drw-rw----  2 root   wheel   512 May  9 17:55 ringtones
drw-rw----  2 root   wheel   512 May  9 17:55 searchengines
drw-rw----  2 root   wheel   512 May  9 17:55 sexual_education
drw-rw----  2 root   wheel   512 May  9 17:55 sexuality
drw-rw----  2 root   wheel   512 May  9 17:55 sportnews
drw-rw----  2 root   wheel   512 May  9 17:55 sports
drw-rw----  2 root   wheel   512 May  9 17:55 spyware
drw-rw----  2 root   wheel   512 May  9 17:55 updatesites
drw-rw----  2 root   wheel   512 May  9 17:55 vacation
drw-rw----  2 root   wheel   512 May  9 17:55 violence
drw-rw----  2 root   wheel   512 May  9 17:55 virusinfected
drw-rw----  2 root   wheel   512 May  9 17:55 warez
drw-rw----  2 root   wheel   512 May  9 17:55 weapons
drw-rw----  2 root   wheel   512 May  9 17:55 weather
drw-rw----  2 root   wheel   512 May  9 17:55 webmail
drw-rw----  2 root   wheel   512 May  9 17:55 whitelist

Собственно sports, violence, porn это и есть категории запретов (спорт, насилие, порнография). В файле /var/db/squidGuard/CATEGORIES приводится краткое описание к каждой из категорий.

Теперь нам надо настроить squidGuard, для этого необходимо изменить его конфигурационный файл squidGuard.conf

# cd /usr/local/etc/squid/
# cp squidGuard.conf.sample squidGuard.conf
#
#   /usr/local/etc/squid/squidGuard.conf
#

# Указываем где у нас располагаются наши базы
dbhome /var/db/squidGuard

# Указываем где будет храниться log файл squidGuard
logdir /var/log/

# Описываем классы доступа. Затем мы для каждого из классов
# (admins, clients) создадим свой набор правил доступа.
src admins {
ip  192.168.127.50
ip  192.168.127.100
}

src clients {
ip  192.168.127.10
ip  192.168.127.11
ip  192.168.127.12
ip  192.168.127.13
ip  192.168.127.14
ip  192.168.127.15
}

# В целях увеличения производительности желательно использовать
# диапазон адресов, например ip 192.168.127.10-192.168.127.15

# Далее описываем все категории запретов
dest ads {
domainlist       ads/domains
expressionlist   ads/expressions
urllist          ads/urls
redirect         http://192.168.127.230/block/ads.html
}

dest adult {
domainlist       adult/domains
urllist          adult/urls
redirect         http://192.168.127.230/block/adult.html
}

...
...
...

dest webmail {
domainlist       webmail/domains
urllist          webmail/urls
redirect         http://192.168.127.230/block/webmail.html
}

dest whitelist {
domainlist       whitelist/domains
urllist          whitelist/urls
redirect         http://192.168.127.230/block/whitelist.html
}

# Ну а теперь непосредственно делаем раздачу слонов.
# Клиентам, разрешаем все, кроме запрещенного,
# т.е. после слова pass вы должны указать все категории запрета,
# которые вы описывали с помощью ключевого слова dest.
# знак ! означает отрицание, т.е. если вы написали pass !porn,
# это значит что данные пользователи не смогут просматривать сайты,
# попадающие под категорию porn
acl {
clients  {
            pass !ads !adult ... !porn !warez all
         }

# Себе разрешаем все, кроме баннеров
admins   {
            pass !banner all
         }

# И наконец, задаем правило по умолчанию - всем все запрещаем.
default  {
            pass     none
            redirect http://192.168.127.230/block/default.html
         }
}

Сейчас я напримере опишу принцип построения файла squidGuard.conf, чтобы не приводить все категории запрета, так как их очень много. А принцип построения у них одинаковый.

Итак, в папке /var/db/squidGuard есть папки - ads, adult, porno и т.д. Каждая из этих папок соответствует отдельной категории запрета. В каждой из этих папок может находиться 3 файла:

  • domains - в данном файле содержатся запрещенные домены.
  • expressions - в данном файле содержатся регулярные выражения, которые применяются к запрашиваемому url. Т.е. для борьбы с порнографией вы добавляете сюда, наиболее часто встречаемые слова, например, pornstar, sexdream, showgirl, striptease) и т.д. Если какое-нибудь из этих слов встретится в url, то этот адрес будет заблокирован.
  • urls - из названия понятно, что здесь необходимо указывать запрещенные url, если вам надо заблокировать только определенный адрес, а не весь домен.

Domainlist, Urllist, Expressionlist

DOMAINLIST

Например, если у вас в файле domains есть строка sex.com, то будут блокироваться следующие адреса:

sex.com,
www.sex.com,
whatever.sex.com,
www.what.ever.sex.com

А адреса www.lesbian-sex.com, www.geysex.com уже не будут попадать под это правило.

URLLIST

Например, если у вас в файле urls есть строка sex.com/geys, то будут блокироваться следующие адреса:

http://sex.com/geys
http://sex.com/geys/whatever,
ftp://sex.com/geys/whatever,
ftp://www.sex.com/geys/whatever,
ftp://web.sex.com/geys/whatever,
ftp://www3.sex.com/geys/whatever,

А адреса sex.com/lesbians, sex.com/adult уже не будут попадать под это правило.

EXPRESSIONLIST

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

\.(ra?m|mpe?g?|mov|movie|qt|avi|dif|dvd?|mpv2|mp3|asf)($|\?)

Думаю синтаксис данного файла очевиден, именно благодаря этому списку запросы типа:

попадут под категорию запрета и будут блокированы.

Учитывайте эти особенности при добавлении новых правил. Регулярные выражения и производительность Советую не злоупотреблять регулярными выражениями, особенно при большой нагрузке. Так как они потребляют очень много ресурсов. Производительность зависит от сложности самого регулярного выражения, а так же от производительности библиотеки регулярных выражений, с которой был собран squidGuard.

Каждая категория запрета описывается с помощью ключевого слова dest. И имеет следующий синтаксис

dest имя_категории {
domainlist       путь_к_файлу/имя_файла
expressionlist   путь_к_файлу/имя_файла
urllist          путь_к_файлу/имя_файла
дествие, если адрес попал под данную категорию запрета
}
Все пути в dest задаются относительно директории, указанной в параметре dbhome. Например, если вы указали dbhome /var/db/squidGuard, а в dest указали - domainlist ads/domains, то это значит, что у вас список с запрещенными доменами должен находиться в /var/db/squidGuard/ads, а сам файл должен называться domains.

Для составления полного списка категорий запрета, вы заходите в каждую из папок находящихся в /var/db/squidGuard/ и в зависимости от того, какие там файлы находятся, составляете соовтетствующее правило. Рекомендую давать имя категории запрета, совпадающее с именем папки, например, если папка называется audio-video, то имя категории будет - dest audio-video. Особо ленивые могут взять готовый squidGuard.conf

После того, как мы составили конфигурационный файл, нам необходимо преобразовать наши текстовые файлы в БД (используется Berkeley DB), для обеспечения наилучшего быстродействия при поиске данных.

Для этого воспользуемся следующей командой

# squidGuard -d -C all
2006-05-09 18:59:29 [40660] init domainlist /var/db/squidGuard/ads/domains
2006-05-09 18:59:32 [40660] create new dbfile /var/db/squidGuard/ads/domains.db
2006-05-09 18:59:32 [40660] init expressionlist /var/db/squidGuard/ads/expressions
2006-05-09 18:59:32 [40660] init urllist /var/db/squidGuard/ads/urls
2006-05-09 18:59:32 [40660] create new dbfile /var/db/squidGuard/ads/urls.db
...
...
...
2006-05-09 19:09:35 [40660] init urllist /var/db/squidGuard/whitelist/urls
2006-05-09 19:09:35 [40660] create new dbfile /var/db/squidGuard/whitelist/urls.db
2006-05-09 19:09:35 [40660] squidGuard 1.2.0 started (1147201169.478)
2006-05-09 19:09:35 [40660] db update done
2006-05-09 19:09:35 [40660] squidGuard stopped (1147201775.362)

Как видно из сообщений файлы с БД называются urls.db и domains.db, старые файлы urls и domains нужно удалить. Теперь нам осталось только выставить необходимые права и создать лог файл.

# chown -R squid:squid /var/db/squidGuard
# chmod -R 640 /var/db/squidGuard
# chmod 550 /var/db/squidGuard
# chmod 550 /var/db/squidGuard/*
# touch /var/log/squidGuard.log
# chown squid:squid /var/log/squidGuard.log

Все, со squidGuard мы закончили. Теперь осталось только указать squid использовать в качестве редиректора squidGuard. Для этого внесем изменения в squid.conf.

#
#   /usr/local/etc/squid/squid.conf

#  TAG: redirect_program
# Указываем путь к squidGuard
redirect_program /usr/local/bin/squidGuard

#  TAG: redirect_children
# Количество одновременно запускаемых процессов squidGuard.
redirect_children 5
В ветке 2.6.STABLE произошли изменения и теперь вместо параметров redirect_program и redirect_children необходимо использовать url_rewrite_program и url_rewrite_children соответственно.

Теперь у нас все готово к запуску нашей связки.

# /usr/local/etc/rc.d/squid.sh start
Starting squid.

# cat /var/log/squidGuard.log
2006-05-09 19:12:33 [40744] init domainlist /var/db/squidGuard/ads/domains
2006-05-09 19:12:33 [40744] loading dbfile /var/db/squidGuard/ads/domains.db
2006-05-09 19:12:33 [40743] init domainlist /var/db/squidGuard/ads/domains
2006-05-09 19:12:33 [40743] loading dbfile /var/db/squidGuard/ads/domains.db
2006-05-09 19:12:33 [40744] init expressionlist /var/db/squidGuard/ads/expressions
...
...
...
2006-05-09 19:12:34 [40745] init urllist /var/db/squidGuard/whitelist/urls
2006-05-09 19:12:34 [40745] loading dbfile /var/db/squidGuard/whitelist/urls.db
2006-05-09 19:12:34 [40745] squidGuard 1.2.0 started (1147201953.012)
2006-05-09 19:12:34 [40745] squidGuard ready for requests (1147201954.939)
# cat /usr/local/squid/logs/cache.log | grep squidGuard
2006/05/09 19:12:32| helperOpenServers: Starting 5 'squidGuard' processes

Тестирование squidguard

После этого можно протестировать squidGuard, для этого воспользуйтесь скриптом

# perl squidGuard.pl
Введите тестируемый адрес:
192.168.127.10

В результате будет создан файл result.txt, с таким содержимым

# cat result.txt
Запрос: http://www.sex.com 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/adult.html 192.168.127.10/- - GET

Запрос: http://www.adult.com 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/adult.html 192.168.127.10/- - GET

Запрос: http://www.aport.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.porno.ru 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/adult.html 192.168.127.10/- - GET

Запрос: http://www.chat.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.test.com 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/ads.html 192.168.127.10/- - GET

Запрос: http://www.aport.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://adv.aport.ru/banners/ban_1342.gif 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/ads.html 192.168.127.10/- - GET

Запрос: http://www.bs.yandex.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.riva.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://linkexchange.ru/banners/bnr_dfg12.gif 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/ads.html 192.168.127.10/- - GET

Запрос: http://www.sga/read.mp3 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/audio-video.html 192.168.127.10/- - GET

Запрос: http://www.service.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.delit.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.teenslut.com 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/adult.html 192.168.127.10/- - GET

Запрос: http://www.abort.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://engine.awaps.ru:8000/br/GOLDEN.gif 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.rikki.ru 192.168.127.10/- - GET
Результат: OK

Запрос: http://www.mus.ru/read_me.mp3 192.168.127.10/- - GET
Результат: http://192.168.127.253/block/audio-video.html 192.168.127.10/- - GET

Ну вот собственно и вся настройка. Теперь вы сэкономите много трафика.

Обновление БД

Часто возникает необходимость запретить или разрешить тот или иной url/домен. Я специально создавал для каждой категории запрета свою страничку. Так намного легче будет найти под какую категорию запрета попал тот или иной адрес.

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

Для этого, мы создаем файл domains.diff в папке /var/db/squidGuard/ads следующего содержания

+domain1.com
+domain2.com
+domain3.com
...
-domain5.com
-domain6.com
-domain7.com

Думаю, синтаксис и так понятен. Домены, перед которыми стоит знак + будут добавлены в список, а со знаком минус соответственно удалены из него. После того как вы создали файл, обновляем БД

# squidguard -d -u /var/db/squidGuard/ads/domains.diff
2009-11-17 10:17:47 [20777] New setting: dbhome: /var/db/squidGuard/
2009-11-17 10:17:47 [20777] New setting: logdir: /var/log/squid
2009-11-17 10:17:47 [20777] init domainlist /var/db/squidGuard/ads/domains
2009-11-17 10:17:47 [20777] loading dbfile /var/db/squidGuard/ads/domains.db
2009-11-17 10:17:47 [20777] update dbfile /var/db/squidGuard/ads/domains.db
Processing file and database /var/db/squidGuard/ads/domains.diff    
2009-11-17 10:17:47 [20777] update: added 3 entries, deleted 3 entries======================================] 100 % done
2009-11-17 10:17:47 [20777] squidGuard 1.2.0 started (1258445867.572)
2009-11-17 10:17:47 [20777] db update done
2009-11-17 10:17:47 [20777] squidGuard stopped (1258445867.686)

И даем команду squid на реконфигурацию, чтобы он заново загрузил обновленные БД.

# squid -k reconfigure
www/squidguard.txt · Последние изменения: 2009/11/17 10:24 (внешнее изменение)