Настройка прокси-сервера SquidNt с авторизацией пользователей в Active Directory

2008-10-17 Андрей Гревцов RSS 6

В организации, основой информационной системы которой является сеть, построенная на серверах Windows c Active Directory, для решения типовой задачи по обеспечению выхода в интернет, можно использовать вариант, многократно опробованный на Linux - это прокси-сервер Squid. Для запуска в Windows используется его сборка SquidNt. Для кого-то немаловажным будет то, что Squid распространяется под лицензией GNU General Public License, то есть бесплатно. Возможности настройки Squid достаточно широки и позволяют обеспечить доступ практически ко всем http-ресурсам сети интернет, с фильтрацией (блокированием баннеров), ограничением доступа, ограничения трафика пользователя или компьютера и т.д. Процесс установки самой программы несложен, поэтому пропущу его и сразу перейду к основной теме заметки.

Задача: обеспечить выход в интернет через прокси-сервер 2 группам пользователей Active Directory. Первая группа имеет неограниченный доступ. Вторая группа имеет доступ только к сайтам из списка для ограниченного доступа. На всех компьютерах установлена операционная система Windows, основным браузером является Internet Explorer. Дополнительно иногда используются Firefox и Opera. Доступ должен предоставляться только с тех компьютеров, которые добавлены список разрешённых для доступа в интернет.

Для решения будут использоваться возможности Squid по использованию различных схем авторизации пользователей. Поскольку основным браузером является Internet Explorer, то вполне естественно использовать его возможности и возможности Squid по NTLM-авторизации. При этом пользователь, у которого настроен доступ в интернет даже не будет задумываться о том, что нужно ввести пароль, так как в этом случае авторизация проходит скрыто от него. Однако не все браузеры (Opera) и программы поддерживают NTLM, поэтому для них дополнительно придётся использовать Basic-авторизацию, при этом пользователь будет видеть приглашение для ввода логина и пароля.

В Active Directory создаются 2 группы пользователей: "Пользователи Интернет" и "Пользователи Интернет Ограниченного списка сайтов". Важным является пред-Windows 2000 имя группы, так как именно оно используется в схеме авторизации NTLM. Оно должно быть алфавитно-цифровым на латинице, для нашей конфигурации соответственно: InternetUsers и InternetUsersRestrict.

Далее приведу кусочек файла squid.conf:

# Установка аутентификации с использованием программы NTLM-авторизации.
auth_param ntlm program c:/squid/libexec/mswin_ntlm_auth.exe -v
auth_param ntlm children 25
# Установка аутентификации с использованием программы простой авторизации.
auth_param basic program c:/squid/libexec/mswin_auth.exe
auth_param basic children 5
# Установка приглашения для ввода логина и пароля для Basic-авторизации
auth_param basic realm Access to Internet
# Установка дополнительных параметров авторизации
auth_param basic credentialsttl 2 hours
authenticate_cache_garbage_interval 1 hour
authenticate_ttl 1 hour
authenticate_ip_ttl 0 seconds
# Установка проверки членства пользователя в группе
external_acl_type NT_global_group children=25 negative_ttl=0 %LOGIN c:/squid/libexec/mswin_check_lm_group.exe -G -d -c
# Установка правил (списков контроля доступа) для групп пользователей
acl ProxyUsers external NT_global_group InternetUsers
acl ProxyUsersRestrict external NT_global_group InternetUsersRestrict
acl password proxy_auth REQUIRED
# Установка стандартных правил для портов
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl Safe_ports port 21          # ftp
acl Safe_ports port 70          # gopher
acl Safe_ports port 80          # http
acl Safe_ports port 210         # wais
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 443         # https
acl Safe_ports port 488         # gss-http
acl Safe_ports port 563         # snews
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl Safe_ports port 1863        # msn
acl Safe_ports port 2042        # mail.ru agent
acl Safe_ports port 5222        # jabber
acl Safe_ports port 5223        # jabber SSL
acl Safe_ports port 1025-65535  # unregistered ports
acl SSL_ports port 443 563 1863 2083 5222 8443
# Устанавливаем правило для метода connect
acl CONNECT method CONNECT
# IP-адреса компьютеров, с которых доступ осуществляется без авторизации (текстовый файл "C:/squid/etc/acls/allow.noauth.ip.acl" с IP-адресами)
acl Advanced_Computers src "C:/squid/etc/acls/allow.noauth.ip.acl"
# IP-адреса компьютеров, для которых требуется авторизация пользователей  (текстовый файл "C:/squid/etc/acls/allow.clients.ip.acl" с IP-адресами)
acl Clients_Ip src "C:/squid/etc/acls/allow.clients.ip.acl"
# Правило, которое описывает адреса ограниченного списка сайтов (текстовый файл "C:/squid/etc/acls/allow.restrictedaccess.sites.acl" с регулярными выражениями)
acl Common_Resources url_regex "C:/squid/etc/acls/allow.restrictedaccess.sites.acl"
# Правило, которое описывает, что с ограниченного списка сайтов можно переходить по ссылкам (лучше не использовать)
acl ref_commonresources referer_regex  -i regexp "C:/squid/etc/acls/allow.restrictedaccess.sites.acl"
# Секция, где определяется доступ
# Запрет на использование не разрешённых явно портов
http_access deny !Safe_ports
# Запрет на использование метода CONNECT для портов не указанных в списке SSL_ports
http_access deny CONNECT !SSL_ports
# Без запроса пароля предоставляется доступ компьютерам по правилу Advanced_Computers
http_access allow Advanced_Computers
# Запросить пароль. Если пользователь попадает в список контроля доступа ProxyUsersRestrict и сайт - в Common_Resources, то дать доступ.
http_access allow password ProxyUsersRestrict Common_Resources Clients_Ip
# Запросить пароль. Если пользователь попадает в список контроля доступа ProxyUsersRestrict и произошёл переход по ссылке с сайта ref_commonresources, то дать доступ
http_access allow password ProxyUsersRestrict ref_commonresources Clients_Ip
# Запросить пароль. Если пользователь попадает в список контроля доступа ProxyUsers, то дать доступ.
http_access allow password ProxyUsers Clients_Ip
# Запретить все явно не разрешённые запросы
http_access deny all

