Рассмотрим как установить и настроить прокси сервер Squid с авторизацией пользователей в Windows Active Directory (AD).
Ставим самбу:
#cd /usr/ports/net/samba34/ #make config |
В вылезшем окошке расставляем такой набор галок:
[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
И собираем
#make install clean |
Заметим, что в современных версиях FreeBSD керберос из портов ставить не обязательно - прекрасно работает и без него. После инсталляции самбы, копируем дефолтный конфиг и правим его для наших нужд
#cd /usr/local/etc #cp smb.conf.sample smb.conf #vi smb.conf
[global] # netbios имя нашего домена workgroup = local # Комментарий сервера server string = Proxy Server # Режим безопасности security = ADS # Указываем сети, которым разрешен досту к прокси hosts allow = 192.168.5. # Указываем расположение логов log file = /var/log/samba34/log.%m # Указываем размер логов (в килобайтах) max log size = 50 # Указываем имя контроллера домена (Внимание! Необходимо указать контроллер # домена,выполняющий роль PDC, если он у вас один то не заморачивайтесь. У # меня в сети много сайтов.) password server = w2003.local # Указываем полное имя нашего домена realm = 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 |
И для кербероса:
# more /etc/krb5.conf [libdefaults] default_realm = LOCAL #192.168.5.6 — ip адрес контроллера домена с AD. [realms] LOCAL = { kdc = 192.168.5.6 admin_server = 192.168.5.6 kpasswd_server = 192.168.5.6 } [domain_realms] .local = LOCAL [logging] kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmin.log default = FILE:/var/log/krb5lib.log |
А также для nsswitch:
# more /etc/nsswitch.conf group: files winbind group_compat: nis hosts: files dns networks: files passwd: files winbind passwd_compat: nis shells: files services: compat services_compat: nis protocols: files rpc: files |
Далее - ставим сквид:
# cd /usr/ports/www/squid # make install clean |
В окошке снимаем все галки - мне ничего не нужно от него кроме авторизации и кэширования.
После инсталляции, занимаемся самбой - надо ввести её в домен, но, вначале получаем билет керберос:
# kinit root root@LOCAL's Password: kinit: NOTICE: ticket renewable lifetime is 1 week |
Ну и вводим в домен:
#net ads join -U root |
Добавляем такие строки в /etc/rc.conf:
winbindd_enable="YES" squid_enable="YES" |
Мне сама самба не нужна - нужен тока винбинд, поэтому тока он. После этого запускаем самбу
#/usr/local/etc/rc.d/samba start |
Осталось указать пользователя, от имени которого будет проходить аутентификация (для этих целей я создал отдельного пользователя, и делегировал ему нужные права (если не хочется заморачиваться дайте ему права администратора домена))
#wbinfo --set-auth-user=LOCAL\\root%password $wbinfo --get-auth-user LOCAL\root%password |
Проверяем, что получилось:
#wbinfo -g #wbinfo -u |
Всё нормально. Теперь проверяем работу хелпера отвечающего за группы. Это несложный перловый скрипт идущий в комплекте со сквидом - он тупо вызывает wbinfo на тему поиска СИДа группы, и ещё разок на тему принадлежности юзера к группе с найденным SID. Всё просто, но по три форка на запрос. Проверяем хелпер:
#echo serega users | /usr/local/libexec/squid/wbinfo_group.pl OK |
Т.к. сквид запускается не от рута, у него не хватит прав на доступ к сокету winbindd - поэтому, заранее исправляем досадное упущение:
#chown root:squid /var/db/samba/winbindd_privileged |
Теперь рисуем конфиг сквида:
#cat /usr/local/etc/squid/squid.conf # squid conf # порт где слушаем 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 /usr/local/squid/cache 1024 16 256 # лог доступа - первый параметр путь, второй — формат форматы описаны в дефолтовом #файле. access_log /var/log/squid/access.log squid # лог активности менеджера хранилища. Показывает, какие объекты были #сохранениы/удалены из кэша и как долго.Мне он не нужен, а места занимает прилично. cache_store_log none # файл hosts, проверяемый при запуске. Из него берётся доменное имя и добавляется к #неполным адресам (которые не содержат ни одной точки в имени) hosts_file /etc/hosts # домен добавляемый к неполным именам append_domain .mydomain.local
# авторизация # нативная авторизация ослика 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
# внешняя 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 443 563 acl SSL_for_client_banks port 910 8443 4500 # порты на которе можно ходить юзерам 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
# Описываем все сети все 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"
### настройки доступа #### # выпускаем на неавторизуемые сайты http_access allow client_banks # выпускаем тех кто не авторизуется в принципе т.к. они не в домене и т.п. http_access allow not_autorized # Разрешаем всем доступ на сайт конторы # Этим же правилом срубаются все неавторизованные http_access allow LOCAL 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
# зарубаем всё http_access deny all |
Привожу файлики которые в нём фигурируют:
#more /usr/local/etc/squid/db/allow_all.txt # файл с сайтами доступ на которые разрешён всем ya.ru |
#more /usr/local/etc/squid/db/deny_domains.txt # файл со списком запрещённых доменов если надо весь домен с субдоменами - в начало # надо поставить точку muzoff.ru .udaff.ru .udaff.com .ziza.ru .rapidshare.de stream.fluendo.com .odnoklassniki.ru |
#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)($|\?) #и т.д. и т.п. |
#more /usr/local/etc/squid/db/clinet_banks.txt # всякие назначения на которые надо попадать напрямую # WU 206.211.228.242/32 206.211.227.242/32 |
#more /usr/local/etc/squid/db/bad_networks.txt # ICQ 64.12.0.0/16 205.188.0.0/16 |
#more /usr/local/etc/squid/db/not_autorized.txt # те кто ходят неавторизованными # _guests 172.30.105.38/32 172.30.101.17/32 |
#more /usr/local/etc/squid/db/domains_for_restrict.txt # список доменов для юзеров с ограниченным доступом в инет. maps.yandex.ru |
После рисовки всех конфигов, делаем сквида владельцем директории с кэшем, и создаём субдиректории:
#chown -R squid:wheel /shares/squid squid$ squid -z |
Всё. Запускаем и юзаем.