SquidGuard - ДЛЯ ВСЕХ.

Автор: Савченко Андрей

Эта статья - попытка разобраться с полезной на мой взгляд программой SquidGuard редиректа и фильтрации запросов Squid. SquidGuard предназначен для работы с proxy-сервером SQUID. Возможности SquidGuard: 1) гибкая фильтрация запросов; 2) опознавание пользователей по IP-адресу или имени; 3) работа по расписанию; 4) обрезка (а точнее подмена) banners и т.д. Я хочу рассмотреть только те элементы настройки SquidGuard, которые реально работают у меня . Думаю, большинству администраторов этого будет достаточно. Я администрирую работу с Интернет приложениями в учебном заведении. Общее количество машин - около 100. SquidGuard позволяет бороться с вредными наклонностями студентов (порнография, чаты, агрессия, наркотики и т.д.), а также экономить трафик (рекламные банеры, mp3 и т.д.). В то же время отдельным пользователям можно позволить посещать всё или только список "хороших" сайтов. Так, реклама прошла успешно, теперь к делу. Любым способом устанавливаем пакет SquidGuard (например из портов). Стандартно инсталляция проходит в папку /usr/local/SquidGuard. Здесь создаются папки db, log и файлы squidGuard, squidGuard.conf Качаем архив blacklists.tar.gz, распаковываем и полученные папки с файлами выкладываем в папку db. Можно использоать адреса: ftp://ftp.teledanmark.no/pub/www/proxy/squidGuard/contrib/blacklists.tar.gz http://ftp.teledanmark.no/pub/www/proxy/squidGuard/contrib/blacklists.tar.gz Вы получаете папки: ads - реклама (баннеры) agressive - насилие hacking - no comment publicite - реклама porn - no comment warez - порно В каждой папке могут быть файлы: 1. domains -список доменных имен : sex.com adult.com 216.185.108.1 (обращение ко всему домену) 2. expressions-список ожидаемых фрагментов слов в url : (sex|adult|lolita) (проверка на наличие указанных фраз в пути) 3. urls - no coment : host.com/anus 12.10.220.125/alisa (обращение к части домена) Редактируем squidGuard.conf/ Все примеры взяты из реального conf - файла. Поэтому несколько слов об окружении. Имею: FreBSD-4.5 Squid/2.4.STABLE3 Apache/1.3.20 www.my.host SquidGuard 1.1.4 logdir /var/SquidGuard # путь к лог директории dbhome /usr/local/squidGuard/db # путь к базам #готовим прикольную подмену для mp3 файлов rewrite mp3 { s@.*\.mp3$@http://www.my.host/my.mp3@r } # по адресу http://www.my.host/my.mp3 выложим свой mp3 - прикол (например: #"Так мычит обычная корова ..") #готовим диапазоны времени (нерабочее время) time leisure-time { weekly * 00:00-08:00 17:00-24:00 # ночь и вечер weekly fridays 16:00-17:00 # + пятница с 16:00 до 17:00 (если у вас короткий день) weekly sat sun 00:00-24:00 # + выходные date*.01.01 # + Новый Год # и т. д. } #Создаем группы src kids { ip 192.168.0.200 #любит качать mp3 (но канал не резиновый) } src student { ip 192.168.0.1-192.168.0.45 #любят все (но не все стоит показывать) } src vasya { ip 192.168.0.62 #просто Вася (chat,chat и еще раз chat) } src vasya2 { ip 192.168.1.20 # просто Вася II (и ел бы "inet" ,и спал бы #c "inet", а работать, когда!?! ) } src comandor { ip 192.168.4.170 192.168.1.1 #начальство (добавить нечего) } src my { ip 192.168.0.100 #a это моя машинка } #Наша цель: #Для : # kids - обрезать файлы mp3; # student - обрезать все неприличное и ненужное; # vasya - в рабочее время отключить chat; # vasya2 - в рабочее время отключить все кроме списка # "хороших" адресов; # my - мне можно все!!! # для всех - убрать рекламу. # # Подключение баз. dest pornography { domainlist porn/domains expressionlist porn/expressions urllist porn/urls } dest warez { domainlist warez/domains urllist warez/urls } dest agressive { domainlist agressive/domains urllist agressive/urls } dest good { domainlist good/domains #список "хороших" адресов #(составляется самостоятельно) } dest chat { domainlist chat/domains #список "chat" адресов #(составляется самостоятельно) expressionlist chat/expressions #ожидаемые фразы } dest ads { domainlist ads/domains expressionlist ads/expressions urllist ads/urls redirect 302: http://www.my.host/Images/not_banner.gif # адрес рисунка для подмены рекламных баннеров } dest drugs { domainlist drugs/domains urllist drugs/urls } dest hacking { domainlist hacking/domains urllist hacking/urls } acl { kids { pass !ads all #все кроме рекламы rewrite mp3 #подмена mp3 файлов на наш файл (смотри выше) } student { pass !warez !chat !pornography !agressive !drugs !hacking !ads all #все, кроме ,warez ,chat ,pornography ,agressive ,drugs ,hacking ,ads redirect http://www.my.host/cgi-bin/bl.cgi?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&targetgroup=%t&url=%u } vasya within leisure-time { pass !ads all #все, кроме рекламы, в нерабочее время } else { pass !chat !ads all #отключение chat-ов в рабочее время redirect http://www.my.host/cgi-bin/bl.cgi?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&targetgroup=%t&url=%u } vasya2 within leisure-time { pass !ads all #все, кроме рекламы, в нерабочее время } else { pass good !ads all #ограничение разрешенных сайтов списком good в рабочее время redirect http://www.my.host/cgi-bin/bl.cgi?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&targetgroup=%t&url=%u } my { pass all } comandor { pass !warez !chat !pornography !agressive !drugs !hacking !ads all #покажем, что мы недаром кушаем хлеб #pass all # все равно "попросят" } default { #для всех остальных pass none redirect http://www.my.host log /var/SquidGuard/defoult.log #и запишем в лог } } Файл bl.cgi поставляется как squidGuard.cgi.in . Он выводит на экран симпатичный ответ в случае отказа на запрос. Базы взяты из файла blacklists.tar.gz по адресу www.sguidguard.org SguidGuard выполняет redirect только на host, а не на файловую систему. Предположим, что файл squidGuard.conf у нас готов. У меня он лежит по пути /usr/local/bin/squidGuard.conf. Проверяем владельца и разрешения. Для squidGuard и squidGuard.conf - владелец тот же, что и в squid.conf прописан для cache_effective_user Разрешения: squidGuard 755 squidGuard.conf 644 Перед запуском squidGuard из под Squid-а , желательно протестировать его работу. Тестируем. Создаем исполняемый файл test и пишем /usr/local/ squidGuard /squidGuard </usr/local/squidGuard/squidGuard /in > /usr/local/squidGuard/squidGuard/out -d Из файла in будет чтение запросов, в файл out будет выведен результат. Ключ -d - для режима отладки. Создаем файл in. Как видно ниже, у него некий стандартный формат: http://www.adult.com/live.mp3 192.168.0.200/- - GET #1 http://www.adult.com 192.168.0.200/- - GET #2 http://www.aport.ru 192.168.0.200/- - GET #3 http://www.sex.ru 192.168.0.10/- - GET #4 http://www.chat.ru 192.168.0.1/- - GET #5 http://www.k_k_k.com 192.168.0.20/- - GET #6 http://www.aport.ru 192.168.0.15/- - GET #7 http://adv.aport.ru:8000/banners/GOLDEN.gif 192.168.0.22/- - GET #8 http://www.chat.ru 192.168.0.62/- - GET #9 http://www.aport.ru 192.168.0.62/- - GET #10 http://adv.aport.ru:8000/banners/GOLDEN.gif 192.168.0.62/- - GET #11 http://www.sex.ru 192.168.0.100/- - GET #12 http://www.sex.ru 192.168.0.100/- - GET #13 http://www.chat.ru 192.168.0.100/- - GET #14 http://www.k_k_k.com 192.168.0.100/- - GET #15 http://www.aport.ru 192.168.0.100/- - GET #16 http://adv.aport.ru:8000/banners/GOLDEN.gif 192.168.0.100/- - GET #17 http://www.aport.ru 192.168.5.200/- - GET #18 http://www.mus.ru/live.mp3 192.168.0.227/- - GET #19 *Для удобства разбора полетов я справа пронумеровал строки. Запускаем файл test в рабочее время. На экране получаем сообщения о загрузке баз, и в результате получаем файл out. В случае сообщения об ошибке в строке N## следует учитывать , что ошибка может быть в предыдущей строке!!! 302: http://www.my.host/my.mp3 192.168.0.200/- - GET #1 #2 #3 http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.10&clientname=&clientident=&clientgroup=student&targetgroup=pornography&url=http://www.sex.ru 192.168.0.10/- - GET #4 http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.1&clientname=&clientident=&clientgroup=student&targetgroup=chat&url=http://www.chat.ru 192.168.0.1/- - GET #5 #6 #7 302:http://www.my.host/Images/not_banner.gif 192.168.0.22/- - GET #8 http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.62&clientname=&clientident=&clientgroup=vasya&targetgroup=chat&url=http://www.chat.ru 192.168.0.62/- - GET #8 #10 302:http://www.my.host/Images/not_banner.gif 192.168.0.62/- - GET #11 #12 #13 #14 #15 #16 #17 http://www.my.host 192.168.5.200/- - GET #18 http://www.my.host 192.168.0.227/- - GET #19 Как видим, kids будет слушать "Корову ...". 2 ,3,6,7,10,12,13,14,15,16,17-ий запросы прошли без редиректа; 4, 5 - блокирование porno для студентов; 8, 11 - подмена баннера; 9 - блокирование chat-а для vasya; 18,19 - чужаки. Изменив leisure-time, запускаем файл test для нерабочего времени . В результате получаем файл out для нерабочего времени 302: http://www.my.host/my.mp3 192.168.0.200/- - GET http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.10&clientname=&clientident=&clientgroup=student&targetgroup=pornography&url=http://www.sex.ru 192.168.0.10/- - GET http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.1&clientname=&clientident=&clientgroup=student&targetgroup=chat&url=http://www.chat.ru 192.168.0.1/- - GET 302:http://www.my.host/Images/not_banner.gif 192.168.0.22/- - GET 302:http://www.my.host/Images/not_banner.gif 192.168.0.62/- - GET http://www.my.host 192.168.5.200/- - GET http://www.my.host 192.168.0.227/- - GET Как видим, vasya получил доступ к chat-ам Теперь, разобравшись в этой кухне, вы можете написать свой Conf , протестировать его и запустить из под Squid-а. Cтартуем из squid. Добавляем в файл squid.conf. redirect_program /usr/local/bin/squidGuard redirect_children 3 redirector_bypass on # для случая, если все редиректы заняты - ломись напрямую, иначе squid слетает. По идее все уже работает за исключением следующего: 1. Для строки подмены banners через редирект http://www.my.host/Images/not_banner.gif нужно выложить файл www.my.host/Images/not_banner.gif . Это может быть ваш banner, logo или рисунок 1х1. 2. Для красивого ответа на запрет "строка вида" http://www.my.host/cgi-bin/bl.cgi?clientaddr=192.168.0.1&clientname=&clientident=&clientgroup=student&targetgroup=chat&url=http://www.chat.ru нужно найти файл ...../port/www/squidguard/work/squidGuard-1.1.4/samples/squidGuard.cgi.in, переименовать (например, bl.cgi) и подправить под свой host. Выложить в свою web/cgi-bin и подправить путь для редиректа в файле squidGuard.conf Теперь можно наслаждаться результатами своей работы. В случае необходимости правим файлы domains,expressions и urls ПРИМЕЧАНИЕ ! Если вы внесли изменения в файл domains или urls, то для вступления изменений в силу вам необходимо выполнить следующую команду /usr/local/bin/squidGuard -C all для создания файлов domains.db и urls.db. Если лень, то удалите все файлы *.db, и squidGuard автоматически будет преобразовывать их при загрузке (замедляет загрузку). Полная докумунтация находится по адресу http://www.squidguard.org 1.03.2002 Киев. Савченко Андрей Все отзывы, замечания и критику просьба отправлять по адресу zakat@ukr.net