Документация по ОС FreeBSD Суббота, 27.04.2024, 21:52
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » Squid

Устанавливаем во FreeBSD связку Squid + squidGuard + с-icap [2009]
Материал предоставлен редакцией журнала Системный администратор.
Опубликовано в журнале "Системный администратор" N 3 2009 
    
Работа современного офиса сегодня немыслима без Интернета. Как ограничить доступ к нежелательным ресурсам в Сети, отнимающим у сотрудников рабочее время? В этом поможет совместная работа прокси-сервера Squid с редиректором запросов SquidGuard и сервером ICAP.

Общеизвестно стремление среднестатистического офисного работника к свободному серфингу на просторах Интернета, особенно в рабочее время, особенно когда на расстоянии пары кликов различные "Одноклассники" и "В Контакте", наконец когда появляется все больше и больше программ и сервисов, не требующих установки на компьютер, а довольствующихся лишь наличием выхода в Интернет, и программой - обозревателем интернет-страниц. Отсюда возникает насущная необходимость для руководства предприятия направлять подобного рода "веб-деятельность" своих сотрудников ближе к их прямым рабочим обязанностям.

В качестве одного из решений можно использовать прокси-сервер доступа в Интернет Squid в сочетании с URL-редиректором squidGuard, а также организовать проверку http-трафика на вирусы. Для выполнения последней задачи в нашей компании применили Clam Antivirus, работающий через сервер ICAP (Internet Content Adaptation Protocol). Предлагаю вашему вниманию небольшую заметку об установке и настройке вышеупомянутых продуктов для совместной работы по обеспечению доступа пользователей к Интернету.

Прежде чем приступить непосредственно к описанию установки перечислю то, что уже должно быть установлено на вашем сервере:

n  операционная система - мы будем производить установку на FreeBSD 7.1-SATBLE;

   *  веб-сервер - подойдет любой от Apach до lighttpd;

   *  брандмауэр - pf, ipf или ipfw, настроенный для прозрачного
   перенаправления http-запросов пользователей на порт прокси-сервера
   Squid, мы использовали pf.

Используемое программное обеспечение и его версии:

   *  прокси-сервер Squid - версия squid-3.0.13;

   *  squidGuard, URL redirector - версия squidGuard-1.4;

   *  ICAP-сервер c-icap - версия 060708.

Установка Squid

Прокси-сервер Squid представляет собой весьма гибкое в конфигурировании и обладающее широкими возможностями средство для организации доступа пользователей в Интернет. Я опишу здесь простую конфигурацию, вполне пригодную для использования в небольших или средних по количеству сотрудников организациях.

Устанавливаем Squid из портов FreeBSD, перемещаемся в директорию порта:

           # cd /usr/ports/www/squid30/

В config-опциях после команды:

           # make config

отмечаем нужные:

           SQUID_DELAY_POOLS;
           SQUID_PF;
           SQUID_ICAP.

Теперь смело собираем и устанавливаем программу:

           # make && make install && make clean

