NTLM аутентификации Apache2 без запрашиваемого полу Базовый тип аутентификации

Я успешно настроил аутентификацию ntlm. К сожалению, конфиг допускает полуосновную авторизацию. Например, когда я использую Tortoise SVN1.8.4(с библиотекой Serf Access Lib), браузерами Chrome или IE, они успешно аутентифицируют NTLM, ничего не запрашивая. В лог-файле я вижу аутентифицированных пользователей. К сожалению, когда я использую, например, ненастроенный FireFox или Maxthon, этот браузер запрашивает учетные данные. Мне это не нужно, потому что такая же ситуация, когда я пытаюсь получить доступ с компьютера вне домена.

Я использую Windows Server в качестве контроллера домена, Windows7/8 в качестве системного клиента, Linux/ Debian в качестве веб-сервера. Я настроил Kerberos из Linux, сделать Windows AD, Winbind для локальной аутентификации NTLM и Apache 2.2 серии. Для клея аутентификации apache я использую модуль apache2 mod_auth_ntlm_winbind.so, а в директории / location config помощник ntlm для связи с winbind. Это работает правильно, пример для Apache:

<Directory /var/www/>
  #defaults for main www directory
  Options Indexes FollowSymLinks MultiViews
  AllowOverride None
  #modified, prevent for any ip access, for future add authless access from specified hosts
  Order deny,allow
  deny from all
  #allow from IP/mask
  #settings for NTLM auth with winbind helper
  AuthName "NTLM Authentication"
  NTLMAuth on
  NTLMAuthHelper "/usr/bin/ntlm_auth  --domain=MY.WINDOWS.DOMAIN --helper-protocol=squid-2.5-ntlmssp"
  NTLMBasicAuthoritative on
  AuthType NTLM
  require valid-user
  #because ip is default deny
  satisfy any
</Directory>

Я надеялся, что, может быть, я смогу сделать какое-то перенаправление с помощью переменной apache authtype, затем я добавил в config вышеописанную переписывание

  RewriteEngine on
  RewriteRule ^ /cgi-bin/TestAuth.pl?DollarOne=1&AUTH_TYPE=%{AUTH_TYPE}&REMOTE_USER=%{REMOTE_USER}

И пример скрипта TestAuth.pl в виде содержимого cgi:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper; #easy way for print system variables
print "Content-type:text/plain\r\n"; #respectint HTML protocol
print "\r\n";
print "Enviroment contains:\r\n";
print "x\r\n";
print Data::Dumper->Dump([\@ARGV,\%ENV],[qw(ARGV ENV)]); #prints all script arguments and process variables

К сожалению, во всех случаях с Windows Auth NTLM и запрашиваемыми учетными данными я всегда вижу, что AUTH_TYPE всегда NTLM. Тогда нет способа узнать, что делает браузер. В этой ситуации я могу получить доступ от клиентов вне домена.

Я попробовал обернуть нтлм хеплер страсом. К сожалению, я не вижу ничего важного в его дампе с четырьмя способами, сочетающими успешную / неудачную аутентификацию и доступ через IE без запроса и запрос FF. Я думаю, что та же самая ситуация происходит, когда помощник ntlm аутентифицируется на локальном сервере Samba, но я никогда не проверял это.

Сейчас я пытаюсь сделать некоторые настройки с несколькими типами аутентификации, Basic и NTLM. Я пытаюсь сначала сделать Basic и отфильтровать это с ошибкой всегда и перенаправить на страницу информации. К сожалению, сейчас без успеха с NTLM микс:( NTLM всегда делается первым.

Тогда у кого-нибудь есть идея, как предотвратить запрос учетных данных? Как отозвать доступ у приглашенных клиентов? Как распознать учетные данные из командной строки или из окна клиента API?

2 ответа

Решение

Использование аутентификации NTLM не гарантирует вход без учетных данных. Если у вас есть действительные учетные данные Windows, которые сервер может распознать, вы не получите запрос пароля.

Если у пользователя нет действительных учетных данных NTLM, ему будет предложено предоставить их. Нельзя вернуться к "базовой" аутентификации.

К сожалению, невозможно определить, предоставили ли пользователь учетные данные или они были переданы системой.

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

В настоящее время я решил эту проблему, переключив NTLM на аутентификацию Kerberos. Все подготовленные для winbind работают непосредственно под Kerberos, потому что я ранее настроил Kerberos для Winbind с коммуникацией сервера AD. Поскольку Kerberos открыт, разработчики прогнозировали различную субаутентификацию на конечной точке пользователя. Очень полезен флаг в модуле kerberos apache2.2:

KrbMethodNegotiate on
KrbMethodK5Passwd off

Это потому, что я хочу. Браузер получает фрейм krb с атрибутом "Не отображать учетные данные пользователя", тогда клиент просто не делает этого. Но если да (какая-либо несовместимость?), Серверный модуль apache должен обнаружить это и отменить аутентификацию.

Использование Microsoft NTLM это невозможно, потому что протокол испорчен. Первый кадр NTLM после веб-кода возврата 201 не имеет возможности добавить атрибут "не запрашивать у пользователя учетные данные". Затем я могу отфильтровать этот кадр после всплывающего окна или знака ключа сеанса ОС. Это приводит к тому, что браузер всегда отображает всплывающее окно, когда ключ сеанса ОС недоступен.

В конце концов это еще один шанс. Пользователь занимает некоторое время для записи учетных данных или принимает, когда учетные данные хранятся в браузере. Я могу посчитать время между отправкой фрейма авторизации в браузер и фреймом, полученным от клиента. Когда время слишком долго, я могу отозвать. К сожалению, это может привести к ложной неаутентификации на занятых компьютерах или в сетях.

Я попробую оба метода в будущем:) Будет забавно, если все это можно будет сделать с помощью модуля apache winbind auth. Тогда весь конфиг может быть инкапсулирован в Apache, так же, как для аутентификации Kerberos.

Спасибо всем за интерес, исследования и помощь:)

Другие вопросы по тегам