Файл "C:/squid/etc/acls/allow.restrictedaccess.sites.acl" содержит список разрешённых сайтов, по регулярному выражению в каждой строке сайта:

^http\:\/\/(.*\.)*gov\.ru.*
^http\:\/\/(.*\.)*www\.ru.*

Файлы "C:/squid/etc/acls/allow.clients.ip.acl" и "C:/squid/etc/acls/allow.noauth.ip.acl" содержат IP-адреса, например:

10.100.10.111/32
10.100.0.0/24

Дополнительно для удобства у меня сделан командный файл, который содержит команду с помощью которой можно проверить членство в группе

@echo -
@echo Использовать строку запроса типа:
@echo +----------------------------------------------------+
@echo : domain\user InternetUsers                            :
@echo : Результат: OK-прошёл ERR - не прошёл проверку    :
@echo +----------------------------------------------------+
@rem @c:\squid\libexec\win32_check_group.exe -G -c -d
@c:\squid\libexec\mswin_check_ad_group.exe -G -c -d

Также сделан файл для внесения изменений в работающую конфигурацию после редактирования файла squid.conf.

@time /t
@C:\squid\sbin\squid.exe -k reconfigure -n squidnt
@time /t

Дополнительно о программах, используемых при организации аутентификации и авторизации.

mswin_ntlm_auth.exe - натуральный Windows-аутентификатор NTLM/NTLMv2 для Squid с поддержкой NTLM NEGOTIATE.

Использование:

mswin_ntlm_auth [-d] [-v] [-A|D LocalUserGroup] [-h]

  • -d включение отладки
  • -v включение подробной отладки NTLM
  • -A имя группы в Windows, для которой разрешена авторизация
  • -D имя группы в Windows, для которой не разрешена авторизация
  • -h справка

Пользователи, которым разрешён доступ к прокси-серверу должны иметь права "Доступ к компьютеру из сети" (Определяется в групповой политике безопасности). Кроме основных функций аутентификатор может проверять членство в локальной группе, указанной в строке его запуска, то есть авторизовывать пользователей. Локальная группа должна быть создана на компьютере, на котором установлен SquidNt.

mswin_check_lm_group.exe - это обработчик схемы внешнего определения списков контроля доступа для Squid.

Использование:

mswin_check_lm_group [-D domain][-G][-c][-d][-h]

  • -D указывается домен пользователя
  • -G программа работает в глобальном, то есть в доменном режиме
  • -c имя группы может быть указано без учёта регистра
  • -d включить отладку
  • -h справка

Этот обработчик должен использоваться со схемой аутентификации (Basic, NTLM или Negotiate) работающей с пользователями Windows Active Directory.

Обработчик читает из стандартного ввода доменное имя пользователя, по нему получает список групп из Active Directory и сравнивает их с указанной в описании правила.

Группы с пробелами в имени должны быть заключены в кавычки, например, "Domain Users", и помещены в отдельный файл, который вызывается из правила, например:

acl ProxyUsers external NT_global_group "c:/squid/etc/DomainUsers"

