Squid NTLM авторизация в домене Samba

Необходимо настроить NTLM авторизацию на ОС CentOS. Данная авторизация позволяет организовать доступ в интернет без ввода логина и пароля.

Исходные данные:

1. ОС — CentOS 5.7 x32

# cat /etc/redhat-release
CentOS release 5.7 (Final)

2. Домен на Samba

Установлены следующие пакеты Samba:

# yum list installed | grep samba
samba.i386 3.0.33-3.29.el5_7.4 installed
samba-client.i386 3.0.33-3.29.el5_7.4 installed
samba-common.i386 3.0.33-3.29.el5_7.4 installed

Параметры домена:

# more /etc/samba/smb.conf | grep netb
netbios name = SLHSRV
.........

# more /etc/samba/smb.conf | grep work
workgroup = KONTORASLH
comment = Network Logon Service
……….

IP адрес сервера — 10.0.15.2

3. Версия Squid

# squid -v
Squid Cache: Version 2.6.STABLE21
......

установленный пакет:

# yum list installed | grep squid
squid.i386
7:2.6.STABLE21-6.el5 installed

Имеем настроенную авторизацию следующим способом:

auth_param basic program /usr/lib/squid/smb_auth –W\ KONTORASLH -U 10.0.15.2
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive on
external_acl_typeunix_group %\ LOGIN /usr/lib/squid/squid_unix_group -p
acl samba_users proxy_auth REQUIRED

4. На сервере настроен DNS

Подробно описывать настройки сервера не буду. Остановлюсь на настройках прокси сервера в части, касающейся NTLM авторизации.  Рассмотрим два способа:

Первый: наиболее оптимальный. Без Winbind и ввода сервера в домен.
Второй: Использую Winbind, и вводя сервер в домен.

Приступаем к первому способу.

Добавляем в squid.conf следующие строки:

auth_param ntlm program /usr/lib/squid/ntlm_auth KONTORASLH/10.0.15.2
auth_param ntlm children 20
auth_param ntlm keep_alive on
#######################################
выше настроек : auth_param basic program
........................................
#######################################
external_acl_type unix_group %LOGIN /usr/lib/squid/squid_unix_group -p -s

строки необходимо добавить перед строками базовой авторизации (auth_param basic), auth_param basic убирать не следует, так как не все программы поддерживают такую авторизацию (например skype).

auth_param — Этот тэг используется для определения параметров для различных схем аутентификации
поддерживаемых Squid.

format: auth_param scheme parameter [setting]

auth_param ntlm program — указывает на использование хелпера авторизации, расположенного в каталоге /usr/lib/squid/, и протокол авторизации.

auth_param ntlm children 20 — указано максимально количество одновременно запускаемых хелперов

"keep_alive" on|off

Эта опция включает использование постоянного соединения при инициализации запроса аутентификации. Есть сведения, что некоторые версии MS IE имеют проблемы с этим, но лучше будет если эта опция включена.

external_acl_type

Этот тэг позволяет определить внешние ACL. Внешние ACL это такие ACL, которые не входят в набор стандартных типов ACL. Например, это могут быть самописные (или откуда- нибудь взятые) скрипты (вспомогательные программы), которые используя переменные Squid осуществляют некоторое действие. Такие скрипты запускаются вместе со Squid отдельным процессом.

external_acl_type name [options] FORMAT.. /path/to/helper [helper arguments..]

Хелпер входит в пакет squid.

# /usr/lib/squid/squid_unix_group --help
/usr/lib/squid/squid_unix_group: invalid option -- -
Unknown option '--'.
Usage: /usr/lib/squid/squid_unix_group -g group1 [-g group2 ...] [-p] [-s]

-g group
The group name or id that the user must belong in order to
be allowed to authenticate.
-p Verify primary user group as well
-s Strip NT domain from usernames

Второй способ.

добавляем следующие строчки также перед базовой авторизацией:

......
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 20
auth_param ntlm keep_alive on
......

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

net join -U samba

После запуска squid-a:

В логах пишет:

Jan 24 11:42:35 slhsrv (ntlm_auth): [2012/01/24 11:42:35, 0] utils/ntlm_auth.c:get_winbind_netbios_name(172)
Jan 24 11:42:35 slhsrv (ntlm_auth): could not obtain winbind netbios name!
Jan 24 11:42:47 slhsrv (ntlm_auth): [2012/01/24 11:42:47, 0] utils/ntlm_auth.c:get_winbind_domain(146)
Jan 24 11:42:47 slhsrv (ntlm_auth): could not obtain winbind domain name!
Jan 24 11:42:47 slhsrv (ntlm_auth): [2012/01/24 11:42:47, 0] utils/ntlm_auth.c:get_winbind_netbios_name(172)
Jan 24 11:42:47 slhsrv (ntlm_auth): could not obtain winbind netbios name!
Jan 24 11:42:57 slhsrv (ntlm_auth): [2012/01/24 11:42:57, 0] utils/ntlm_auth.c:get_winbind_domain(146)
Jan 24 11:42:57 slhsrv (ntlm_auth): could not obtain winbind domain name!
Jan 24 11:42:57 slhsrv (ntlm_auth): [2012/01/24 11:42:57, 0] utils/ntlm_auth.c:get_winbind_netbios_name(172)
Jan 24 11:42:57 slhsrv (ntlm_auth): could not obtain winbind netbios name!

Запускаем Winbind:

# /etc/init.d/winbind start

Как уже упоминалось, для второго способа нужен Winbind. отличий в Работе не заметил, так первый способ более предпочтителен для домена на SAmba.

Немного теории:

