...
...
...

Авторизация доступа к Интернет на основе Windows NT/2000-авторизации

вступление

Классическим решением организации Интернет-сервисов является сервер под управлением UNIX. Практически всегда для Web- и FTP-трафика используют кеширующий сервер squid, который также является стандартом de facto. 
Стандартным способом предоставления доступа к squid-серверу является доступ на основе специалицированных списков доступа (Access Lists или ACL). В свою очередь списки доступа обычно строятся на основе IP-сетей, которым разрешен доступ к squid. Например, определим ACL, которая описывает сеть 10.128.0.0/16 (или с маской 255.255.0.0). и ACL, которая описывает вообще все адреса

acl net10128 src 10.128.0.0/16
acl all src 0.0.0.0/0
#а теперь разрешим ей доступ к Интернет ресурсам
http_access allow net10128
#а всем остальным - запретим:
http_access deny all


После этого, только компьютерам из заданной сети разрешен доступ к Интернет. При использовании Internet-ресурсов, в лог-файл squid записывается информация о конкретном адресе, запросившем конкретный Интернет-ресурс: 

1032862411.262 96 10.128.15.4 TCP_MEM_HIT/200 2581 GET http://www.ru/eng/images/ssilki.jpg board/sag NONE/- image/jpeg

Здесь присутсвует дата, размер ресурса, IP-адрес станции, зпросившей ресурс, и сам ресурс. Из такого рода записей можно подсчитать трафик как по станции, так и по под-сети. 
Однако приведенная выше технология позволяет контролировать трафик по IP-адресу пользователя. В большинстве случаев этот способ вполне подходит, однако при этом необходимо, чтобы за конретным компьютером всегда работал конкретный человек.
Это условие выполняется не всегда и тогда учет трафика нарушается. Вот типичные условия, при которых требуется другая схема авторизации:

  • различные пользователи работают на одном и том же рабочем месте (например, посменно);

  • пользователи вообще не привязаны к конкретным компьютерам;

  • пользователи работают в терминальных сессиях терминального сервера. Тогда вообще весь Интернет-трафик идет с IP-адреса сервера.

Поэтому часто встает проблема учета трафика не на основе IP, а на основе другой информации.





авторизация на основе логина и пароля

