Установка и настройка Squid + ncsa аутентификация

На днях настраивал в одном из офисов связку squid + squidGuard. Но в этот раз уже без поддержки АД, так как офис небольшой - 5 машин, то и необходимости в АД нет. Но как же быть в этом случае с аутентификацией пользователей? В этом случае на помощь приходит ncsa аутентификация и аутентификатор ncsa_auth.
При данной схеме имя пользователя и пароль хранятся в обычном текстовом файле, имеющем стиль файла паролей apache, который используется при базовой HTTP аутентификации.
Установка и настройка squid
Итак, как установить данные программы я уже рассказывал в предыдущих статьях - «SquidGuard - борьба с нарушителями», Squid и авторизация пользователей в AD«. Поэтому буду исходить из того, что squid и squidGuard уже установлены. Думаю, понятно что для работы данной схему устанавливать samba нет необходимости.
Производим минимальную настройку squid. Все изменения необходимо вводить после соответствующих тегов.
# # /etc/squid/squid.conf # # TAG: http_port # Указываем squid на каком порту и интерфейсе он будет работать. Именно эти # параметры необходимо будет указывать в настройках интернет проводника. http_port 192.168.0.1:3128 # TAG: maximum_object_size_in_memory (bytes) # Объекты больше этого размера не будут сохраняться в памяти. # По умолчанию 8КБ что очень мало на текущий момент, т.к. средний объем # web странички ~75-100 КБ maximum_object_size_in_memory 102400 # TAG: cache_dir # Объем кеша и его месторасположение. Объем задается в мегабайтах. (4096 ~ 4Гб) cache_dir ufs /var/spool/squid/ 4096 16 256 # TAG: dns_nameservers # Здесь необходимо указать днс сервер(а). В принципе если ничего не указывать, # то squid автоматически добавит сервер(а), которые указаны в /etc/resolv.conf # Я указал адрес самого сервера, т.к. у меня на нем работает кеширующий днс. # Если у вас нет своего днс сервера, то необходимо указывать днс провайдера. dns_nameservers 192.168.0.1 # TAG: redirect_program # Указываем путь к squidGuard redirect_program /usr/bin/squidGuard # TAG: redirect_children # Количество одновременно запускаемых процессов squidGuard. redirect_children 5 # TAG: auth_param # Здесь мы указываем squid, как следует производить аутентификацию. # Единственный параметр, который необходимо указать ncsa_auth - # это имя файла, в котором хранятся имена пользователей и пароли. # Данным файлом можно управлять (добавлять новых пользователей, # удалять текущих, изменять пароли и т.д.) с помощью утилиты # htpasswd, которая входит в состав пакета apache. auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/internet_users auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours auth_param basic casesensitive off # TAG: acl # ACL - Access Control List. Списки доступа к нашему прокси серверу. # Здесь мы указываем, кто имеет право, а кто нет, использовать наш прокси. # Разрешаем использовать наш прокси только прошедшим авторизацию. acl DARIM proxy_auth REQUIRED http_access allow DARIM http_access deny all # TAG: cache_effective_user # Пользователь и группа, от которых работает squid cache_effective_user squid # TAG: cache_effective_group cache_effective_group squid # TAG: visible_hostname # Данное имя будет указываться в различных сообщениях (об ошибках и т.п.) # По умолчанию будет подставляться значение, возвращаемое функцией gethostname() visible_hostname darim.proxy.server
На этом настойку squid можно считать завершенной.
Теперь нам осталось создать файл с паролями. Для этого необходимо выполнить следующую команду
# htpasswd -c /etc/squid/internet_users test New password: ******* Re-type new password: ******* Adding password for user test
Ключ -с необходимо указывать только один раз, при создании файла с паролями. В последующем добавлять пользователей нужно без этого ключа. Итак, мы получили файл с примерно таким содержимым.
# cat /etc/squid/internet_users test:89XzEEI/P0e56
Где test - имя пользователя, а 89XzEEI/P0e56 - хеш его пароля. Для добавления нового пользователя в существующий файл необходимо выполнить следующую команду
# htpasswd -b /etc/squid/internet_users admin 1234567 Adding password for user admin # cat /etc/squid/internet_users test:89XzEEI/P0e56 admin:EAJezc5eLXrV2
Думаю, что никаких проблем при использовании htpasswd возникнуть не должно. Более подробную информацию по использованию данной программы, а также по всем ключам можно получить как всегда прочитав мануал - man htpasswd.
После того как мы создали файл и пользователей не забываем выставить соответствующие права на файл /etc/squid/internet_users.
# chmod 440 /etc/squid/internet_users # chown squid:squid /etc/squid/internet_users
Установка и настройка squidGuard
Настройка squidGuard практически аналогична, за исключением того, что вместо ip адресов мы будем использовать имена пользователей.
#
# /etc/squid/squidGuard.conf
#
# Указываем где у нас располагаются наши базы
dbhome /var/lib/squidGuard
# Указываем где будет храниться log файл squidGuard
logdir /var/log/squid/
# Описываем классы доступа. Затем мы для каждого из классов
# (admins, clients) создадим свой набор правил доступа.
src admins {
user admin
}
src clients {
user test
}
# Думаю понятно, что test и admin имена пользователей,
# которых мы создавали с помощью htpasswd
# Далее описываем все категории запретов
dest ads {
domainlist ads/domains
expressionlist ads/expressions
urllist ads/urls
redirect http://192.168.0.1/block/ads.html
}
dest adult {
domainlist adult/domains
urllist adult/urls
redirect http://192.168.0.1/block/adult.html
}
...
...
...
dest webmail {
domainlist webmail/domains
urllist webmail/urls
redirect http://192.168.0.1/block/webmail.html
}
dest whitelist {
domainlist whitelist/domains
urllist whitelist/urls
redirect http://192.168.0.1/block/whitelist.html
}
# Ну а теперь непосредственно делаем раздачу слонов.
acl {
clients {
pass !ads !adult ... !porn !warez all
}
# Себе разрешаем все, кроме баннеров
admins {
pass !banner all
}
# И наконец, задаем правило по умолчанию - всем все запрещаем.
default {
pass none
redirect http://192.168.0.1/block/default.html
}
}
Тестирование
Теперь наша связка готова и можно преступить к ее тестированию. Для этого запускаем squid.
# service squid start Starting squid: . [ OK ] # cat /var/log/squid/cache.log | grep helper 2006/10/25 16:50:11| helperOpenServers: Starting 5 'squidGuard' processes 2006/10/25 16:50:11| helperOpenServers: Starting 5 'ncsa_auth' processes
В любимом интеренет проводнике открываем какую-нибудь страничку, при этом в логах должно быть следующее
1161784565.905 23 192.168.0.100 TCP_MISS/200 4765 GET http://sys-adm.org.ua/test.php admin DIRECT/sys-adm.org.ua text/html
Ну вот собственно и вся настройка. Теперь осталось лишь настроить какой-нибудь анализатор логов squid (sarg, lightsquid) и радоваться жизни. Блокировка ip адресов
Допустим, вы закрыли пользователю test доступ на сайт sys-adm.org.ua. Т.е. добавили этот сайт в файл domains.diff и произвели обновление БД. Но этого недостаточно, если пользователь немного разбирается в основах интернет технологий, то он сможет узнать какой адрес соответствует имени sys-adm.org.ua и заходить на этот сайт уже по ip адресу.
Для исключения такой возможности в squidGuard существует встроенное регулярное выражение in-addr с таким содержимым:
^[^:/]+://[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}($|[:/])
Т.е. если вы напишете такое правило
#
# /etc/squid/squidGuard.conf
#
src clients {
user test
}
...
...
...
acl {
clients {
pass !in-addr !ads !adult ... !porn !warez all
}
...
...
...
}
При таком правиле пользователь уже не сможет использовать ip адреса вообще. Поиск адреса в БД
Для того чтобы было удобно искать адрес в файлах domains.db и urls.db можно воспользоваться следующим скриптом.
#!/usr/bin/perl use strict; use DB_File; foreach (@ARGV) { my (%db, $key, $val); die("$_: $!\n") unless(-f); tie(%db, "DB_File", $_, O_RDONLY, 0664, $DB_BTREE) || die("$_: $!\n"); foreach $key (keys(%db)) { if($val = $db{$key}) { $val = "\"$val\""; } else { $val = "undef"; } print "$key\n"; } untie(%db); }
Пользоваться им очень легко, необходимо лишь передать путь к файлу с данными
# ./search.pl /var/lib/squidGuard/good/domains.db .mail.ru .google.com .private.com
Если вам надо найти какой то определенный сайт, то можно воспользоваться командой grep для фильтрации результатов.
# ./search.pl /var/lib/squidGuard/good/domains.db | grep mail.ru .mail.ru
Экономим трафик и ресурсы
Исследуя отчеты, созданные с помощью sarg или подобной программой, вы заметили, что очень много пользователей закачивают одни и те же файлы (причем если они большие по объему, то они не будут сохраняться в кеше), ну например - install_flash_player_8.msi
Для того чтобы сэкономить трафик и разгрузить канал можно отдавать такие файлы с локального сервера (http или ftp). Для этого необходимо использовать опцию rew | rewrite.
#
# /etc/squid/squidGuard.conf
#
src clients {
user test
}
rew local-downloads {
s@.*/flash_player_8.msi$@http://localhost/downloads/flash_player_8.msi@r
}
...
...
...
acl {
clients {
pass good !in-addr none
rewrite local-downloads
}
default {
pass none
redirect 302:http://localhost/default.html
}
}
Теперь все пользователи из группы clients при попытке закачать файл install_flash_player_8.msi с любого сайта, будут получать копию с локального веб сервера. Естественно, чтобы работало это правило необходимо создать соответствующую папку на веб сервере (downloads) и положить в нее необходимый файл.
#
# /etc/httpd/conf/httpd.conf
#
<Directory "/var/www/html/downloads">
Options -Indexes
AllowOverride None
Order allow,deny
Allow from localhost
</Directory>
# mkdir /var/www/html/downloads # chmod 550 /var/www/html/downloads/ # chown apache:apache /var/www/html/downloads/
При такой конфигурации скачать этот файл можно будет только с localhost. При попытке скачать файл с любой другой машины в логах будут подобные записи.
[Wed Oct 25 20:57:18 2006] [error] [client 192.168.0.100] client denied by server configuration: /var/www/html/downloads/flash_player_8.msi
Контроль доступа по времени
Также еще одной интересной возможностью squidGuard является ограничение доступа по времени. Например, вам необходимо сделать так, чтобы для группы clients интернет был доступен с 8:00 до 18:00 с понедельника по пятницу, т.е. в течение рабочего дня. Это легко реализуется средствами squidGuard.
#
# /etc/squid/squidGuard.conf
#
time work-hours {
weekly mtwhf 08:00-18:00
}
src clients {
user test
}
...
...
...
acl {
clients within work-hours {
pass good !in-addr none
}
default {
pass none
redirect 302:http://localhost/default.html
}
}
При таких правилах пользоваться интернетом можно будет с понедельника по пятницу с 8 утра и до 18 вечера. Учтите, что при блокировке по времени правило попадает под категорию default. Поэтому было бы логично указать на страничке default.html ограничения по времени, связанные с доступом в интернет.
Ну вот вроде и все, чем я хотел поделиться и о чем хотел рассказать. Настоятельно рекомендую прочитать документацию, которая идет вместе с squidGuard, в ней очень много интересного.
P.S. В следущей статье я расскажу как настроить анализатор логов lightsquid, для получения отчетов о использовании трафика.




