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.
Спасибо всем за интерес, исследования и помощь:)