А файл "c:/squid/etc/DomainUsers" имеет только одну строку:

"Domain Users"

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

Используемые аутентификаторы NTLM и Basic должны запускаться без ключей -A и -D.

Ссылки по теме:

Просмотров: 205804 Windows , , ,
Комментариев: 6
  1. Аноним (2011-07-08 в 19:34:33)

    не знаю было тут или нет, ибо до конца не дочитал!

    думаю полезно будет всем...

    разобрался почему сквид не авторизует (или криво и не правильно что равно) через группу в АД. целую неделю мучился и догнал как сделать!

    обнаружил, что когда запускаю через командную строку (соответственно под своими правами на сервере) работает правильно, а по сервисом когда запускаю - нет (потому что у сервиса права Локальной CИСТЕМЫ)

    ! Squid 2.7.STABLE8 подымался НЕ на КОНТРОЛЛЕРе ДОМЕНА !

    и я решил проблему так:

    в оснастке АД "Пользователи и Компьютеры"

    создал учетку для сквида SQUIDService

    и добавил ее в группу BUILTIN\Администраторы

    и на самом сервере добавил в группу Администраторы

    после создания кэша (squid -z) и регистрации как сервиса (squid -i)

    настроил запуск сервиса от имени DOMAIN\SQUIDService

    (которая получается Локальный Админ и Админ на Контроллерах Домена)

    вот мой конфиг:

    auth_param ntlm program c:/SQUID/libexec/mswin_ntlm_auth.exe -v -d

    auth_param ntlm children 30

    #

    external_acl_type NT_global_group children=30 %LOGIN c:/SQUID/libexec/mswin_check_lm_group.exe -G -d

    acl IoP external NT_global_group InternetOverProxy

    acl Worktime time MTWHFA 08:00-19:00

    acl all src all

    #

    http_access deny !Worktime

    http_access allow IoP

    http_access deny all

    #

    cache_mem 3 GB

    maximum_object_size_in_memory 1 GB

    cache_replacement_policy lru

    memory_replacement_policy lru

    minimum_object_size 0 KB

    maximum_object_size 100 GB

    cache_swap_low 0

    cache_swap_high 100

    #

    cache_access_log c:/squid/var/logs/access.log squid

    cache_log c:/squid/var/logs/cache.log

    cache_store_log c:/squid/var/logs/store.log

    pid_filename c:/squid/var/logs/pid.log

    unlinkd_program c:/squid/libexec/unlinkd.exe

    #

    cache_mgr it@mubis.local

    visible_hostname MUBIS

    httpd_suppress_version_string on

    http_port 192.168.0.4:3128

    icp_port 0

    htcp_port 0

    coredump_dir c:/squid/var/cache

    error_directory c:/squid/share/errors/Russian-1251

  2. Андрей Гревцов (2011-07-08 в 21:52:27)

    Да, по умолчанию, служба работает от LocalSystem. Для того, чтобы она читала параметры учётных записей в домене, в том числе и членство в группах, нужно чтобы она запускалась от имени пользователя, обладающего правами доступа к ним. Два варианта - либо создаётся пользователь с необходимыми правами, настраивается запуск от его имени, либо права даются существующей в домене учётной записи компьютера, на котором установлен SquidNT.

  3. Николай (2011-12-11 в 06:59:12)

    Здравствуйте. Пол инета облазил, пока нашел эту статью. Кругом описание ntlm-авторизации squid'а только для Линукса описывается, а мне нужно для squidnt, потому как у меня не получается выполнить действия инструкции типа "Поднимаем suid, LAMP, SAMS прикручиваем то, это и юзаем свою бесплатную проксю". Я просто недогоняю, как из консоли "поднять" что-то и вообще я виндузятник! У меня получилось настроить сквид на win2k, прописал проксю в браузерах клиентских машин и вуаля, все вроде бы заработало, но вот как рулить инетом через группы AD я так и не могу разобраться. Надеюсь на помощь автора.

    Сделал все по инструкции, и теперь у меня прокся вообще не хочет работать.

  4. Андрей Гревцов (2011-12-12 в 12:26:34)

    Николай, высылайте конфиг Squidа на aradm@aradm.ru, посмотрю в чём дело.

  5. Аноним (2012-08-16 в 14:23:37)

    у вас браузеры запрашивают авторизацию?

    я ваши настройки попробовал - просят.... (( как обойти это?

  6. Поднял на Контроллере Домена. На нем все работает, а на других ПК, которые в домене, запрашивает пароль. Служба запускается от пользователя, состоящего в группе Администраторы Домена. На других ПК проверяю тоже под этим пользователем.

    Need Help!

Оставьте комментарий!