Логичным решением поставленной во вступлении проблемы является авторизация в squid по логину и паролю. Такая возможность в squid, естесвенно, предусмотрена. Для этого разработана возможность авторизовать через внешнюю программу, которая просто говорит «да» или «нет» на определенного пользователя и пароль. Таким образом, можно производить авторизацию по учетной записи UNIX, через текстовые файлы и т.п.
Например, для того чтобы пользователь авторизовался через файл /usr/local/squid/passwd формата веб-авторизации (формат Apache), нужно скомпилировать squid вместе с этим модулем (--enable-auth="ncsa; подробнее см. документацию к squid). И в конфиг squid добавить ACL и разрешающее правило:

acl MYUSERS proxy_auth dima petya vasya
http_access allow MYUSERS
http_access deny all
authenticate_program /usr/local/squid/bin/ncsa_auth /usr/local/squid/etc/passwd 


Приведенное правило разрешает доступ пользователям dima petya vasya, пароли которых будут проверены через файл /usr/local/squid/passwd.
Это решает поставленные во "введении" проблемы, однако добавляет некоторые неудобства пользователям и администратору:

  • При первичном входе в Интернет пользователю нужно набрать в браузере логин/пароль для доступа к squid. И каждому пользователю необходимо помнить свои параметры.

  • Администратору необходимо вести базу логинов и паролей в файле.

авторизация через учетные записи Windows

При работе в Windows-сетях каждый пользователь при входе в сеть проходит авторизацию в NT/2000-домене. Было бы здорово использовать эти данные для авторизации squid. Тогда решаются проблемы ведения в squid отдельной базы данных пользователей и, как оказалось, можно решить проблему запроса логина/пароля в браузере при входе в Интернет.
Главная проблема при решении авторизации через Windows-домен - найти и настроить программу для авторизации заданного пользователя в Windows-домене. Команда разработчиков squid рекомендует пользоваться программой winbindd, которая является частью проекта SAMBA (реализация Windows-сервера и клиента под UNIX). squid, начиная с версии 2.5, поддерживает различные схемы авторизации по логину/паролю, включая basic и NTLM (NT Lan Manager). Basic-схема предназначена для авторизации через ввод логина/пароля в браузере, а NTLM-схема предназначена для автоматического приема броузером логина, пароля и домена, под которыми пользователь зарегистрировался в Windows-домене. То есть с помощью NTLM-авторизации можно автоматически регистрироваться в squid без ручного подтверждения логина и пароля.

практическое решение построения системы авторизации через Windows домен

Это решение было найдено опытным путем и может быть не самым изящным и правильным. Но прелесть его в том, что оно доделано да конца и работает.

исходные данные
1. Компьютер, подключенный к Интернет, с установленной ОС FreeBSD 4.4 (версия и сама ОС не имеют принципиального значения).
2. Сеть, содержащая около 200 Windows-станций, включая терминальные серверы и клиенты.
3. Около 250 аккаунтов в домене под управлением Windows 2000 Advanced сервер (домен WORK и 4 доверительных домена).

задача
Обеспечить авторизацию пользователей на squid через учетные записи Windows наиболее удобным способом.

установка и конфигурирование SAMBA

Итак первое, что надо сделать — установить SAMBA для того,чтобы уметь авторизоваться в Windows-домене. Я установил версию 2.2.6pre2. Причем важно скомпилировать SAMBA с поддержкой winbind, то есть с параметрами 
--with-winbind
--with-winbind-auth-challenge

Примечание: в FreeBSD SAMBA была собрана из портов (ports) и оказалось, что с текущей версией не собирается библиотека CUPS. Поэтому SAMBA была собрана без нее(--without_cups).
После установки, SAMBA нужно настроить на домен Windows сети и на использование winbind:

[global]
workgroup = WORK - Имя нашего Windows-домена
netbios name = vGATE - Имя сервера (необязательно)
server string = vGate 
hosts allow = 10.128. 127. - Для безопасности.
winbind separator = +
winbind use default domain = yes
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
template homedir = /home/winnt/%D/%U
template shell = /bin/bash
max log size = 50
security = domain
password server = Primary Exch - серверы паролей (PDC, BDC)
encrypt passwords = yes

Следует обратить внимание на 2 вещи:
1. Сначала в параметре password server был указан только PDC (Primary) и winbind не смог найти контроллер домена. Все заработало когда был добавлен BDC (Exch).
2. Оба имени — это NetBIOS имена и для того, чтобы они равильно интерпретировались в IP я прописал их в /usr/local/etc/lmhosts

10.128.1.40 Primary
10.128.1.34 Exch

После этого необходимо заригестрировать SAMBA в домене Windows. Для этого нужэно набрать команду:

/usr/local/sbin/smbpass -j WORK (наш домен) -r Primary(наш PDC) -UAdministrator

После этого, следует ввести пароль админиcтратора домена. 
Наблюдались проблемы с samba 2.2.4 и регистрацией в нашем домене — именно поэтому была поставлена версия 2.2.6 из портов.
Далее можно запустить nmbd

/usr/local/sbin/nmbd -D 

лучше с включенным дебагом (-d9) и, заглянув в лог-файл, убедитьсся, что сеть нормально видна. 
Далее можно смело пускать winbindd 

/usr/local/sbin/winbindd -d9

тоже с дебагом и посмотреть как он себя чувствует в нашей сети. Спустя примерно секунд 10, можно проверить, а запустился ли winbind и функционирует ли он.
Для взаимодействия с winbind служит команда wbinfo. Проверить, видит ли она winbindd вообще можно командой wbinfio -p. Если она ответит «'ping' to winbindd succeeded», значит все в порядке. Иначе надо смотреть в лог-файл winbindd и пытаться понять почему он не запустился. На самом деле запускается он всегда, да вот на запросы отвечает только если правильно видит сеть. Далее можно попробовать проверить, а видит ли winbindd сервер с паролями пользователей (wbinfo -t). Сервер должен сказать "Secret is good".
Если получен ответ "Secrets is bad", то скорее всего проблемы с библиотеками winbindd.

  1. Остановите smbd и winbindd.

  2. Удалите файлы secrets.tdb и MACHINE.SID (последнего может и не быть).

  3. На PDC удалите запись о компьютере и одождите удаления его из кэша (примерно 10 минут).

  4. Выполните коммнады:

    cp nsswitch/libnss_winbind.so /libln 
    ln -s /lib/libnss_winbind.so /lib/libnss_winbind.so.1 
    ln -s /lib/libnss_winbind.so /lib/libnss_winbind.so.2
     

  5. Файл /etc/nsswitch.conf должен содержать строки вида

    passwd: files winbind
    group: files winbind

  6. Запустите smbd.

  7. Запустите winbindd.

  8. Добавте машину в домен, как указано выше.

  9. Проверьте правильность работы командой wbinfo -t 

Если выдержать нужный интервал в пункте 3, то все должно заработать. 
И, наконец, можно попробовать авторизоваться из UNIX в Wondows домен: 

wbinfo -a пользователеь_домена%пароль. 

Если пользователь авторизовался, будет выдано:

plaintext password authentication succeeded
error code was NT_STATUS_OK (0x0)
challenge/response password authentication succeeded
error code was NT_STATUS_OK (0x0)

Если неправильный пароль, то 

error code was NT_STATUS_WRONG_PASSWORD (0xc000006a)
Could not authenticate user dmn%doct with plaintext password
challenge/response password authentication faile
error code was NT_STATUS_WRONG_PASSWORD (0xc000006a)
Could not authenticate user dmn with challenge/response

Все это значит, что модуль wbinfo наконец настроен и правильно функционирует. Можно приступать к настройке squid. 

настройка squid

Для начала нужно отметить, что NTLM-схему squid поддерживает, начиная с версии 2.5. Поэтому я скачал версию 2.5.PRE13.
Далее, squid нужно скомпилировать с поддержкой схем авторизации и модулем winbind.

./configure -enable-auth="ntlm,basic" \
--enable-basic-auth-helpers="winbind"\
--enable-ntlm-auth-helpers="winbind"


Теперь можно проверить, понимает ли squid-овский авторизатор winbind. Для этого нужно запустить:

/usr/local/squid/libexec/wb_auth -d

И ввести вручную имя пароль (через пробел).
Если все работает корректно, то программа выдаст 

/wb_auth[91945](wb_basic_auth.c:129): Got 'dmn XXXXX' from squid (length: 10).
/wb_auth[91945](wb_basic_auth.c:55): winbindd result: 0
/wb_auth[91945](wb_basic_auth.c:58): sending 'OK' to squid

После этого нужно настроить squid, чтобы он корректно работал на основе IP-авторизации (см введение).
Теперь осталось подключить авторизацию к squid. Для этого в конфиге squid нужно описать в схемы авторизации через winbind

auth_param ntlm program /usr/local/squid/libexec/wb_ntlmauth
auth_param ntlm children 5
auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 2 minutesauth_param basic program /usr/local/squid/libexec/wb_auth
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

Причем важно, чтобы NTLM-авторизация шла первой, иначе будет применяться авторизация basic, и IE будет спрашивать пароль.
Дальше нужно сделать соответсвующую ACL и параметр доступа. Важно, чтобы это шло после описания авторизаций.

acl myusers proxy_auth REQUIRED
http_access allow myusers
http_access deny all

Теперь остается запустить squid и все проверить. 

что должно быть

Если пользователь авторизовался в домене, то IE не спросит пароль, а пойдет сразу в Интернет. Причем, в лог-файле squid будет бесценная информация о том, кто это был:

1032943720.839 180 10.128.36.5 TCP_CLIENT_REFRESH_MISS/200 1280 GET http://www.ru/eng/images/demos.jpg work\dmn DIRECT/194.87.0.50 image/jpeg

Это был пользователь dmn из домена work.
Если пользователь не авторизовался в домене — его спросят логин и пароль. Если он введет логин/пароль такой же, как при входе в домен, то его пустят в Интернет. 
Если пользователь пользуется не IE (например, Mozilla, Netscape, Opera), он будет должен набрать свой логин и пароль для авторизации в Windows.
Если аккаунт в Windows-домене закрыт, то и доступ в Интернет будет закрыт.

Дмитрий Новиков
обсуждение статьи



© Сетевые решения