SQUIDGUARD - БОРЬБА С НАРУШИТЕЛЯМИ


ВСТУПЛЕНИЕ
Думаю перед каждым администратором рано или поздно встает вопрос, как бороться с нецелевым использованием интеренет трафика, или если по простому, как запретить пользователям скачивать музыку, видео, просматривать порно сайты и т.д. и т.п.
Конечно это можно сделать и с помощью самого squid, с помощью acl, но на мой взгляд для этих целей более подходит squidGuard. Принцып работы тот же, т.е. мы создаем acl (Access Control List) списки управления доступом и затем разрешаем/запрещаем определенным классам пользователей те или инные категории.
.
В предыдущей статье я описывал настройку прокси сервера squid. Поэтому буду исходить из того, что squid у вас уже настроен и работает.
Итак, как всегда, устанавливаем все ПО из портов, 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)($|?)

Думаю синтаксис данного файла очевиден, именно благодаря этому списку запросы типа:
http://www.music.ru/whatever.mp3,
http://www.video.com/thematrix.avi
http://www.whatever.com/whatever.mpg
попадут под категорию запрета и будут блокированы.

Учитывайте эти особенности при добавлении новых правил.
РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ И ПРОИЗВОДИТЕЛЬНОСТЬ
Советую не злоупотреблять регулярными выражениями, особенно при большой нагрузке. Так как они потребляют очень много ресурсов. Производительность зависит от сложности самого регулярного выражения, а так же от производительности библиотеки регулярных выражений, с которой был собран 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
SQUID-2.6.STABLE И РЕДИРЕКТОР
В ветке 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 -u /var/db/squidGuard/ads/domains.diff

# cat /var/log/squid/squidGuard.log
2006-10-25 17:16:38 [4924] update dbfile /var/db/squidGuard/ads/domains.db
2006-10-25 17:16:38 [4924] update: added 3 entries, deleted 3 entries
2006-10-25 17:16:38 [4924] squidGuard 1.2.0 started (1161785798.107)
2006-10-25 17:16:38 [4924] db update done
2006-10-25 17:16:38 [4924] squidGuard stopped (1161785798.113)
И даем команду squid на реконфигурацию, чтобы он заново загрузил обновленные БД.
# squid -k reconfigure

Обновлено: 13.03.2015