Squid и авторизация пользователей в AD по группам [2010]
Итак предыстория: опыт работы с прокси-сервером squid у меня большой, но после смены рабочего места (эх кризис) пришлось привыкать к тормознутости и неповоротливости Microsoft ISA Server, который выполнял задачи шлюза и прокси. Мириться с этим мне не хотелось, но в компании были исторически сложившиеся религиозные устои, а именно: • Все администраторы специализировались на Windows платформах • Существовало несколько ступеней доступа в сеть интернет • Руководство было немного без головы и могло запросить статистику по пользователю аж за какой-то день хрен знает какого года до нашей эры, причем все это должно было быть красиво в графиках, закорючках и с уточнением посещенных сайтов и т.д… Немного покопавшись в своей голове, взвесив все тяготы и последствия принятой инициативы, я убедил руководство отцепить резервный интернет канал от шлюза и дать мне месяц на настройку и доказательство жизнеспособности и конкурентоспособности нового творения. Конечно выбрал любимую FreeBSD. На то время уже был доступен релиз 7.2, на нем и было все построено. В качестве шлюза я развернул FreeBSD, настроил на нем IPFW с «ядерным» натом, и считалочки трафика по интерфейсам trafd (что б было о чем раз в месяц с провайдером поговорить). И внутри сети уже был развернут отдельный сервер со Squid. Распишу сразу особенности будущего прокси: • Авторизация должна проходить без участия пользователя и на основании учетных данных AD • Пользователи должны делиться на группы и иметь установленный политиками компании доступ в глобальную сеть • Статистика по пользователям должна вестись непрерывно и на протяжении бесконечно огромного времени Начнем: Для реализации задачи нам потребуется: • Squid 3.0.19 • Samba (вернее ее маленькая часть WinBIND) • Lightsquid (для подсчета трафика) По установке самбы и сквида в интернете есть куча howto, но на всякий случай повторюсь. Устанавливаем самбу:
[X] LDAP With LDAP support
[X] ADS With Active Directory support
[X] WINBIND With WinBIND support
[X] SYSLOG With Syslog support
[X] UTMP With UTMP accounting support
[X] POPT With system-wide POPT library
И собираем
/usr/ports/net/samba3/>make install clean
Копируем дефолтный конфиг и правим его для наших нужд
cd /usr/local/etc
/usr/local/etc/>cp smb.conf.sample smb.conf
/usr/local/etc/>mcedit smb.conf
#======================= Global Settings ============================
[global]
# netbios имя нашего домена
workgroup = MYDOMAIN
# Комментарий сервера
server string = Corporate Proxy Server
# Режим безопасности
security = ADS
# Указываем сети, которым разрешен досту к прокси
hosts allow = 10.201.1.
# Указываем расположение логов
log file = /var/log/samba/log.%m
# Указываем размер логов (в килобайтах)
max log size = 1024
# Указываем имя контроллера домена (Внимание! Необходимо указать контроллер
# домена,выполняющий роль PDC, если он у вас один то не заморачивайтесь. У
# меня в сети много сайтов.)
password server = dc4.mydomain.local
# Указываем полное имя нашего домена
realm = mydomain.local
# Указываем тип хранилища
passdb backend = tdbsam
# Сетевые настройки
socket options = TCP_NODELAY
# Указываем самбе, что она не является PDC
local master = no
os level = 0
domain master = no
preferred master = no
domain logons = no
# Настройки кодировки
display charset = koi8-r
unix charset = koi8-r
dos charset = cp866
# Настройки winbind
winbind use default domain = no
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
Теперь необходимо внести изменения в nsswitch.conf для того, чтобы winbind получал информацию из AD. Нужно исправить всего две строки:
group: files winbind
passwd: files winbind
Теперь добавляем наш сервер в домен
//>net ads join -U user%pass
Using short domain name -- MYDOMAIN
Joined 'FREEBSD' to realm ‘mydomain.local’
Внимание!!! User – имя пользователя с привилегиями добавлять машины в домен (для особо непонятливых – это либо администратор домена, либо пользователь, которому были делегированы права администратором на сею экзекуцию тачек), pass – пароль этого пользователя! Теперь настроим запуск winbind вместе с системой, добавляем в rc.conf следующие строки:
winbindd_enable="YES"
winbindd_flags="-d 1"
Осталось указать пользователя, от имени которого будет проходить аутентификация (для этих целей я создал отдельного пользователя, и делегировал ему нужные права (если не хочется заморачиваться дайте ему права администратора домена))
Все с самбой разобрались. Для упрощения своей работы по описанию установки и настройки самбы было взято первое попавшееся на глаза вменяемое howto. Оригинал здесь: http://sys-adm.org.ua/www/squid-ad.php
Теперь займемся установкой и настройкой Squid'a. Устанавливаем:
[X] SQUID_LDAP_AUTH Install LDAP authentication helpers
[X] SQUID_DELAY_POOLS Enable delay pools
[X] SQUID_SNMP Enable SNMP support
[X] SQUID_HTCP Enable HTCP support
[X] SQUID_CACHE_DIGESTS Enable cache digests
[X] SQUID_WCCP Enable Web Cache Coordination Prot. v1
[X] SQUID_IDENT Enable ident (RFC 931) lookups
[X] SQUID_ARP_ACL Enable ACLs based on ethernet address
Устанавливаем
/usr/ports/www/squid30/>make install clean
Теперь перейдем к настройке (Внимание! Конфиг Squid'a очень большой. Я его переписывал почти полностью! Последовательность TAG должна быть как у меня.)
//>mcedit /usr/local/etc/squid/squid.conf
# Указываем Squid как проводить аутентификацию:
auth_param ntlm program /usr/local/bin/ntlm_auth --helper-protocol
=squid-2.5-ntlmssp
auth_param ntlm children 5
auth_param ntlm keep_alive on
authenticate_cache_garbage_interval 15 minute
authenticate_ttl 5 minute
auth_param basic program /usr/local/bin/ntlm_auth --helper-protocol
=squid-2.5-basic
auth_param basic children 5
auth_param basic realm Squid Proxy-Server
auth_param basic credentialsttl 20 minute
auth_param basic casesensitive off
# Теперь указываем Squid где брать информацию о группах пользователей
external_acl_type nt_group %LOGIN /usr/local/libexec/squid/wbinfo_group.pl
# Рекомендованная минимальная конфигурация:
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/80.0.0.0/32
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
# Описываем основные порты (с вашего позволения из этого списка я убираю
# порты для управления активным оборудованием, службами и сервисами, в т.ч.
# порты доступа по ssh (эти порты у меня не стандартные, что рекомендую
# всем остальным))
acl SSL_ports port 563 # snews
acl Safe_ports port 80 # http
acl FTP port 2021 # 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 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 110 # POP3
acl Safe_ports port 25 # SMTP
acl purge method PURGE
acl CONNECT method CONNECT
# Указываем пулы адресов нашей сети/сетей
acl lan src 10.201.1.0/255.255.255.0
# Указываем диапазоны адресов серверных платформ, нуждающихся в обновлении
# через интернет
# В моем случае это сервера WSUS, Symantec Endpoint Protection Manager и т.д.
acl Servers src 10.201.1.1-10.201.1.49
# Указываем адреса машин, которым интернет доступен без ограничений
# скорости (правильно админские)
acl Speed_Internet src 10.201.1.10110.201.1.102
# Указываем диапазон адресов пользователей FTP
acl FTPusers src 10.201.1.101-10.201.1.102
# Указываем расположение и назначение словарей доступа в сеть интернет:
acl url-updates dstdomain "/usr/local/etc/squid/url-updates.txt"
# Список сайтов для обновления серверов
acl url-mail-ru dstdomain "/usr/local/etc/squid/url-mail-ru.txt"
# Доступ к почте mail.ru
acl url-good dstdomain "/usr/local/etc/squid/url-good.txt"
# Список разрешенных сайтов (доступ к этим сайтам будет возможен
# даже пользователям, кторым доступ в интернет запрещен)
acl urls-good urlpath_regex -i "/usr/local/etc/squid/urls-good.txt"
# Тоже самое только по протоколу https
acl url-bad dstdomain "/usr/local/etc/squid/url-bad.txt"
# Список запрещенных сайтов
acl urls-bad url_regex -i "/usr/local/etc/squid/urls-bad.txt"
# Тоже самое только по протоколу https
acl url-webmail dstdomain "/usr/local/etc/squid/url-webmail.txt"
# Список web-mail
acl urls-webmail url_regex -i "/usr/local/etc/squid/inet-webmails.txt"
# web-mail по https
acl url-porno url_regex -i "/usr/local/etc/squid/url-porno.txt"
# Список порносайтов
acl url-audio dstdomain "/usr/local/etc/squid/url-audio.txt"
# Списки аудиоконтента
acl url-banners url_regex -i "/usr/local/etc/squid/url-banners.txt"
# Список баннеров
acl url-JAVA dstdomain "/usr/local/etc/squid/url-java.txt"
# Список сайтов, использующих для работы JAVA-#апплеты
acl url-netshare dstdom_regex -i "/usr/local/etc/squid/url-netshare.txt"
# Списки netshare
acl url-redirector dstdom_regex -i "/usr/local/etc/squid/url-redirector"
# Список анонимайзеров
acl urls-redirector url_regex -i "/usr/local/etc/squid/urls-redirector"
# Тоже самое по https
#########################################################
Многие спросят нахрена одно и тоже и так много, ведь можно все объединить
в один файл. Объясняю: во-первых часть списков будет содержать не адреса
сайтов а регулярные выражения в ссылках, по которым сайты будут блокироваться
(очень актуально для порнухи и web-mail ибо банить их просто устанешь).
Так же данные ограничения буду применяться по разному для разных
групп пользователей
#########################################################
# Указываем группы доступа
acl inet-admins external nt_group inet-admins # Доступ для админов
acl inet-directors external nt_group inet-directors # Как же их любимых
# с пользователями то ровнять
acl inet-mail.ru external nt_group inet-mail.ru # Избранные с правом
# доступа на почту mail.ru
acl inet-servers external nt_group inet-servers # Группа для обновлений
# серверов
acl inet-users external nt_group inet-users # Бедняги обычные смертные
acl inet-webmail external nt_group inet-webmail # Группа пользователей с
#голубой кровью, испытывающих #недостатки в работе с корпоративной почтой
# и предпочитающей альтернативы (думаю везде есть такие #уникумы)
acl GET method GET
acl inet-ftp external nt_group inet-ftp # Пользователи которым разрешен
# доступ к ftp-серверам
# TAG: http_access
# Теперь начинаем процесс естественной селекции, указывая
# кому что можно, а именно сопоставляем группы пользователей
# с ранее указанными словарями
# Для начала вводим ограничения по портам
http_access allow manager lan
http_access allow purge localhost
http_access deny !Safe_ports !FTP
http_access deny CONNECT !SSL_ports
http_access deny manager
http_access deny to_localhost
http_access allow localhost
http_access allow purge localhost
http_access deny purge
url_rewrite_access deny localhost
# Теперь указываем права доступа по словарям
http_access deny FTP !FTPusers
http_access allow url-JAVA
http_access allow url-good
http_access allow urls-good
http_access deny urls-bad
http_access deny url-bad
http_access deny urls-redirector
http_access deny url-redirector
# Теперь указываем в каких группах используются какие словари
http_access allow inet-directors !url-netshare
http_access allow url-mail-ru inet-mail.ru
http_access allow inet-webmail !url-porno !url-netshare
http_access allow url-updates inet-servers
http_access allow inet-mail.ru !url-webmail !urls-webmail !url-
porno !url-netshare
http_access allow inet-admins !url-mail-ru !url-webmail !urls-
webmail !url-porno
http_access allow inet-ftp !url-bad !urls-bad !url-webmail !urls-
webmail !url-porno
http_access allow inet-users !url-mail-ru !url-good !url-bad !urls-
bad !url-webmail !urls-webmail !url-porno !url-audio !url-banners !url-
netshare !url-redirector !urls-redirector !inet-ftp
# Напоследок стандартные правила
http_access deny all
http_reply_access allow all
icp_access allow all
# Указываем порт, на котором будет слушать Squid
http_port 3128
# MEMORY CACHE OPTIONS
# --------------------------------------------------------------------
# TAG: cache_mem (bytes)
cache_mem 256 MB
# TAG: maximum_object_size_in_memory (bytes)
maximum_object_size_in_memory 80 KB
# DISK CACHE OPTIONS
# --------------------------------------------------------------------
# TAG: cache_dir
cache_dir ufs /usr/local/squid/cache 102416256
# TAG: minimum_object_size (bytes)
#Default:
minimum_object_size 10 KB
# TAG: maximum_object_size (bytes)
#Default:
maximum_object_size 32 MB
# TAG: cache_swap_low (percent, 0-100)
# TAG: cache_swap_high (percent, 0-100)
#
cache_swap_low 90
cache_swap_high 95
# LOGFILE OPTIONS
# -------------------------------------------------------------------
# TAG: access_log
access_log /usr/local/squid/logs/access.log squid
# TAG: pid_filename
pid_filename /usr/local/squid/logs/squid.pid
# TAG: ftp_user
ftp_user unix@mydomain.ru
# TAG: ftp_passive
ftp_passive on
# OPTIONS FOR TUNING THE CACHE
# --------------------------------------------------------------------
# TAG: cache
acl QUERY urlpath_regex cgi-bin \?
# TAG: refresh_pattern
#Suggested default:
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern (cgi-bin|\?) 0 0% 0
refresh_pattern . 0 20% 4320
# TAG: quick_abort_min (KB)
# TAG: quick_abort_max (KB)
# TAG: quick_abort_pct (percent)
quick_abort_pct 80
# ADMINISTRATIVE PARAMETERS
# -------------------------------------------------------------------
# TAG: cache_mgr
cache_mgr admins@mydomain.ru
# TAG: cache_effective_user
cache_effective_user squid
# TAG: delay_access
delay_access 1 allow url-bad !Speed_Internet
delay_access 2 allow Speed_Internet
delay_access 2 allow url-updates
delay_access 3 deny all
delay_access 4 allow lan !Speed_Internet
delay_access 4 deny all
delay_access 1 allow urls-bad !Speed_Internet
delay_access 1 allow url-audio !Speed_Internet
delay_access 2 deny all
# TAG: delay_parameters
delay_class 12
delay_class 22
delay_class 33
delay_class 42
delay_parameters 132000/1280008000/8000
delay_parameters 2250000/1000000125000/512000
delay_parameters 364000/512000125000/200000032000/1000000
delay_parameters 4250000/200000032000/512000
# TAG: delay_initial_bucket_level (percent, 0-100)
delay_initial_bucket_level 50
# TAG: error_directory
error_directory /usr/local/etc/squid/errors/Russian-1251
# TAG: hosts_file
hosts_file /etc/hosts
# TAG: fqdncache_size (number of entries)
fqdncache_size 16386
# TAG: memory_pools_limit (bytes)
memory_pools_limit 64 MB
# TAG: forwarded_for on|off
forwarded_for off
# TAG: cachemgr_passwd
cachemgr_passwd "your password” all
# TAG: coredump_dir
coredump_dir /usr/local/squid/cache
no_cache deny QUERY manager localhost to_localhost SSL_ports CONNECT url-
JAVA
visible_hostname proxy.mydomain.local
dns_nameservers 10.201.0.110.201.1.1
Все с настройкой squid’a закончили. Теперь необходимо внести соответствующие изменения: Создаем словари в директории /usr/local/etc/squid/ Примеры содержания словарей.
Создаем группы пользователей в AD. Внимание группы должны располагаться в корне AD. Хоть убей, но я так и не смог заставить Squid читать группы из разных Организационных юнитов, поэтому создал их в корне. Список нужных нам групп: inet-admins inet-directors inet-mail.ru inet-servers inet-users inet-webmail inet-ftp
Внимание: при создании группы учитывать: тип группы – глобальная группа распространения!
Теперь добавляем пользователей в нужные группы! Добавляем Squid в rc.conf
squid_enable=”YES”
Теперь для простоты использования сего творения сочиняем пару простеньких скриптиков. Директорию размещения скриптов оставляю вам на выбор. Первый скрипт поможет нам перезагружать все это безобразие «одной кнопкой». Я его обозвал коротко и локанично «restart_all»
Данный скрипт перезапускает winbind, проверяет связь с AD и перезапускает Squid. И второй скриптик более важный. Он не перезагружает демонов, а заставляет Squid перечитать словари доступа, что требуется значительно чаще. Хоть по содержанию он совсем прост.
#!/bin/sh
/usr/local/etc/rc.d/squid reload
Последний скрипт пихаем в cron с частотой запуска примерно раз в 2 часа (хотя нужды у всех разные и решать это опять Вам).
Теперь осталось дать доступ виндовым админам к нашим файликам доступа пользователей. Каким образом вы это сделаете решать тоже вам, лично я их расшарил по сети, а случайным образом придуманное расширение .txt не заставит бедняг рвать волосы на голове не понимая как это открывать… А всю работу сделает скриптик в кроне. Подсчетом статистики у меня занимается lightsquid. Писать про его настройку я не стану. В интернете про это написаны даже докторские диссертации.
Здравствуйте, отличная статья, думаю нужно знать некоторые полезные команды при настройке squid: после редактирования конфига обязательно используйте вот эту команду: squid -k parse, она проверит файл на наличие синтаксических ошибок. Для того, чтобы squid применил внесенные в конфиг изменения без перезапуска самого "себя")), т.е просто перечитал свой конфиг и применил изменения, делаем так:
squid -k reconfigure
Я кстати написал о том, как я настраивал squid на работы с AD вот ссылка http://www.artcom-ufa.ru/posts/2012/07/28/nastroika-squid
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]