Затем меняем содержимое конфигурационного файла squid.conf в директории /usr/local/etc/squid/:

           # Привилегированный пользователь
           acl BosS src 172.25.1.3

           # Наша локальная сеть - источник запросов к прокси-серверу
           acl LocalneT src 172.25.0.0/16

           # ICQ, как и любой другой порт, можно разрешить или закрыть, ниже будет понятно как
           acl IcQ port 5190

           # На каком порту принимает запросы Squid, опцию transparent здесь не указываем, так как Squid
           # собан с поддержкой прозрачного проксирования с помощью пакетного фильтра pf (опция SQUID_PF)
           http_port 8080

           # Пускаем всех из локальной сети в Интернет
           http_access allow LocalneT
       
           # Запрещаем всем остальным
           http_access deny all
       
           # Здесь указываем программу-редиректор, у нас -- это squidGuard. В   предыдущих версиях Squid этот параметр
           # назывался redirect_program
           url_rewrite_program /usr/local/bin/squidGuard -c   /usr/local/etc/squid/squidGuard.conf
       
           # Управление  скоростью доступа в Интернет посредством пулов
           # Количество пулов доступа
           delay_pools 2
       
           # Первая цифра -- номер пула, вторая -- класс пула, мы используем пулы только первого класса,
           # без деления на подсети
           delay_class 1 1
   
           # Отдельному пользователю 10 Кб/с
           delay_class 1 1
           delay_parameters 1 100000/100000
           delay_access 1 allow BosS
           delay_access 1 deny all
       
           # Всем остальным - 15 Кб/с
           delay_class 2 1
           delay_parameters 2 150000/150000
           delay_access 2 allow LocalneT
           delay_access 2 allow LoopbacK
           delay_access 2 deny all
       
           # Учетная запись, с правами которой работает Squid
           cache_effective_user squid
           cache_effective_group squid
       
           # Местонахождение log-файлов
           cache_log /var/log/squid_debug.log
           access_log /usr/local/squid/logs/access.log
       
           # Поддержка функционала icap-клиента:
           icap_enable          on
           icap_preview_enable  on
           icap_preview_size    128
           icap_send_client_ip  on
           icap_service         service_avi_req reqmod_precache 0 icap://localhost:1344/avscan
           icap_service         service_avi respmod_precache 1 icap://localhost:1344/avscan
           icap_class           class_antivirus_req service_avi_req
       
           # Для каждого имени icap_service указываем отдельную строку icap_class,  а не все сервисы
           # в одной строке, как предлагается в configuration guide на сайте проекта c-icap:
           # "icap_class class_antivirus service_avi service_avi_req", иначе  Squid при запуске выдаст сообщение:
           # "WARNING: Multiple ICAP services per icap_class
           # are not yet supported."
           icap_class           class_antivirus service_avi

           # Соответственно получаем две строки icap_access для двух классов icap_class
           icap_access          class_antivirus_req allow all
           icap_access          class_antivirus allow all

Отмечу, что в примере конфигурационного файла не указана директория хранения кеша запросов и его максимальный размер, это говорит лишь о том, что используются значения этих параметров по умолчанию, которые можно посмотреть в файле /usr/local/etc/squid/squid.conf.default. С Squid все. Запускать его без squidGuarda пока не будем. Еще раз скажу, что здесь описан простой случай прозрачного проксирования без множества существующих в Squid полезных вещей, таких как аутентификация пользователей, параметры оптимизации кеширования и пр.

Установка squidGuard

SquidGuard также легко находится в портах - /usr/ports/www/squidguard/.
Просто устанавливаем его как обычно:

           # make && make install && make clean

