вторник, 22 января 2013 г.

Установка и настройка proxy SQUID с интеграцией в AD и программы отчетов free-sa



     В моей карьере произошли некоторые изменения, я больше не работаю на Ярославском радиозаводе. Покидаю эту фирму с большой благодарностью коллективу и лично бывшему моему начальнику отдела ИТ Александру Воронину. Мы сделали много интересных проектов и всегда работали в хорошем контакте.Но новая работа сулит новые горизонты, так устроен мир.
     Итак, на новом месте, помимо довольно стандартных задач создания "с нуля" всей инфраструктуры по новым корпоративным стандартам, потребовалось найти нормальное решение для прокси-сервера с авторизацией в домене, по возможности не требующее значительных затрат - фирма большая, более 20 филиалов в разных городах России, и продолжает расти. Понятно, что покупать под это дело в каждый филиал Forefront TMG плюс лицензию на Windows Server довольно накладно будет и вряд ли оправданно, когда есть вполне адекватные open source решения. Поэтому решили воспользоваться традиционным SQUID с авторизацией пользователей в домене. Привожу это решение, так как в Интернет не часто можно найти на эту тему законченное работоспособное описание, обычно все описывается лишь в общих чертах. Вполне может кому-то пригодиться, особенно новичкам в этом деле. Хотя, если не слишком углубляться в настройки, для минимально необходимых функций все достаточно просто.


     Я использовал ubuntu-server 12.04. Прежде всего ставим необходимые компоненты для прокси и самбы:

apt-get install squid3 ldap-utils samba winbind samba-common-bin

Далее для настройки самбы нужно остановить ее и winbind:

/etc/init.d/smbd stop
/etc/init.d/winbind stop

Редактируем конфиг Samba:

nano /etc/samba/smb.conf