Исходный код Squid идет с несколькими типами процессов аутентификации. Включая:

  1. LDAP: использует Lightweight Directory Access Protocol
  2. NCSA: использует NCSA-стиль для файла имен пользователей и паролей.
  3. MSNT: использует Windows NT authentication domain.
  4. PAM: использует Linux Pluggable Authentication Modules scheme.
  5. SMB: использует SMB-север типа Windows NT или Samba.
  6. getpwam: использует старомодный файл паролей old-fashioned Unix.

      Пользователи будут аутентифицироваться, если squid настроен на использование ACL типа proxy_auth.
Броузер посылает пользовательский запрос на аутентификацию в заголовке Authorization.
Если Squid получает запрос и если список правил http_access содержит ACL типа proxy_auth, Squid ищет загловок Authorization. Если заголовок присутствует, Squid декодирует его и извлекает имя пользователя и пароль.

Если заголовок отсутствует, Squid возвращает HTTP-ответ со статусом 407 (Proxy Authentication Required). Пользовательский агент (броузер) получает ответ 407 и просит пользователя ввести имя и пароль. Имя и пароль кодируется и посылается в заголовке Authorization для последующих запросов к прокси.

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

Аутентификация фактически происходит вне основного процесса Squid. Когда Squid стартует, он запускаеть несколько процессов аутентификации. Эти процессы читают имена пользователей и пароли со стандартного ввода и выдают "OK" или "ERR" на стандартный вывод. Подобная техника позволяет вам использовать большое количество различных схем аутентификации, однако вы можете использовать только одну схему в данный момент времени.

Аутентификация NTLM

NTLM представляет собой расширенную версию старого протокола аутентификации LM (LAN Manager). NTLM работает посредством вопросов/ответов между сервером и клиентом без передачи пароля пользователя через сеть в открытом виде. Клиент должен подтвердить то, что он знает пароль пользователя, посредством отправки зашифрованного хэша.

NTLM функционирует следующим образом:

  1. Пользователь указывает имя пользователя, пароль и имя домена при входе на компьютер-клиент.
  2. Клиент создает хэш данного пароля и удаляет оригинал.
  3. Клиент отправляет серверу имя пользователя в открытом виде.
  4. Сервер отправляет клиенту 16-битный фрагмент случайных данных.
  5. Клиент шифрует этот фрагмент, а также хэш пароля пользователя и передает их на сервер.
  6. Сервер передает имя пользователя, случайный фрагмент данных и ответ клиента на контроллер домена.
  7. Контроллер домена шифрует отрезок случайных данных вместе со своим собственным хэшем пароля пользователя, после чего сравнивает их с элементами, присланными сервером.
  8. Если значения совпадают, контроллер домена уведомляет сервер об успешном завершении аутентификации.
  9. Если значения или имя пользователя не совпадают, контроллер домена уведомляет об этом сервер, который передает клиенту соответствующее сообщение. После этого браузер клиента запрашивает у пользователя аутентификационные данные.

Возможно отключать и включать данную авторизацию в самом браузере:
Первоисточник: http://skeletor.org.ua/?p=422

Приведу некоторые выдержки:

Opera: официально не поддерживает NTLM-авторизацию, хотя в настройках можно найти пункт, который позволяет включать или отключать эту опцию. Поэтому, в настройках вашего прокси-сервера нужно добавить basic авторизацию. Что бы отключить NTLM-авторизацию (и собственно заставить работать через прокси этот браузер) делаем следующее:

1) набираем в браузере about:config
2) переходим в раздел NetWork и снимаем галочку с параметра Enable NTLM
3) перезапускаем браузер.

Правда есть один ньюанс (так сказать неудобство): при первом запуске придётся ввести логин пароль (полностью, то есть с доменом) и поставить галочку «Сохранить». Теперь при каждом последующем открытии браузера табличка авторизации появляться будет, и нужно будет просто жать «Ок». Неудобно, но что поделаешь.

Примечание: иногда на некоторых ОС наоборот приходилось включать NTLM-авторизацию. Возможно это так же зависило от версий браузера и ОС.

FireFox, Chrome: они поддерживают, хотя нужно немного по шаманить. Опишу несколько вариантов, которые раздобыл в интернете, возможно вам придётся перепробовать все, пока не найдёте тот, который подошёл вам.

1) нужно будет добавить в реестре HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa параметр под названием LmCompatibilityLevel типа DWORD и присвоить ему значение 1. После чего надо будет перегрузить компьютер (именно этот вариант мне подошёл)

2) Чтобы Firefox мог проходить ntlm авторизацию, вроде достаточно открыть в адресной строке about:config и изменить параметры на такие:

network.negotiate-auth.delegation-uris = http://,https://
network.negotiate-auth.trusted-uris = http://,https://

После чего перезапустить браузер.

3) Открываем редактор политик (gpedit.msc) Конфигурация компьютера -> Конфигурация windows -> Параметры безопасности -> Локальные Политики -> Параметры Безопасности -> Сетевая безопасность: уровень проверки подлинности LAN Manager и ставим параметр Отправлять LM и NTLM – использовать сеансовую безопасность NTLMv2 при согласовании.

После чего закрываем политику и перегружаемся.

Если у вас английская версия, тогда так: machine policy-> computer config->windows setting->local policies->security option->Network security: LAN Manager authentication level и выбрать LM & NTLM – Use NTLMv2 session if negotited.

От себя: у меня все заработало. шаманить с самими браузерами не пришлось. Но информация по включению и отключению NTLM в браузере полезна.

Полезные статьи:

http://www.securitylab.ru/analytics/362448.php
http://www.chla.ru/index.php/security
http://wiki.squid-cache.org/ConfigExamples#Authentication