NTLM
Материал из Eludia.
Внммание! Большая часть содержательной информации данного раздела перенесена в статью Аутентификация. Остальное — удалено.
Немного теории
Прежде всего опишем вкратце, в чём заключается NTLM-авторизация в WEB-приложениях (подробное описание можно найти здесь). Если обычный успешный HTTP-запрос обрабатывается так:
- клиент шлёт запрос;
- сервер шлёт ответ с кодом 200 (ОК);
то в случае NTLM всё чуть сложнее:
- клиент шлёт обычный запрос;
- сервер шлёт ответ 1-го типа с кодом 401 (Authorization required) как запрос на логин
- клиент шлёт запрос c логином;
- сервер шлёт ответ 2-го типа с кодом 401 C заголовком WWW-Authenticate, содержащим случайный ключ;
- клиент повторяет запрос, но сопровождает его NTLM-хэшем, зашифрованным на этом ключе;
- сервер шлёт ответ с кодом 200 (конечно, если проверка логин/хэш прошла успешно).
Отсюда сразу следуют 2 вещи:
- использование NTLM-авторизации чревато многократным умножением количества запросов (хотя большого трафика они и не создают);
- всё это может работать только в режиме Keep-alive.
Последнее ограничение весьма неприятно, поскльку исключает возможность установки сервера приложения за реверсным proxy. Тем не менее, такова жизнь.
Если пользователь авторизовался в Windows при помощи домена, используемого вашим приложением, то браузер может вести диалог с сервером, не выдавая пользователю login-форму, в зависимости от настроек.
Оригинальное решение
Eludia.pm содержит собственный набор процедур для работы с заголовками NTLM. На момент написания настоящего текста состояние кода можно рассматривать как бету, при установке возможны разнообразные неожиданности. Тем не менее, механизм в целом работоспособен.
Реализован он несколько легкомысленно (выдача одного-единственного, раз навсегда заданного заголовка 2-го типа), однако это даёт неоспоримое преимущество: режим keep-alive не требуется, так что сервер можно устанавливать за HTTP proxy. Кроме того, реализована поддержка NTLMv2, так что Vista-клиенты вполне работоспособны.
Ограничения:
- ActiveDirectory не поддерживается, только его эмуляция на базе Samba;
- не реализовано NTLMv1 (что актуально только для тех, у кого давно не поддерживаемые Windоws);
- при авторизации не учитывается имя домена (то есть домен на всех один, умолчательный);
- ни логины, ни пароли не могут содержать символов старше 127-го.
Использовать механизм просто: достаточно приписать
ntlm => 'samba',
в раздел ldap опций $preconf, остальные параметры — такие же, как выше. После установки этой опции обработчик запросов при пустом параметре sid инициирует NTLM-диалог с клиентом и в случае успешной авторизации заводит сессию для пользователя, login которого определяется по LDAP-параметру sid.
| Тема этой заметки имеет некоторое отношение к компьютерной так называемой "безопасности". |