Во время установки squidGuard поместит списки блокировки в /var/db/squidGuard и сделает их принадлежащими учетной записи squid и группе squid, - что должно совпадать с учетной записью, под которой работает прокси-сервер Squid (см. значения переменных cache_effective_user и cache_effective_group в файле /usr/local/etc/squid/squid.conf). Можно пользоваться этими блэклистами, можно другими, коммерческими или бесплатными; вся информация по получению блэклистов есть на http://squidguard.org/blacklists.html , я беру их здесь: http://cri.univ-tlse1.fr/blacklists . Получив так или иначе архив с блэклистами, распаковываем их в директорию, которая в файле конфигурации squidGuard.conf указана в значении параметра dbhome, и не забываем, что dbhome со всем содержимым должен принадлежать пользователю squid. Теперь перейдем к настройкам в /usr/local/etc/squid/squidGuard.conf, ниже пример содержания этого файла с краткими пояснениями:

           # Место расположения блэклистов и логов
           dbhome /var/db/squidGuard/blacklists
           logdir /var/log
       
           # Можно задавать ограничения доступа по времени и дням
           # сокращения для дней недели: #s = sun, m = mon, t =tue,
           # w = wed, h = thu, f = fri, a = sat
           # У нас описаны дневные часы ежедневно c 6 утра
           # до 10 вечера, что будет использовано ниже
           time WORKHOURS {
               weekly * 06:00 -- 22:00
               date *.*.01 06:00 -- 22:00
           }
       
           # От кого будут приходить запросы
           source LOCALNET {
               ip           172.25.0.0/16
           }
       
           # Далее идут собственно описания ресурсов (так называемые
           # DESTINATION CLASSES), доступ к которым запрещен (blacklists)
           # или разрешен (whitelists) - указание на содержимое dbhome;
           # мы будем использовать только блэклисты
           # Название подкаталога блэклистов
           destination adult {
               # Указание на блэклист доменов, здесь указываются,
               # какие домены блокируются, -- т.е. если в файле
               # указан domen.com, то закрыт доступ к домену
               # полностью и к host.domen.com  и к games.foo.domen.com
               # и т. д. Могут быть указаны также только поддомены,
               # например subdomen.host.com: это закрывает доступ
               # только к поддомену и ко всем его cобственным
               # поддоменам, а доступ к host.com остается открытым.
               # Но обратите внимание! Если в файле доменов указаны
               # и domen.com и subdomen.domen.com, то доступ будет
               # закрыт только к этим двум доменам, а, скажем,
               # foo.domen.com будет доступен
       
               domainlist adult/domains
       
               # Указание на блэклист URL, т.е. блокируется доступ
               # к конкретным страницам, если указано
               # example.com/some/path/to/page.html, то блокируется
               # доступ только к
               # http://www.example.com/some/path/to/page.html,
               # http://example.com/some/path/to/page.html,
               # http://ftp.example.com/some/path/to/page.html
       
               urllist adult/urls
           }
       
           destination audio-video {
               domainlist audio-video/domains
               urllist audio-video/urls
       
               # Файл регулярных выражений в URL запроса, используется
               # стандартный синтаксис, который можно узнать
               # по man regex; здесь можно запретить, например,
               # всевозможные мультимедиа-файлы:
               # (\.mp3|\.wmv|\.flv|\.avi|\.mp4)$
       
               expressionlist audio-video/expressions
           }
       
           destination blog {
               domainlist blog/domains
               urllist blog/urls
       
               # Так включается запись в лог нарушителей, пытавшихся
               # пройти на запрещенные ресурсы
       
               log violaters.log
           }
           ...
       
           destination agressif {
               domainlist agressif/domains
                   urllist agressif/urls
               expressionlist agressif/expressions
           }
       
           destination publicite {
               domainlist publicite/domains
                   urllist publicite/urls
               expressionlist publicite/expressions
           }
       
           # И, наконец, пишем кому (LOCALNET), когда (within WORKHOURS)
           # и куда запрещен/разрешен доступ, здесь у нас запрещен
           # доступ по всем вышеописанным блэклистам
       
           acl {
               LOCALNET within WORKHOURS {
                   pass !adult !astrology !blog !celebrity !dangerous_material \
                      !dating !financial !forums !games !liste_bu !malware !manga \
                      !marketingware !mixed_adult !phishing !radio !in-addr !hacking \
                      !warez !gambling !drogue !filehosting !audio-video !agressif !redirector !publicite any
               }
       
                default {
                    pass     none
       
                    # URL, заменяющий запрещенный к доступу -- то,
                    # что увидит пользователь - любитель фривольных
                    # ресурсов; это может быть сделанная вами
                    # бан-страница и расположенная на локальном
                    # веб-сервере, это может быть даже главная
                    # страница вашего корпоративного ресурса
                    # в Интернете
       
                    redirect http://host/ban.html
                }
           }

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

           # squidGuard -C all

В зависимости от количества используемых блэклистов время инициализации будет разным, от секунд до нескольких минут; по окончании инициализации в log-файле squidGuard должно быть нечто, подобное этому:

           2009-02-27 16:42:44 [78281] squidGuard 1.4 started (1235741910.112)
           2009-02-27 16:42:44 [78281] db update done
           2009-02-27 16:42:44 [78281] squidGuard stopped (1235742164.788)

После инициализации блэклистов директория, их содержащая, будет принадлежать учетной записи root, поэтому меняем "хозяина":

           # chown -R squid:squid /path/to/blacklists

Либо можно изначально провести инициализацию блэклистов от имени учетной записи squid, если текущая учетная запись имеет на это право (см. man sudoers):

           # sudo -u squid $(which squidGuard) -C all

И можем сначала проверить, что squidGuard инициализировал листы успешно:

           # tail -n 10 /var/log/squidGuard.log | grep "emergency mode" || echo OK

Если на экране ОК - значит все в порядке.

Осталось проверить, что squidGuard принимает и обрабатывает запросы:

           # echo "http://adult.com 172.25.1.3/ - - GET" | squidGuard -c /usr/local/etc/squid/squidGuard.conf


Здесь:

adult.com - запрашиваемый URL;
172.25.1.3 - с какого адреса имитируем запрос.

Если все работает нормально, то на экране увидим redirect URL нашей бан-страницы, указанной в squidGuard.conf:

              http://host/ban.html 172.25.1.3/- - -

Можем запускать Squid:

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

