Назад | Перейти на главную страницу

Проверка подлинности Apache2 NTLM без запроса полу-базового типа проверки подлинности

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

Я использую сервер Windows в качестве контроллера домена, Windows 7/8 в качестве системного клиента, Linux / Debian в качестве веб-сервера. Я настроил kerberos из linux для Windows AD, winbind для локальной проверки подлинности NTLM и серии apache 2.2. В качестве клея для аутентификации apache я использую модуль apache2 mod_auth_ntlm_winbind.so и вспомогательный модуль 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, затем я добавил в конфигурацию выше перезаписи:

  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

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

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

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

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

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

KrbMethodNegotiate on
KrbMethodK5Passwd off

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

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

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

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

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

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

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

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

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