Авторизация пользователей squid в домене с доступом к ресурсам по группам


Итак. Дошли руки до корпоративной прокси. Старая была на линухе, что не есть гуд - моё отношение к помойке хоршо известно. Хотя основным фактором стало не это - доступ рулился через текстовые файлы, хотя авторизовлись все в AD. Плюс конфиг был ну абсолютно непрозрачный - сказалось то что её, в общей сложности, админили 5 человек - и понять откуда растут рога вообще не представлялось возможным.

Итак, задача - на правильной ОС поднять правильно настроенную проксю - т.е. авторизация в AD и руление доступа виндовыми группами через ту же AD - чтобы не напрягать ночных дежурных администраторов - пользователей в основном заводят они.

Под это дело был выделен сервак - HP Proliant 380 G3, 2 ксенона по 3 чтоли гигарца, 4Gb RAM, и 6 "косых" U320 SCSI дисков (2x73G и 4x36G 10000RPM - разного размера, потому и косые). Соотвествено - под кэш были выделены 4 мелких - в 10 раид, под систему и логи - 2 больших, зеркалом. Получилось так:

squid$ df -h

Filesystem Size Used Avail Capacity Mounted on

/dev/da0s1a 496M 36M 420M 8% /

devfs 1.0K 1.0K 0B 100% /dev

/dev/da1s1c 66G 108M 60G 0% /shares

/dev/da0s1d 3.9G 403M 3.2G 11% /tmp

/dev/da0s1e 7.7G 819M 6.3G 11% /usr

/dev/da0s1f 52G 17M 48G 0% /var

jabber:/shares/ports 206G 17G 172G 9% /usr/ports

squid$

Одной из задач было использовать 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/krb5.conf

#



[libdefaults]

default_realm = MYDOMAIN.LOCAL



[realms]

MYDOMAIN.LOCAL = {

kdc = MYDOMAIN.LOCAL

admin_server = MYDOMAIN.LOCAL

}



[domain_realm]

.mydomain.local = MYDOMAIN.LOCAL

[logging]

kdc = FILE:/var/log/krb5kdc.log

admin_server = FILE:/var/log/kadmin.log

default = FILE:/var/log/krb5lib.log

squid$

А также для nsswitch:

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.

После инсталляции, занимаемся самбой - надо ввести её в домен, но, вначале получаем билетик керберос:

squid$ kinit akeda

akeda@MYDOMAIN.LOCAL's Password:

kinit: NOTICE: ticket renewable lifetime is 1 week

Ну и вводим в домен:

squid$ net join -U akeda

akeda's password:

Using short domain name -- MYDOMAIN

Joined 'SQUID' to realm 'MYDOMAIN.LOCAL'

Добавляем такие строки в /etc/rc.conf:

# squid

winbindd_enable="YES"

squid_enable="YES"

Мне сама самба не нужна - нужен тока винбинд, поэтому тока он. После этого запускаем самбу

squid$ /usr/local/etc/rc.d/samba start

Performing sanity check on Samba configuration: OK

Removing stale Samba tdb files: .. done

Starting winbindd.

Проверяем, что из всего этого получилось:

squid$ id akeda

uid=10000(akeda) gid=10000(domain users) groups=10000(domain users)

squid$

squid$ wbinfo -g | wc -l

398

squid$ wbinfo -u | wc -l

1131

squid$

Всё нормально. Теперь проверяем работу хелпера отвечающего за группы. Это несложный перловый скрипт идущий в комплекте со сквидом - он тупо вызывает wbinfo на тему поиска СИДа группы, и ещё разок на тему принадлежности юзера к группе с найденным SID. Всё просто, но по три форка на запрос. Будет ли он кэшировать найденные значения - выясниться позже, когда запустим и посмотрим на скорость изменения PID`ов в шапке top`a (могу сразу успокоить - кэширует :))). Итак, проверяем хелпер:

squid$ echo akeda bank | /usr/local/libexec/squid/wbinfo_group.pl

OK

squid$ echo akeda novosibirsk_gr | /usr/local/libexec/squid/wbinfo_group.pl

ERR

squid$ echo akeda omsk_gr | /usr/local/libexec/squid/wbinfo_group.pl

ERR

squid$

Работает. Тока косяк - не удалось ему впарить группу (или юзера) с пробелом в названии - что для меня не очень существенно, всё равно для разруливания прав будут созданы отдельные группы - разумеется без пробелов. Заметим, что сам wbinfo - прекрасно обрабатывает и группы и имена пользователей с пробелами. В принципе, допилить наверно несложно, но - у меня желания нет. Если кому понадобиться - пилите и шлите разработчикам - будет со следующих версий всем щассье.

Далее, проверяем хелпер самого сквида:

squid$ ntlm_auth --helper-protocol=squid-2.5-basic --require-membership-of="mydomaindomain users" -d10 -I /tmp

[2007/10/29 10:20:29, 5] lib/debug.c:debug_dump_status(391)

INFO: Current debug levels:

all: True/10

tdb: False/0

printdrivers: False/0

lanman: False/0

smb: False/0

rpc_parse: False/0

rpc_srv: False/0

rpc_cli: False/0

passdb: False/0

sam: False/0

auth: False/0

winbind: False/0

vfs: False/0

idmap: False/0

quota: False/0

acls: False/0

locking: False/0

msdfs: False/0

dmapi: False/0

akeda my_password

[2007/10/29 10:20:30, 10] utils/ntlm_auth.c:manage_squid_request(2086)

Got 'akeda my_password' from squid (length: 16).

[2007/10/29 10:20:30, 3] utils/ntlm_auth.c:check_plaintext_auth(298)

NT_STATUS_OK: Success (0x0)

OK

^C

squid$

'akeda' - это мой логин, 'my_password' - пароль. Всё нормально, пашет. Конечно, в итоге будет всё не так гладко, т.к. сквид запускается не от рута, от которого я запускал данный хелпер, и у него не хватит прав на доступ к сокету winbindd - поэтому, заранее исправляем сиё досадное упущение:

squid$ chown root:squid /var/db/samba/winbindd_privileged

Теперь рисуем конфиг сквида:

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 50000 64 512

# лог доступа - первый параметр путь, второй - формат

# форматы описаны в дефолтовом файле.

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 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

# для /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

kkb.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.21

128.242.103.22

128.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

# всякие назначения на которые надо попадать напрямую

# Western Union

206.201.228.242/32

206.201.227.242/32

# Raiffeisen

217.227.34.3/32

# STC Atlas branch in Nizhny Novgorod

213.190.224.0/19

# Sviaz-Bank

213.85.162.11/32

193.33.122.18/32

194.84.227.220/32

squid$ more /usr/local/etc/squid/db/bad_networks.txt

# сети в которые ограничен доступ - ICQ и прочия

# переенсены из конфига старого прокси

81.19.68.114/32

217.16.18.76/32

# ICQ

64.12.0.0/16

205.188.0.0/16

squid$ more /usr/local/etc/squid/db/not_autorized.txt

# те кто ходят неавторизованными

# kkb_guests

172.30.105.38/32

172.30.101.17/32

# notariat

172.30.19.92/32

172.30.19.93/32

172.30.19.103/32

squid$

squid$ more /usr/local/etc/squid/db/domains_for_restrict.txt

# список доменов для юзеров с ограниченным доступом в инет.

# из файла good

mydomain.ru

cbr.ru

uralsib.ru

bifit.com

localhost.mydomain.local

maps.yandex.ru

img.yandex.net

img.yandex.ru

postindex.otrok.ru

proxy64

rbr.ru

# из файла good

oviont.ru

gnivc.ru

217.106.225.41

81.25.52.74

economagic.com

multitran.ru

ra-naufor.ru

mts.ru

cronos.ru

eos.ru

gismeteo.ru

kkb.kz

yandex.ru

После рисовки всех конфигов, делаем сквида владельцем директории с кэшем, и создаём субдиректории:

squid$ chown -R squid:wheel /shares/squid

squid$ squid -z

2007/10/29 12:38:02| Creating Swap Directories
2007/10/29 12:38:02| /shares/squid/cache exists
2007/10/29 12:38:02| Making directories in /shares/squid/cache/00
2007/10/29 12:38:02| Making directories in /shares/squid/cache/01
2007/10/29 12:38:02| Making directories in /shares/squid/cache/02
2007/10/29 12:38:02| Making directories in /shares/squid/cache/03
2007/10/29 12:38:02| Making directories in /shares/squid/cache/04
2007/10/29 12:38:02| Making directories in /shares/squid/cache/05
2007/10/29 12:38:03| Making directories in /shares/squid/cache/06
2007/10/29 12:38:03| Making directories in /shares/squid/cache/07
2007/10/29 12:38:03| Making directories in /shares/squid/cache/08
2007/10/29 12:38:03| Making directories in /shares/squid/cache/09
2007/10/29 12:38:03| Making directories in /shares/squid/cache/0A
2007/10/29 12:38:03| Making directories in /shares/squid/cache/0B
2007/10/29 12:38:03| Making directories in /shares/squid/cache/0C
2007/10/29 12:38:04| Making directories in /shares/squid/cache/0D
2007/10/29 12:38:04| Making directories in /shares/squid/cache/0E
2007/10/29 12:38:04| Making directories in /shares/squid/cache/0F

squid$

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

Автор: lissyara

Обновлено: 12.03.2015