В логах Squid напишет, что запустил 5 дочерних процессов squidGuard, эта цифра предусмотрена по умолчанию, ее можно менять в зависимости от нагрузки на сервер в squid.conf параметром url_rewrite_children <число_процессов>. Можно проверять работу Squid и squidGuard с клиентских машин запросами через интернет-браузер.

Установка ClamAV и c-icap

ClamAV устанавливаем из портов (/usr/ports/security/clamav) привычным способом:

           # make && make install && make clean

Используем опции конфигурации по умолчанию, предлагаемые при установке. Настройки демона clamd в /usr/local/etc/clamd.conf тоже можно оставить без изменений после установки.

C-icap придется собирать и устанавливать из исходных кодов, так как на момент написания статьи порт /usr/local/www/c-icap содержал версию программы за июнь 2006 года, и заставить ее работать со Squid 3.0 мне не удалось. Загружаем исходный код c-icap. Распаковываем в рабочую директорию и собираем с такой опцией:

           # ./configure --prefix=/usr/local

Дальше все, как обычно:

           # make && make install

Конфигурационный файл c-icap.conf будет находиться в /usr/local/etc/, вот его содержимое:

           # файл хранения pid основного процесса icap-сервера

           PidFile /var/run/c-icap.pid

           # Параметр можно не указывать, но файл сокета управления
           # по умолчанию должен находиться именно здесь, его нужно
           # создать командой "touch /var/run/c-icap/c-icap.ctl"
           #CommandsSocket /var/run/c-icap/c-icap.ctl
           # Время в секундах, после которого неактивное соединение
           # закрывается

           Timeout 300

           # Icap-сервер старается не закрывать соединение с клиентом,
           # ожидая новых запросов

           KeepAlive On

           # Максимальное число незакрываемых соединений в ожидании
           # новых запросов

           MaxKeepAliveRequests 100

           # Максимальное время в секундах ожидания новых запросов

           KeepAliveTimeout 600

           # Начальное число процессов сервера, каждый процесс
           # генерирует треды для обслуживания запросов

           StartServers 3

           # Максимальное число процессов сервера

           MaxServers 30

           # Если число запущенных тредов меньше указанного,
           # icap-сервер генерирует новые

           MinSpareThreads     10

           # Если число тредов больше указанного, icap-сервер
           # убивает дочерние

           MaxSpareThreads     300

           # Начальное число тредов для каждого дочернего процесса

           ThreadsPerChild     30

           # Максимальное число запросов, которое может обслужить
           # дочерний процесс, как только оно достигнуто, процесс
           # умирает, 0 -- отключает параметр

           MaxRequestsPerChild  0

           # Порт, на котором принимает запросы icap-сервер

           Port 1344

           # Учетная запись - владелец процессов icap-сервера

           User cicap

           # Группа владельцев процессов icap-сервера

           Group cicap

           TmpDir /var/tmp/c_icap

           # Максимальный объем памяти в байтах, занимаемый объектом,
           # обрабатываемым c-icap

           MaxMemObject 131072

           # Лог-файлы

           ServerLog /var/log/c_icap/server.log
           AccessLog /var/log/c_icap/access.log

           # Каталог модулей c-icap

           ModulesDir /usr/local/lib/c_icap

           # Строка-префикс каждого сообщения в логах,
           # если используем syslog
       
           sys_logger.Prefix "C-ICAP:"

           # Метод ведения логов

           sys_logger.Facility local1

           # Куда пишутся логи - либо в отдельный файл (наш случай),
           # либо в syslog: sys_logger

           Logger file_logger

           # Контроль доступа по acl - подобно acl в Squid:

           acl localproxy_respmod src 127.0.0.1 type respmod
           acl localproxy src 127.0.0.1
           acl externalnet src 0.0.0.0/0.0.0.0
           icap_access allow localproxy_respmod

           # Разрешаем только самому себе обращаться к icap-серверу

           icap_access allow localproxy
           icap_access deny externalnet

           # Расположение сервисов

           ServicesDir /usr/local/lib/c_icap

           # Сервис echo

           Service echo_module srv_echo.so

           # Сервис проверки URL

           Service url_check_module srv_url_check.so

           # Сервис проверки на вирусы

           Service antivirus_module srv_clamav.so

           # Алиас сервиса антивируса для указания в squid.conf
           # значения параметра icap_service

           ServiceAlias  avscan srv_clamav?allow204=on&sizelimit=off&mode=simple

           # Список групп типов файлов для сканирования, поддерживаемые
           # типы указываются в файле /usr/local/etc/c-icap.magic,
           # о котором сказано ниже

           srv_clamav.ScanFileTypes TEXT DATA EXECUTABLE ARCHIVE GIF JPEG MSOFFICE

           # Какой процент данных будет отдаваться сервером icap
           # до выполнения проверки всех данных запроса

           srv_clamav.SendPercentData 5

           # Если файл больше указанного размера, то включается
           # предыдущий параметр SendPercentData

           srv_clamav.StartSendPercentDataAfter 2M

           # Максимальный размер файлов, которые сканируются ClamAV

           srv_clamav.MaxObjectSize  5M

           # Максимальное количество файлов в архиве, используется
           # библиотекой ClamAV, 0 отключает параметр
       
           srv_clamav.ClamAvMaxFilesInArchive 0

           # Максимальный размер архива

           srv_clamav.ClamAvMaxFileSizeInArchive 50M

           # Максимальный уровень рекурсии

           srv_clamav.ClamAvMaxRecLevel 5

           # Следующие директивы описывают режим работы
           # viralator like, srv_clamav проверяет тип файла, и если
           # он указан в директиве srv_clamav.VirScanFileTypes --
           # загружает файл для проверки на вирусы и только потом
           # отдает его пользователю ссылкой на локальном веб-сервере

           # Место для скачиваемых файлов, на эту директорию должны
           # быть права у вашего локального веб-сервера

           srv_clamav.VirSaveDir /var/tmp/c_icap

           # Интервал в секундах между сообщениями о ходе закачки
           # файла для проверки

           srv_clamav.VirUpdateTime   15

           # Тип файлов или группы типов файлов, для которых
           # используется предварительная закачка для проверки
           # на вирусы; типы указаны все в том же файле c-icap.magic

           srv_clamav.VirScanFileTypes ARCHIVE EXECUTABLE

           # Ссылка на локальном веб-сервере на закачанный файл,
           # отдаваемая пользователю после проверки файла на вирусы,
           # для этого используется скрипт get_file.pl,
           # расположенный в директории contrib дистрибутива c-icap

           srv_clamav.VirHTTPServer   http://localhost/cgi-bin/get_file.pl?usename=%f&remove=1&file=