(В примере используем домен brand.domain.local с контроллером pdc.brand.domain.local - это просто имя одного из контроллеров домена AD

workgroup = BRAND
password server = pdc.brand.domain.local
security = ads
realm = brand.domain.local
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind use default domain = yes
winbind enum users = yes
winbind enum groups = yes
# server string is the equivalent of the NT Description field
server string = Proxy Server

Присоединяем прокси-сервер к домену и проверяем доступность домена
   
   net ads join –U administrator
   /etc/init.d/smbd start
   /etc/init.d/winbind start
      
    Понятно, что учетная запись должна иметь права для присоединения к домену и потребует авторизации.

      Проверяем доступность домена:

   wbinfo –t

должен быть получен следующий ответ:

checking the trust secret for domain BRAND via RPC calls succeeded

Проверяем возможность подключения пользователя с правами присоединиения к домену и чтения каталогов ( вообще, можно использовать и учетку доменного администратора, не создавая специальную)

wbinfo -a BRAND\\user%'password'

ответ должен быть таким

plaintext password authentication succeeded
challenge/response password authentication succeeded

Добавляем пользователя proxy в группу winbindd_priv  

gpasswd -a proxy winbindd_priv

Если все в порядке и нужные ответы получены, переходим к редактированию конфига самого SQUID:

nano /etc/squid3/squid.conf

# Host_name 
append_domain .brand.domain.local
visible_hostname Squid

#Это просто почта администратора SQUID, которая, например, будет отображаться на странице запрета доступа к сайту
cache_mgr
brand@domain.local 

### pure ntlm authentication
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 30
auth_param ntlm keep_alive on

### basic
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

#Location_Of_Windows_Groups
external_acl_type
nt_group %LOGIN /usr/lib/squid3/wbinfo_group.pl

#ACLs
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl blacklist url_regex -i "/etc/squid3/blacklist.acl"
acl update url_regex -i "/etc/squid3/update.acl"
acl whitelist url_regex -i "/etc/squid3/whitelist.acl"

#ACLs_Windows_Groups (ACL называется inet_users, а InetUsers это группа в домене, куда добавлены те, кому можно ходить в интернет, понятно, что ее нужно создать в домене самому и включить в нее нужных пользователей)
acl inet_users external nt_group InetUsers

#AUTH
acl auth proxy_auth REQUIRED

# Safe_Ports
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         #filemaker
acl Safe_ports port 777
acl Safe_ports port 8088
acl Safe_ports port 8089
acl Safe_ports port 2112       # multiling http
acl chat port 5190 5222 2041 2042

acl CONNECT method CONNECT

# No_auth_access (доступ без авторизации) Почему-то не заработали нормально через прокси  некоторые клиенты чатов
http_access allow all chat
http_access allow CONNECT all chat
http_access allow all whitelist

# Auth_access (доступ с авторизацией)
http_access deny !auth
http_access allow update
http_access allow manager localhost  # это просто пример блокировки
http_access deny manager  # это просто пример блокировки
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny !inet_users
http_access deny blacklist
http_access allow auth
http_access deny all

# Client_Port
http_port 3128

#Default_conf
coredump_dir /var/spool/squid3
refresh_pattern ^ftp:           1440    20%    10080
refresh_pattern ^gopher:        1440    0%     1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern (Release|Packages(.gz)*)$      0       20%    2880
refresh_pattern .     0       20%     4320


После редактирования конфига выполняем выполняем его реконфигурирование:

Squid3 –k reconfigure

Далее для нормальной работы пользователей необходимо создать в домене группу InetUsers и включаем в нее всех тех пользователей домена, которые должны работать через прокси-сервер.  Конечно же, этого недостаточно. На самом деле еще необходимо доменной политикой принудительно задать настройки прокси-сервер в браузерах пользователей домена и запретить им самостоятельно менять настройки. Я для этого создал отдельное подразделение, включил в него всех тех же пользователей, что и в группе InetUsers, и включил на этом подразделении созданную мной политику. Рецептов этого действия в Интернет множество, они вполне корректны, желающие могут найти их самостоятельно.

Далее заполняем листы контроля доступа, например, у меня черный список /etc/squid3/blacklist.acl выглядит примерно так:

.*vkonta*
.*odnoklass*
.opera-mini.net
.vk.com
.odnoklassniki.ru
.narod.yandex.ru
.cameleo.ru
.cmla.ru
.facebook.com
.anon.fafka.ru
.anonymouse.org
.webwarper.net
.anonymizer.ru
.2ip.ru
.unlumen.ru
.hideme.ru
.chameleon-proxy.ru
.spools.com
.mmt.su
.vkoko.ru
.vkpse.com.ext.yarb.ru
.yarb.ru
.spoolls.com
.vkpse.com.ext.socialwin.ru
.socialwin.ru
.facebook.net
.dd34.ru
.youtube.com
.playflock.com
.userapi.com
.erenta.ru
.smotri.com
.loadup.ru



В основном в нем - анонимайзеры, и я регулярно добавляю их на основе анализа активности пользователей. Запись .opera-mini.net относится к серверу Opera Turbo, которым тоже можно воспользоваться для обхода запрещенных сайтов. Белый список и список сайтов обновлений заполняются аналогично.

Особо хочу отметить важную деталь - если шлюз по умолчанию, задаваемый в настройках сетевых карт пользователей динамически или статически является открытым, то есть не имеет собственного списка доступа ACL, так или иначе выполненного в зависимости от аппаратной реализации шлюза, то любой достаточно умный пользователь может легко обойти прокси-сервер при помощи portable браузера любого типа, который либо не берет настройки прокси из операционной системы принудительно, либо легко позволяет отключить эту настройку без прав локального администратора. Поэтому нужно использовать шлюз с ACL, в котором разрешен доступ во внешнюю сеть только для самого прокси-сервера или, например, привилегированного компьютера системного администратора, а остальным IP адресам прямой доступ запрещен. Cisco, например, легко это делает.

Для SQUID существует достаточно много программ формирования отчетов, но постоянной поддержки удостаиваются немногие - большинство давненько уже висят в релизах года так 2006 или даже раньше. Что касается всем известного SARG, то хотелось что-нибудь попроще и побыстрее, второе важнее. Так что я остановил свой выбор на проекте free-sa - http://free-sa.sourceforge.net/  Работает существенно быстрее SARG, есть форум сообщества, где можно порешать проблемы: http://sourceforge.net/apps/phpbb/free-sa/  Правда, проблем пока не возникало, разве что собираюсь как-нибудь зайти поглядеть, как можно будет подкорректировать интерфейс отчетов.

Прежде, чем устанавливать free-sa, доставляем необходимые пакеты:

apt-get install build-essential apache2

build-essential нужен для сборки пакетов, apache2 – веб-сервер для отображения веб-страницы с отчетами. Вполне возможно, что эти пакеты в вашей системе уже установлены, тогда вы получите соответствующее сообщение.
.      
Скачиваем исходники программы:

wget http://sourceforge.net/projects/free-sa/files/free-sa-dev/2.0.0b3p8/free-sa-2.0.0b5p10.tar.gz

Обратите внимание, что нужно использовать именно тестовую сборку – она работает нормально, а объявленные стабильными сборки сильно отстают по дате релиза. Для просмотра имеющихся сборок загляните на страницу http://sourceforge.net/projects/free-sa/files/free-sa-dev/ . На момент составления этого документа самой свежей была именно сборка 2.0.0b5p10. Если вы видите, что появилась сборка свежее, соответствующим образом измените номер сборки в конце данной команды на закачивание.
     Распаковываем полученный каталог, заходим в него и редактируем файл для управления установкой программы

tar –zxf free-sa*
cd free-sa*
nano global.mk

В файле находим и раскомментируем строку OSTYPE = ubuntu-i586-gcc4.
     
Затем устанавливаем программу free-sa

make install

Копируем и настраиваем конфиги

cp /etc/free-sa/free-sa.conf.sample
/etc/free-sa/free-sa.conf
nano /etc/free-sa/free-sa.conf

Делаем минимальную настройку конфига:


##################
# GLOBAL OPTIONS #
##################
configuration_name="/etc/free-sa/free-sa.conf"
#cache_directory="/var/cache/free-sa"
target_directory="/var/www/free-sa"
#locale=""

####################
# LOG FILE OPTIONS #
####################
log_file="/var/log/squid3/access.log"
#log_format="0"
#log_skip_errors="no"
#log_time_zone_shift="0"

##########################
# NAMES HANDLING OPTIONS #
##########################
#recipient_tolower="no"
#username_file="/etc/free-sa/usertab"
#username_is_preferred="yes"
username_resolve_ip="yes"
#username_unescape="no"

Затем:

mkdir /usr/local/etc/free-sa
cp /etc/free-sa/free-sa.conf
/usr/local/etc/free-sa/free-sa.conf
   
Настраиваем скрипт статистики и cron для автоматического выполнения задачи формирования статистики за истекший день. В Ubuntu я сделал это следующим образом, конечно, каждый может изменить задачу, как ему необходимо. У меня сбор статистики идет ежесуточно в самом конце истекших суток, и на следующее утро я уже могу видеть статистику за прошедший день. 

mkdir /etc/cron.free-sa
nano /etc/cron.free-sa/free-sa_day

#!/bin/bash
# Приложение создания отчетов по журналам SQUID
#set -x
umask 0022
free_sa=/usr/bin/free-sa
date1=`date +%x`
$free_sa -d $date1-

Устанавливаем права запуска

chmod +x /etc/cron.free-sa/free-sa_day

Редактируем cron

nano /etc/crontab

GNU nano 2.2.6                                                                 
Файл: /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
59 23    * * *  root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.free-sa )

Перезапустите cron командой /etc/inti.d/cron restart или
просто перезагрузите сервер. 

Статистика будет на странице http://your_server _ip_address/free-sa 
Примечание: пока что меня временно устроил тот вид статистики, который
отображается по умолчанию. Если вы хотите подредактирвать его под свои
потребности, можно обратиться к форуму сообщества http://sourceforge.net/apps/phpbb/free-sa/