Линукс – линуксом, но и про форточки забывать не стоит. Есть 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…
в конфиге самбы ошибка
вместо workgroup = MYDOMAIN.NET нужно писать workgroup = MYDOMAIN