В заключение описания настройки c-icap пара слов о файле /usr/local/etc/c-icap.magic, где перечислены группы типов файлов и сигнатуры для их распознавания. Приведу фрагмент его содержимого, описывающий исполняемые файлы:

           0:MZ:MSEXE:DOS/W32 executable/library/driver:EXECUTABLE
           0:LZ:DOSEXE:MS-DOS executable:EXECUTABLE
           0:\177ELF:ELF:ELF unix executable:EXECUTABLE
           0:\312\376\272\276:JavaClass:Compiled Java class:EXECUTABLE

Теперь можно запускать и c-icap, для удобства его запуска и указания в файле /etc/rc.conf для запуска при старте системы можно использовать скрипт:

           . /etc/rc.subr
           name="c_icap"
           rcvar=`set_rcvar`
           command="/usr/local/bin/c-icap"
           pidfile="/var/run/c-icap.pid"
           required_dirs="/var/tmp/c_icap"
           required_files="/usr/local/etc/c-icap.conf"
           stop_postcmd="rm -f $pidfile"
       
           load_rc_config "$name"
           : ${c_icap_enable="NO"}
           : ${c_icap_flags=""}
       
           run_rc_command "$1"

Скрипт запуска устанавливается c-icap-портом FreeBSD, так как мы собирали c-icap не из порта, у нас его не было; называем файл скрипта c_icap, делаем исполняемым и помещаем в /usr/local/etc/rc.d/. А в rc.conf вносим такие строки:

           c_icap_enable="YES"
           squid_enable="YES"
           clamav_clamd_enable="YES"
           clamav_freshclam_enable="YES"

Наконец, запустив все необходимое, проверим работу всей связки. Для начала можно сходить на любой запрещенный сайт - в браузере должна появиться бан-страничка squidGuarda, после чего попробовать скачать один из файлов с [3]http://www.eicar.org/anti_virus_test_file.htm - это страница с тестовыми вирусами, результат обнаружения вируса показан на рисунке.
Категория: Squid | Добавил: oleg (02.07.2009) | Автор: Олег Палухин
Просмотров: 1536 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024