Squid с авторизацией в AD

Рассмотрим как установить и настроить прокси сервер 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

Всё. Запускаем и юзаем. 

unix-way