Авторизация пользователей squid в домене с доступом к ресурсам по группам [2008]
Итак. Дошли руки до корпоративной прокси. Старая была на линухе, что не есть гуд - моё отношение к помойке хоршо известно. Хотя основным фактором стало не это - доступ рулился через текстовые файлы, хотя авторизовлись все в AD. Плюс конфиг был ну абсолютно непрозрачный - сказалось то что её, в общей сложности, админили 5 человек - и понять откуда растут рога вообще не представлялось возможным. Итак, задача - на правильной ОС поднять правильно настроенную проксю - т.е. авторизация в AD и руление доступа виндовыми группами через ту же AD - чтобы не напрягать ночных дежурных администраторов - пользователей в основном заводят они. Под это дело был выделен сервак - HP Proliant 380 G3, 2 ксенона по 3 чтоли гигарца, 4Gb RAM, и 6 "косых" U320 SCSI дисков (2x73G и 4x36G 10000RPM - разного размера, потому и косые). Соотвествено - под кэш были выделены 4 мелких - в 10 раид, под систему и логи - 2 больших, зеркалом. Получилось так:
Одной из задач было использовать sqstat - поэтому пришлось отказаться от squidGuard в пользу родных методов ограничения сквида - при использовании внешних редиректоров пропадает "живая" статистика. Поехали. Ставим самбу:
squid$ cd /usr/ports/net/samba3/
squid$ make install clean
В вылезшем окошке расставляем такой набор галок:
+--------------------------------------------------------------------+
| Options for samba 3.0.26a_1,1 |
| +----------------------------------------------------------------+ |
| | [X] LDAP With LDAP support | |
| | [X] ADS With Active Directory support | |
| | [ ] CUPS With CUPS printing support | |
| | [X] WINBIND With WinBIND support | |
| | [ ] ACL_SUPPORT With ACL support | |
| | [ ] FAM_SUPPORT With File Alteration Monitor | |
| | [ ] SYSLOG With Syslog support | |
| | [ ] QUOTAS With Disk quota support | |
| | [ ] UTMP With UTMP accounting support | |
| | [ ] MSDFS With MSDFS support | |
| | [ ] PAM_SMBPASS With PAM authentication vs passdb backends | |
| | [ ] CLUSTER With experimental cluster support | |
| | [ ] DNSUPDATE With dynamic DNS update | |
| | [ ] EXP_MODULES With experimental modules | |
| | [X] POPT With system-wide POPT library | |
+-+----------------------------------------------------------------+-+
| [ OK ] Cancel |
+--------------------------------------------------------------------+
Заметим, что в современных версиях FreeBSD керберос из портов ставить не обязательно - прекрасно работает и без него. После инсталляции самбы, рисуем для неё такой конфиг:
squid$ more /usr/local/etc/smb.conf
# SAMBA for SQUID
[global]
workgroup = MYDOMAIN
security = ADS
password server = MYDOMAIN.LOCAL
realm = MYDOMAIN.LOCAL
netbios name = SQUID
server string = Proxy server of mydomain.local
# log level = 10
log file = /var/log/samba/%m.%U.log
max log size = 50000
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind use default domain = yes
display charset = koi8-r
unix charset = koi8-r
dos charset = 866
# for mail
template homedir = /usr/home/%D/%U
template shell=/bin/csh
# added by lissyara 2007-06-21 in 10:36
#magic script = /root/scripts/create_user_dir.sh %U
[printers]
comment = All Printers
path = /var/spool/samba
printable = Yes
browseable = No
use client driver = yes
public = No
squid$
squid$ more /etc/nss
nsswitch.conf nsswitch.conf.orig
squid$ more /etc/nsswitch.conf
group: files winbind
passwd: files winbind
group_compat: nis
passwd_compat: nis
hosts: files dns
networks: files
shells: files
squid$
Особых комментариев нет - всё это я уже рассказывал раньше, в статье про samba и ACL. Далее - ставим собственно сквид:
squid$ cd /usr/ports/www/squid
squid$ make install clean
В окошке снимаем все галки - мне так ничё не нужно от него кроме авторизации и кэширования. Первый же возникающий вопрос - почему не ставил третий сквид? Ставил. Работает. Синтаксис как у 2.6 - но, QIP, сцуко, не может нативно авторизоваться. Авторизовалка ntlm у него кривая... Пришлось снести и поставить squid2.6. После инсталляции, занимаемся самбой - надо ввести её в домен, но, вначале получаем билетик керберос:
Всё нормально. Теперь проверяем работу хелпера отвечающего за группы. Это несложный перловый скрипт идущий в комплекте со сквидом - он тупо вызывает wbinfo на тему поиска СИДа группы, и ещё разок на тему принадлежности юзера к группе с найденным SID. Всё просто, но по три форка на запрос. Будет ли он кэшировать найденные значения - выясниться позже, когда запустим и посмотрим на скорость изменения PID`ов в шапке top`a (могу сразу успокоить - кэширует :))). Итак, проверяем хелпер:
Работает. Тока косяк - не удалось ему впарить группу (или юзера) с пробелом в названии - что для меня не очень существенно, всё равно для разруливания прав будут созданы отдельные группы - разумеется без пробелов. Заметим, что сам wbinfo - прекрасно обрабатывает и группы и имена пользователей с пробелами. В принципе, допилить наверно несложно, но - у меня желания нет. Если кому понадобиться - пилите и шлите разработчикам - будет со следующих версий всем щассье. Далее, проверяем хелпер самого сквида:
'akeda' - это мой логин, 'my_password' - пароль. Всё нормально, пашет. Конечно, в итоге будет всё не так гладко, т.к. сквид запускается не от рута, от которого я запускал данный хелпер, и у него не хватит прав на доступ к сокету winbindd - поэтому, заранее исправляем сиё досадное упущение:
squid$ cat /usr/local/etc/squid/squid.conf
# squid conf
# начат lissyara, 2007-10-25 в 13:25
# порт где слушаем
http_port 3128
# список слов, которые будучи обнаруженными в URL
# вызывают обработку без кэширования
hierarchy_stoplist cgi-bin ?
# список ACL которые вызывают несовпадение с кэшем,
# и, запрос с ответом кэшироваться не будут
acl QUERY urlpath_regex cgi-bin \?
# собственно - правило что не кэшируем
no_cache deny QUERY
# сколько отдаём ему памяти (реально пожрёт втрое больше)
cache_mem 1024 MB
# Директория для кэша, числа - размер кэша в Mb,
# число директорий первого уровня, число директорий второго
# уровня в каждой директории первого.
cache_dir ufs /shares/squid/cache 5000064512
# лог доступа - первый параметр путь, второй - формат
# форматы описаны в дефолтовом файле.
access_log /var/log/squid/access.log squid
# лог активности менеджера хранилища. Показывает, какие
# объекты были сохранениы/удалены из кэша и как долго.
# мне он не нужен, а места занимает прилично.
cache_store_log none
# файл hosts, проверяемый при запуске. Из него берётся
# доменное имя и добавляется к неполным адресам (которые
# не содержат ни одной точки в имени)
hosts_file /etc/hosts
# домен добавляемый к неполным именам
append_domain .mydomain.local
# директория где хранятся HTML c текстами ошибок
error_directory /usr/local/etc/squid/errors/Russian-1251
# программа редиректор (у меня сквидгард) для более простой
# и тонкой настройки правил использования инета
#redirect_program /usr/local/bin/squidGuard -c \
# /usr/local/etc/squid/squidguard.conf
# число процессов редиректора
#redirect_children 20
#cache_log /usr/local/squid/logs/cache.log
#debug_options ALL,5
# авторизация
# нативная авторизация ослика
auth_param ntlm program /usr/local/bin/ntlm_auth \
--helper-protocol=squid-2.5-ntlmssp
# число детишек для авторизации - сколько процессов запускать
auth_param ntlm children 30
# базовая авторизация для тех, кто не может нативную (я, например,
# т.к. сижу из под FreeBSD, да и многие программы - например,
# родной ICQ клиент от AOL)
auth_param basic program /usr/local/bin/ntlm_auth \
--helper-protocol=squid-2.5-basic
# Число процессов для базовой аворизации - значительно меньше
# чем для основной, т.к. таких юзеров/программ немного
auth_param basic children 4
# Заголовок окна выводимяй при запросе авторизации
auth_param basic realm Squid proxy-caching web server
# время жизни авторизации - сколько кэшировать данные
# (для базовой авторизации)
auth_param basic credentialsttl 2 hours
#refresh_pattern ^ftp: 1440 20% 10080
#refresh_pattern ^gopher: 1440 0% 1440
#refresh_pattern . 0 20% 4320
# внешняя ACL для разруливания по группам
external_acl_type nt_group %LOGIN \
/usr/local/libexec/squid/wbinfo_group.pl
# пользователи у которых просто интернет - с ограничениями
acl inet_users external nt_group inet_users
# пользователи у которых есть тока аська
acl inet_icq external nt_group inet_icq
# пользователи с полными парвами на доступ в инет
acl inet_full external nt_group inet_full
# люди с доступом к серверу аналитики
acl inet_analit external nt_group inet_analit
# пользователи с ограниченным доступом в инет - тока
# определённый набор ресурсов и всё.
acl inet_restrict external nt_group inet_restrict
# Пользователи которым разрешён метод CONNECT
acl inet_connect external nt_group inet_connect
# ACL авторизации на проксе
acl MYDOMAIN proxy_auth REQUIRED
# Описываем порты на которые разрешено лазить
acl SSL_ports port 443563
acl SSL_for_client_banks port 91084434500
# порты на которе можно ходить юзерам
acl safe_ports port 80 # http
acl safe_ports port 21 # ftp
acl safe_ports port 443 # ssl
acl ICQ_ports port 5190 # ICQ
# надо ли? 1025-65535
acl CONNECT method CONNECT
# для /usr/ports/www/sqstat/
# копируете конфиг, ставите вместо 'host' - 'user'
# и начальство не оторвать от экрана :))
acl manager proto cache_object
# Описываем все сети все IP
acl all src 0.0.0.0/0.0.0.0
# описываем локалхост
acl localhost src 127.0.0.1/255.255.255.255
# acl до сайтов которые разрешены всем]
acl mydomain_site dstdomain \
"/usr/local/etc/squid/db/allow_all.txt"
# запрещённые в URL выражения (для всего УРЛа)
acl bad_url url_regex \
"/usr/local/etc/squid/db/deny_url.txt"
# запрещённые в URL выражения (для самого урла, без домена)
#acl bad_url_2 urlpath_regex \
# "/usr/local/etc/squid/db/deny_url_2.txt"
# запрещённые доменные имена
acl deny_domains dstdomain \
"/usr/local/etc/squid/db/deny_domains.txt"
# acl для клиент-банков и прочих кому надо напрямую ходить
acl client_banks dst \
"/usr/local/etc/squid/db/clinet_banks.txt"
# сети в которые ходить не надо (ICQ и прочия)
acl bad_networks dst \
"/usr/local/etc/squid/db/bad_networks.txt"
# те кто ходят без авторизации
acl not_autorized src \
"/usr/local/etc/squid/db/not_autorized.txt"
# список сайтов для тех у кого их определённый набор
acl domains_for_restrict dstdomain \
"/usr/local/etc/squid/db/domains_for_restrict.txt"
### настройки доступа ####
# вводим свои определения для сообщений о
# отказе по ACL - пригодиться когда кто-то
# воет что не может попасть на определённый сайт
deny_info ERR_BAD_URL bad_url
deny_info ERR_BAD_NETWORKS bad_networks
deny_info ERR_DENY_DOMAINS deny_domains
deny_info ERR_SAFE_PORTS safe_ports
deny_info ERR_SSL_PORTS SSL_ports
# пропускаем sqstat
http_access allow manager localhost
http_access deny manager
# выпускаем на неавторизуемые сайты
http_access allow client_banks
# выпускаем тех кто не авторизуется в принципе
# т.к. они не в домене и т.п.
http_access allow not_autorized
# Разрешаем всем доступ на сайт конторы
# Этим же правилом срубаются все неавторизованные
http_access allow MYDOMAIN mydomain_site
# Разрешаем доступ ко всему группе 'inet_full'
http_access allow inet_full all
# Зарубаем запрещённые куски url
http_access deny bad_url
# Разрешаем асечный порт тем у кого есть аська
http_access allow inet_icq ICQ_ports
# зарубаем запрещённые сети
http_access deny bad_networks
# зарубаем запрещённые домены
http_access deny deny_domains
# Зарубаем коннект кроме как к SSL (надо ли группе отдельной?)
http_access deny CONNECT !SSL_ports
# зарубаем все порты проме safe_ports
http_access deny !safe_ports
# разрешаем инет обычным пользователям
http_access allow inet_users
# разрешаем инет ограниченным пользователям на разрешённые сайты
http_access allow inet_restrict domains_for_restrict
# зарубаем всё нах :)
# Для начала кустомизируем сообщение о ошибке.
# ERR_INET_NO_ALLOW - это имя файла в
# /usr/local/etc/squid/errors/Russian-1251
# синтаксис описан
# http://wiki.squid-cache.org/SquidFaq/MiscFeatures
deny_info ERR_INET_NO_ALLOW all
http_access deny all
Сам конфиг хорошо прокомментирован, поэтому, дополнительные камменты не делаю, тока привожу файлики которые в нём фигурируют:
squid$ more /usr/local/etc/squid/db/allow_all.txt
# файл с сайтами доступ на которые разрешён всем
squid
mydomain.ru
ttb.kz
squid$
squid$ more /usr/local/etc/squid/db/deny_domains.txt
# файл со списком запрещённых доменов
# если надо весь домен с субдоменами - в начало
# надо поставить точку
# из файла mydomain_bad
download.zachot.ru
goblin.faberz.com
muzoff.ru
.udaff.ru
.udaff.com
.ziza.ru
.rapidshare.de
stream.fluendo.com
realaudio.aradio.ru
.mp3real.ru
files.rfonline.ru
files1.rfonline.ru
files2.rfonline.ru
files3.rfonline.ru
.proxy80.com
.cloakme.net
stream03.rambler.ru
.odnoklassniki.ru
.odnoklasniki.ru
.mamba.ru
.cirota.ru
.vkontakte.ru
.youtube.com
.video.google.com
# из сквидгарда - аудио-видео
123mp3links.tsx.org
128.242.103.21128.242.103.22128.242.103.23
squid$ more /usr/local/etc/squid/db/deny_url.txt
# url на котоые нельзя никому кроме тех у кого полный доступ
#
# ya[a-z/0-9/-]+dex\.ru диапазон буквы (мелкие), цифры и дефис
# ya.+ex\.ru - всё что начинается на ya и кончается на ex.ru
# объединение (gaz|plan)(eta) порубаются gazeta planeta
# Ахтунг! Длинна строки имеет ограничения, когда оно превышено он
# тупо отсекает лишнюю часть и ругается на несбалансированные
# скобки (у меня такое было на регулярных выражениях)
porn
sex
# из скивдгарда - реклама
/ads/
/ad/
/banner/
/sponsor/
/event.ng/
/Advertisement
/adverts/
# из сквидгарда - сайты для взрослых
# ... покоцано ... строки длинные - дезигн портят :)
#из сквидгарда - аудио-видео
\.(ra?m|wma|mp2|mpv2|mp3|asx)($|\?)
\.(mpe?g?|wmv|mov|movie|qt|avi|dvd?|divx|flv|iflv)($|\?)
\.(iso|exe|vbs)($|\?)
squid$ more /usr/local/etc/squid/db/clinet_banks.txt
# всякие назначения на которые надо попадать напрямую
# WU
206.211.228.242/32206.211.227.242/32
# RF
217.227.42.3/32
# STC ATNN
213.191.224.0/19
# SB
213.85.162.11/32193.33.122.18/32194.84.227.220/32
squid$ more /usr/local/etc/squid/db/bad_networks.txt
# сети в которые ограничен доступ - ICQ и прочия
# переенсены из конфига старого прокси
81.19.68.114/32217.16.18.76/32
# ICQ
64.12.0.0/16205.188.0.0/16
squid$ more /usr/local/etc/squid/db/not_autorized.txt
# те кто ходят неавторизованными
# _guests
172.30.105.38/32172.30.101.17/32
# notariat
172.30.19.92/32172.30.19.93/32172.30.19.103/32
squid$
squid$ more /usr/local/etc/squid/db/domains_for_restrict.txt
# список доменов для юзеров с ограниченным доступом в инет.
# из файла good
mydomain.ru
localhost.mydomain.local
maps.yandex.ru
img.yandex.net
img.yandex.ru
postindex.otrok.ru
# из файла good
mts.ru
gismeteo.ru
yandex.ru
После рисовки всех конфигов, делаем сквида владельцем директории с кэшем, и создаём субдиректории:
squid$ chown -R squid:wheel /shares/squid
squid$ squid -z
2007/10/2912:38:02| Creating Swap Directories
2007/10/2912:38:02| /shares/squid/cache exists
2007/10/2912:38:02| Making directories in /shares/squid/cache/002007/10/2912:38:02| Making directories in /shares/squid/cache/012007/10/2912:38:02| Making directories in /shares/squid/cache/022007/10/2912:38:02| Making directories in /shares/squid/cache/032007/10/2912:38:02| Making directories in /shares/squid/cache/042007/10/2912:38:02| Making directories in /shares/squid/cache/052007/10/2912:38:03| Making directories in /shares/squid/cache/062007/10/2912:38:03| Making directories in /shares/squid/cache/072007/10/2912:38:03| Making directories in /shares/squid/cache/082007/10/2912:38:03| Making directories in /shares/squid/cache/092007/10/2912:38:03| Making directories in /shares/squid/cache/0A
2007/10/2912:38:03| Making directories in /shares/squid/cache/0B
2007/10/2912:38:03| Making directories in /shares/squid/cache/0C
2007/10/2912:38:04| Making directories in /shares/squid/cache/0D
2007/10/2912:38:04| Making directories in /shares/squid/cache/0E
2007/10/2912:38:04| Making directories in /shares/squid/cache/0F
squid$
Всё. Запускаем и юзаем.
P.S. С вопросами - в форум а не в камменты - камменты для косяков. P.S.2 По дефолту, ОС не отдайт приложению более 512 мегов рамы, поэтому на реальной эксплуатации было замечено, что сквид регулярно отлетает на этом числе используемой оперативки. Решение: