Авторизация SQUID (Debian) в LDAP (Windows 2008R2)

Линукс – линуксом, но и про форточки забывать не стоит. Есть Windows Server 2008 R2 (PDC), есть прокси-сервер на Debian Lenny. Прописать в SQUID, скажем, 200 пользователей с их паролями, потом разбить их на группы, наградить их правами и прочее – дело утомительное и неблагодарное. За это премий не дают 🙁 Мы пойдем другим путем – будем авторизовывать пользователей при помощи LDAP и ограничивать насосов силами SQUID.

Существует по меньшей мере тысяча разных мануалов, более или менее разжеванных, под разные версии SQUID и разные версии Windows. Я опишу свой опыт.

Итак, Debian, SQUID, Windows Server 2008 R2, AD, LDAP. Поехали.
Ну, для начала определимся с версиями, чтобы не бросали камнями:

<strong>proxy:~# uname –a</strong>
Linux proxy 2.6.26-2-686 #1 SMP Thu Jan 27 00:28:05 UTC 2011 i686 GNU/Linux

<strong>proxy:~# squid –v</strong>
Squid Cache: Version 2.7.STABLE3
configure options: '--prefix=/usr' '--exec_prefix=/usr' '--bindir=/usr/sbin' '--sbindir=/usr/sbin' '--libexecdir=/usr/lib/squid' '--sysconfdir=/etc/squid' '--localstatedir=/var/spool/squid' '--datadir=/usr/share/squid' '--enable-async-io' '--with-pthreads' '--enable-storeio=ufs,aufs,coss,diskd,null' '--enable-linux-netfilter' '--enable-arp-acl' '--enable-epoll' '--enable-removal-policies=lru,heap' '--enable-snmp' '--enable-delay-pools' '--enable-htcp' '--enable-cache-digests' '--enable-underscores' '--enable-referer-log' '--enable-useragent-log' '--enable-auth=basic,digest,ntlm,negotiate' '--enable-negotiate-auth-helpers=squid_kerb_auth' '--enable-carp' '--enable-follow-x-forwarded-for' '--with-large-files' '--with-maxfd=65536' 'i386-debian-linux' 'build_alias=i386-debian-linux' 'host_alias=i386-debian-linux' 'target_alias=i386-debian-linux' 'CFLAGS=-Wall -g -O2' 'LDFLAGS=' 'CPPFLAGS='

<strong>proxy:~#smbstatus</strong>
Samba version 3.2.5
 …дальше…текущие…подключения…

Начинаем с Samba.

<strong>proxy:~#cat /etc/samba/smb.conf</strong>
  [global]
  workgroup = MYDOMAIN.NET
  security = ADS
  password server = PDC.MYDOMAIN.NET
  realm = MYDOMAIN.NET
  netbios name = proxy
  server string = Proxy server
  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

Расширенных ресурсов на сервере не будет, поэтому шары не описываем.
Теперь пробежимся по строкам:
Workgroup — тут описывается наш домен (если мы в рабочей группе – пишем имя рабочей группы, но нам-то нужно брать пользователей из LDAP, поэтому пишем имя домена);
Security – это метод аутентификации AD. Сервер Samba работает как участник домена в сфере домена Active Directory (Active Directory Domain, ADS);
password server – контроллер домена с паролями пользователей;
realm — сфера сервера Kerberos (наш домен);
netbios name – имя нашего сервера в Windows-сети;
server string – описание сервера;
log file – куда Samba будет писать логи;
max log size – максимальный размер лога – целое значение в килобайтах.
остальное, думаю, понятно. Если не понятно – можно скопипастить, оставьте как есть.

Настраиваем Kerberos, чтобы можно было «договорится» с Windows-сервером:

<strong>proxy:~#nano /etc/krb5.conf</strong>
[libdefaults]
  default_realm = MYDOMAIN.NET
[realms]
  MYDOMAIN.NET = {
  kdc = SRV.MYDOMAIN.NET
  admin_server = SRV.MYDOMAIN.NET
  default_domain = MYDOMAIN.NET
  }
[domain_realm]
  .mydomain.net = MYDOMAIN.NET
  mydomain.net = MYDOMAIN.NET
[logging]
  default = FILE:/var/log/krb5libs.log
  kdc = FILE:/var/log/krb5kdc.log
  admin_server = FILE:/var/log/kadmind.log

Редактируем nsswitch.conf

<strong>proxy:~#nano /etc/nsswitch.conf</strong>
group: files winbind
passwd: files winbind
group_compat: nis
passwd_compat: nis
hosts: files dns
networks: files
shells: files

После того, как конфиги поправлены, ставим SQUID если он еще не установлен.

Установку SQUID я пропущу, ибо от мануалов, скриншотов и прочих howto рунет просто трещит, поэтому не вижу смысла описывать процесс установки. Стоит только упомянуть, что нужно отметить параметры для авторизации ntlm, ну и что там еще лично вам пригодится…

Далее получаем билет от Kerberos:

proxy:~#kinit mkv

где mkv – это пользователь с правами администратора домена. Это важно. Сейчас мы будем вводить машину в домен.
Вводим пароль и получаем тикет. Если после запроса пароля ничего не выводится или выводится сообщение kinit: NOTICE: ticket renewable lifetime is 1 week – все прошло удачно и билет получен (можно проверить командой klist).

<strong>proxy:~#klist</strong>
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: mkv@mydomain.net
Valid starting Expires Service principal
08/10/11 17:36:04 08/11/11 03:36:49 krbtgt/MYDOMAIN.NET@MYDOMAIN.NET
  renew until 08/11/11 17:36:04
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached

Полученный билет можно удалить командой kdestroy.
Проверяем winbind:
proxy:~#wbinfo –p показывает доступность winbind (используется команда PING, но результат выводится «Ping to winbind succeeded»)
proxy:~#wbinfo –t видит ли winbind сервер с паролями (PDC)
proxy:~#wbinfo –u показывает пользователей домена
proxy:~#wbinfo –g показывает группы домена

Итак, билет получили winbind работает, теперь надо ввести в домен:

<strong>proxy:~#net join –U mkv –S SRV.MYDOMAIN.NET</strong>
Enter mkv's password:
Joined domain MYDOMAIN.NET.

Можно проверить, насколько все хорошо:

<strong>proxy:~#id mkv</strong>
uid=10001(mkv) gid=10006(???????????? ??????) группы=10006(???????????? ??????),10015(?????????????? ??????),10016(?? ? ???),10017(?????????????? ???????????),10018(?????????????? ?????),10019(scan operators),10020(?????? ? ??????????? ?????????? ??????? rodc),10003(BUILTIN\users),10004(BUILTIN\administrators)

Винда у меня русская, поэтому не видно, что за группы (свои группы я знаю, поэтому не парюсь :), в общем – все прошло удачно, ошибок никаких нет, группы отображаются.
Стоит учесть, что SQUID запускается не от рута, у него не хватает прав для доступа к winbind. Поэтому даем ему такие права:

[cc lang=’bash’ ]proxy:~#chown root:squid /var/run/samba/winbindd_privileged  [/cc]

Теперь делаем бэкап, чтобы на всякий случай не потерять дефолтный конфиг (там все очень подробно документировано, хоть и на английском языке):
[cc lang=’bash’ ]proxy:~#cp /etc/squid/squid.conf /etc/squid/squid.conf.DEFAULT[/cc]

Теперь самое интересное, собственно, ради чего это все и затевалось

Конфиг SQUID для авторизации пользователей в домене Windows Server:

cache_mgr admin@mydomain.net #емаил администратора, который будет высвечиваться на окне ошибки у пользователя, видимое имя нашего прокси
visible_hostname proxy

#Директория, где находится ядро squid:
coredump_dir /var/spool/squid

#Задание максимального объема обектов в кеше:
maximum_object_size 10 MB
#Общий обем кеша:
cache_mem 20 MB
# далее идут описания директорий, где будут лежать логи и кэш. Мне необходимо, чтобы они лежали на отдельном винте, поэтому я его смонтировал в папку /myfolder и там владел всем этим добром. Естественно, можно оставить стандартные пути, для этого строки, содержащие папку /myfolder (их тут 6 штук) вставлять не нужно
cache_dir ufs /myfolder/squid/cache 100 16 256
access_log /myfolder/squid/log/access.log squid
logfile_daemon /myfolder/squid/log/logfile-daemon.log
cache_log /myfolder/squid/log/cache.log
cache_store_log /myfolder/squid/log/store.log
netdb_filename /myfolder/squid/log/netdb.state  

log_mime_hdrs on #в логах будут видны все заголовки пользователей
ignore_unknown_nameservers on #игнорирование неизвестных ДНС-серверов
connect_timeout 120 seconds #время ожидания ответа
half_closed_clients on #сброс сессий

#DNS
dns_nameservers 192.168.12.10

forwarded_for off #скрыть внутренние IP

hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin
no_cache deny QUERY

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320

#Порт и адрес, на которых будет работать squid для http и https соответственно:
http_port 192.168.12.40:3128
https_port 192.168.12.40:3129

#Аутентификация юзеров в AD:
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 50
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 10
auth_param basic credentialsttl 2 hours

#Обязательный запрос пароля для не местных
acl SSUsers proxy_auth REQUIRED

#Сети описываются для большей безопасности:
acl all src 0.0.0.0/0.0.0.0
acl single_ip src 192.168.12.10
acl single_ip src 192.168.12.110
# блокирование баннеров:
acl nobanners src 0/0
acl banners url_regex "/etc/squid/conf/banners.acl" #в файле banners.acl содержатся распространненые адреса баннеров

acl My_SNMP snmp_community squidmrtg
snmp_port 3401

#Для аськи:
acl ICQ_port port 5190 443
acl ICQ_server dstdomain login.icq.com
http_access allow ICQ_port SSUsers
http_access allow ICQ_server SSUsers
#Этот правило описывает метод соединения клиентов к серверам аськи и других месенжеров:
acl CONNECT method CONNECT

#для Windows Update
acl WU_server url_regex -i microsoft.com
acl WU_server url_regex -i windowsupdate.com
acl WU_server url_regex -i .cab

#Пользователи, имеющие доступ ко всем ресурсам инета:
acl goodusers proxy_auth "/etc/squid/conf/good"

#########################################################################
## ПОЛЬЗОВАТЕЛИ С ОСОБЫМИ ПРАВАМИ И ПРИВИЛЕГИЯМИ # 

###### Радио Иванову ################################################
acl ivanov_radio proxy_auth ivanov_m
acl ivanov_radio_site url_regex radio audio play mp3 m3u ogg wav swf flv
http_access allow ivanov_radio ivanov_radio_site
#########################################################################

###### Loveplanet Петрову ######################################
acl petrov_radio proxy_auth petrov_u
acl petrov_love_site url_regex loveplanet
http_access allow petrov_radio petrov_love_site
#########################################################################

#########################################################################
acl aolaccess dst "/etc/squid/conf/hosts_allow_always.acl" #в файле hosts_allow_always.acl содержатся адреса сайтов, к которым нужен доступ даже заблокированим юзерам

#здесь пользователи, которые окончательно потеряли совесть, им открыт доступ только к сайтам, описаным в nu_hosts_allow.acl
acl nu proxy_auth "/etc/squid/conf/naglyi_user"

acl client_banks dst "/etc/squid/conf/client_banks.txt"

#Блокирование сайтов, которые юзеры будут смотреть дома:
acl squid_block_badlang url_regex -i "/etc/squid/conf/badlang.block.txt"
acl squid_unblock_badlang url_regex -i "/etc/squid/conf/badlang.unblock.txt"
acl squid_block_entertain url_regex -i "/etc/squid/conf/entertain.block.txt"
acl squid_unblock_entertain url_regex -i "/etc/squid/conf/entertain.unblock.txt"
acl squid_block_games url_regex -i "/etc/squid/conf/games.block.txt"
acl squid_unblock_games url_regex -i "/etc/squid/conf/games.unblock.txt"
acl squid_block_pirate url_regex -i "/etc/squid/conf/pirate.block.txt"
acl squid_block_mp3 url_regex -i "/etc/squid/conf/mp3.block.txt"
acl squid_unblock_pirate url_regex -i "/etc/squid/conf/pirate.unblock.txt"
acl squid_block_porn url_regex -i "/etc/squid/conf/porn.block.txt"
acl squid_unblock_porn url_regex -i "/etc/squid/conf/porn.unblock.txt"
acl squid_block_video url_regex -i "/etc/squid/conf/video.block.txt"
acl squid_block_reklama url_regex -i "/etc/squid/conf/reklama.block.txt"
acl squid_unblock url_regex -i "/etc/squid/conf/unblock.txt"
acl squid_block url_regex -i "/etc/squid/conf/block.txt"
acl squid_nu_block url_regex -i "/etc/squid/conf/nu_block" 

#доступ избранных в определенное время к определенным ресурсам
acl users_in_time proxy_auth "/etc/squid/conf/users.in.time.txt"
acl sites_in_time proxy_auth "/etc/squid/conf/sites.in.time.txt"
acl time_allow_1 time SMTWHFA 18:15-23:59
acl time_allow_2 time SMTWHFA 00:00-07:30

#Открытые порты, взяты из дефолта:
acl SSL_ports port 443 563 10000
acl Safe_ports port 80
acl Safe_ports port 21
acl Safe_ports port 70
acl Safe_ports port 210
#acl Safe_ports port 1025-65535
acl Safe_ports port 280
acl Safe_ports port 488
acl Safe_ports port 591
acl Safe_ports port 777
acl Safe_ports port 4310 #TrueConf сервер лицензий
acl Safe_ports port 4307 #TrueConf клиентские подключения

http_access allow CONNECT client_banks

http_access allow single_ip all

http_access allow WU_server single_ip
acl CONNECT method CONNECT

http_access deny goodusers banners
http_access allow goodusers

http_access allow aolaccess all

http_access deny nu SSUsers

http_access allow squid_unblock SSUsers
http_access deny squid_block all

http_access allow squid_unblock_badlang SSUsers
http_access allow squid_unblock_games SSUsers
http_access allow squid_unblock_pirate SSUsers
http_access allow squid_unblock_entertain SSUsers

http_access deny squid_block_badlang all
http_access deny squid_block_entertain all
http_access deny squid_block_games all
http_access deny squid_block_mp3 all
http_access deny squid_block_pirate all
http_access deny squid_block_porn all
http_access deny squid_block_video all
http_access deny squid_block_reklama all

#http_access allow users_in_time sites_in_time time_allow_1
http_access allow sites_in_time users_in_time time_allow_2

#блокировка банеров, описаных выше
http_access deny nobanners banners

#Заключающие правила, разрешающие всему оставшемуся пройти к пользователю
http_access allow SSUsers

snmp_access deny all

#Разрешения соединений на них:
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
#http_access deny to_localhost

http_reply_access allow all
icp_access allow all

#Блокирование всего, что не прошло по правилам:
http_access deny all
http_access deny SSUsers

Естественно, это все для примера (но конфигурация реально рабочая) и пути с адресами заменены
И примеры файлов с ACL:
/etc/squid/conf/banners.acl

banner
abn-ad.com
100mb.net
bizlink.ru
linkexchange.ru
netcq.com
…многабукаф…
imgn
^http://.*doubleclick
^http://.*-ad.flycast.com/server/img/
^http://1000.stars.ru/cgi-bin/1000.cgi
^http://1000.stars.ru/cgi-bin/1000.cgi
^http://12.16.1.10/~web_ani/

 

/etc/squid/conf/good

mkv
#manager
sidorov_s

Естественно, создаем все файлы с конфигами, все директории также должны быть созданы и им должны быть назначены права squid. Для простоты можно, конечно, обойти парой листов block и unblock, но очень скоро они станут совсем неудобными.

В следующей статье я обязательно опишу, как работает ACL (чтобы не захламлять эту статью).

Далее делаем squid владельцем директории с кэшем и запускаем:
[cc lang=’bash’ ]proxy:~#chown -R squid:wheel /myfolder/squid/cache
proxy:~#squid -z[/cc]

Если нужно поправить конфиг – правим squid.conf, для того, чтобы конфигурация применилась, нужно проделать следующий кульбит:

[cc lang=’bash’ ]proxy:~#squid –k reconfigure[/cc]

Это обновит конфигурацию без перезапуска демона. Если все же необходимо перезапустить демон, это делается так:
[cc lang=’bash’ ]proxy:~#/etc/init.d/squid reload[/cc]

Но тут есть разница. Если пойти по первому пути, найденные ошибки никак не повлияют на работоспособность конфигурации. Squid будет и дальше работать, но изменения не вступят в силу (хотя старый конфиг мы, все же, потеряем если не забэкапим).

Если пойти по второму пути, демон squid вырубится, попытается запуститься и, если найдет ошибки, забьет на это дело, сказав «Простите, но с таким конфигом я работать не могу». Мы тупо остановим прокси.

Ну, вроде бы все. Осталось написать, как работают ACL…

0

Авторизация SQUID (Debian) в LDAP (Windows 2008R2): 1 комментарий

Добавить комментарий