Как использовать проверку подлинности NTLM с Active Directory - PullRequest
7 голосов
/ 22 августа 2008

Я пытаюсь внедрить проверку подлинности NTLM на одном из наших внутренних сайтов, и все работает. Одна часть головоломки, которой у меня нет, заключается в том, как взять информацию из NTLM и пройти аутентификацию в Active Directory.

Существует хорошее описание NTLM и шифрование , используемое для паролей , которое я использовал для реализации этого, но я не уверен, как проверить, если пароль пользователя действителен.

Я использую ColdFusion, но решение этой проблемы может быть на любом языке (Java, Python, PHP и т. Д.).

Edit:

Я использую ColdFusion в Redhat Enterprise Linux. К сожалению, мы не можем использовать IIS для управления этим и вместо этого приходится писать или использовать сторонние инструменты для этого.


Обновление - Я получил это работает, и вот что я сделал

Я пошел с библиотекой JCIFS с samba.org.

Обратите внимание, что приведенный ниже метод будет работать только с NTLMv1, а НЕ работает с NTLMv2. Если вы не можете использовать NTLMv1, вы можете попробовать Jespa , который поддерживает NTLMv2, но не с открытым исходным кодом, или вы можете использовать Kerberos / SPNEGO.

Вот мой web.xml:

<web-app>
    <display-name>Ntlm</display-name>

    <filter>
        <filter-name>NtlmHttpFilter</filter-name>
        <filter-class>jcifs.http.NtlmHttpFilter</filter-class>

        <init-param>
            <param-name>jcifs.http.domainController</param-name>
            <param-value>dc01.corp.example.com</param-value>
        </init-param>
        <init-param>
            <param-name>jcifs.smb.client.domain</param-name>
            <param-value>CORP.EXAMPLE.COM</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>NtlmHttpFilter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
</web-app>

Теперь для всех URL, соответствующих /admin/*, потребуется NTLM-аутентификация.

Ответы [ 7 ]

19 голосов
/ 21 января 2009

Что вы действительно спрашиваете: есть ли способ проверить токены «WWW-Authenticate: NTLM», отправленные IE и другими HTTP-клиентами при выполнении единого входа (SSO). Единый вход - это когда пользователь вводит свой пароль «один раз», когда он нажимает Ctrl-Alt-Del, и рабочая станция запоминает и использует его по мере необходимости для прозрачного доступа к другим ресурсам, не запрашивая у пользователя пароль снова.

Обратите внимание, что Kerberos, как и NTLM, также может использоваться для реализации аутентификации SSO. При наличии заголовка «WWW-Authenticate: Negotiate» IE и другие браузеры будут отправлять токены Kerberos и / или NTLM в оболочке SPNEGO. Подробнее об этом позже, но сначала я отвечу на вопрос в том виде, в котором он был задан.

Единственный способ проверить «ответ» пароля NTLMSSP (подобно тем, которые закодированы в заголовках «WWW-Authenticate: NTLM», отправленных IE и другими браузерами), с помощью вызова NetrLogonSamLogon (Ex) DCERPC с помощью службы NETLOGON Контроллер домена Active Directory, который является доверенным лицом или имеет «доверие» с полномочиями для целевой учетной записи. Кроме того, для надлежащей защиты связи NETLOGON следует использовать шифрование безопасного канала, которое требуется начиная с Windows Server 2008.

Нет необходимости говорить, что очень мало пакетов, которые реализуют необходимые сервисные вызовы NETLOGON. Единственные, о которых я знаю:

  1. Windows (конечно)

  2. Samba - Samba - это набор программ для UNIX, который реализует ряд протоколов Windows, включая необходимые сервисные вызовы NETLOGON. Фактически, в Samba 3 есть специальный демон для этого, называемый «winbind», с которым могут (и могут) взаимодействовать другие программы, такие как модули PAM и Apache. В системе Red Hat вы можете сделать yum install samba-winbind и yum install mod_auth_ntlm_winbind. Но это самая легкая часть - настройка этих вещей - другая история.

  3. Jespa - Jespa (http://www.ioplex.com/jespa.html) - это 100% -ная библиотека Java, которая реализует все необходимые вызовы службы NETLOGON. Она также обеспечивает реализации стандартных интерфейсов Java для аутентификации клиентов различными способами, например с помощью Фильтр сервлетов HTTP, сервер SASL, модуль входа в систему JAAS и т. Д.

Остерегайтесь того, что существует ряд акцепторов аутентификации NTLM, которые не реализуют необходимые сервисные вызовы NETLOGON, а вместо этого делают что-то еще, что в конечном итоге приводит к сбою в том или ином сценарии. Например, в течение многих лет способ сделать это в Java был с помощью фильтра сервлетов аутентификации HTTP NTLM из проекта под названием JCIFS. Но этот Фильтр использует технику «человек посередине», которая несет ответственность за давнюю «ошибку икоты» и, что более важно, он не поддерживает NTLMv2. По этим и другим причинам его планируется удалить из JCIFS. Есть несколько проектов, которые были непреднамеренно вдохновлены этим пакетом, которые теперь также в равной степени обречены. Также на форумах Java размещено много фрагментов кода, которые декодируют маркер заголовка и отбирают домен и имя пользователя, но абсолютно ничего не делают для проверки ответов на пароли. Достаточно сказать, что, если вы используете один из этих фрагментов кода, вы могли бы также ходить с брюками вниз.

Как я уже говорил ранее, NTLM является лишь одним из нескольких поставщиков поддержки безопасности Windows (SSP). Есть также Digest SSP, Kerberos SSP и т. Д. Но SSP Negotiate, также известный как SPNEGO, обычно является поставщиком, который MS использует в своих собственных клиентских протоколах. Согласовать SSP фактически просто согласовывает либо NTLM SSP, либо Kerberos SSP. Обратите внимание, что Kerberos можно использовать только в том случае, если и у сервера, и у клиента есть учетные записи в целевом домене, и клиент может достаточно обмениваться данными с контроллером домена, чтобы получить билет Kerberos. Если эти условия не выполняются, NTLM SSP используется напрямую. Так что NTLM ни в коем случае не устарел.

Наконец, некоторые люди упоминают об использовании «простого связывания» LDAP в качестве службы проверки паролей. LDAP на самом деле не предназначен для аутентификации, и по этой причине он неэффективен. Также невозможно реализовать SSO с использованием LDAP. SSO требует NTLM или SPNEGO. Если вы можете найти акцептор NETLOGON или SPNEGO, вы должны использовать его вместо этого.

Mike

2 голосов
/ 15 сентября 2008

Источник ModNTLM для Apache может предоставить вам правильные указатели.

Если возможно, вам следует рассмотреть возможность использования Kerberos . Он позволяет вам аутентифицировать Apache в AD и является более активным пространством проекта, чем NTLM.

2 голосов
/ 22 августа 2008

Как я понимаю.
NTLM - это один из встроенных в IIS методов аутентификации. Если Хост зарегистрирован в домене указанного активного каталога, он должен быть автоматическим. Следует обратить внимание на то, что имя пользователя должно быть в одном из двух форматов.

  • домен \ имя пользователя
  • username@domain.tld

Если вы пытаетесь использовать другой активный каталог, вы должны использовать аутентификацию в стиле форм и некоторый код LDAP.

Если вы пытаетесь выполнить вход в интрасеть без нуля с помощью встроенной аутентификации IIS

  • домен должен быть указан как надежный сайт в браузере IEx
  • или используйте URL-адрес, вместо имени DNS используется имя netbios.
  • чтобы он работал в Firefox, прочитайте здесь
1 голос
/ 08 ноября 2013

Вы можете разрешить всплывающее окно аутентификации Firefox, выполнив следующие шаги в Firefox:

  1. Открыть Mozilla Firefox
  2. Введите about: config в адресную строку
  3. Введите network.automatic-ntlm-auth.trusted-uris в поле поиска Поиск
  4. Дважды щелкните имя предпочтения и введите имя сервера в виде строкового значения
  5. Закрыть вкладку
  6. Перезапустите Firefox.
1 голос
/ 27 июля 2010

Выезд Вафля . Он реализует единый вход для серверов Java с использованием Win32 API. Есть сервлет, клапан Tomcat, пружинный предохранитель и другие фильтры.

0 голосов
/ 22 августа 2008

Я предполагаю, что вы хотите получить некоторые из атрибутов, которые установлены для учетной записи LDAP - роль - отдел и т. Д.

для холодного синтеза проверить это http://www.adobe.com/devnet/server_archive/articles/integrating_cf_apps_w_ms_active_directory.html

и тег cfldap http://livedocs.adobe.com/coldfusion/6.1/htmldocs/tags-p69.htm#wp1100581

Что касается других языков - другие будут делать это с соответствующими API

0 голосов
/ 22 августа 2008

Хм, я не уверен, чего вы пытаетесь достичь.

Обычно реализовать NTLM на внутреннем сайте так же просто, как снять флажок «Включить анонимный доступ» в «Аутентификации и управлении доступом» на вкладке «Безопасность каталога» свойств веб-сайта в IIS. Если этот флажок снят, пользователи веб-приложения увидят всплывающее диалоговое окно NTLM.

Вам не нужно писать какой-либо код, который взаимодействует с Active Directory. IIS позаботится о вашей аутентификации.

Можете ли вы более конкретно рассказать о том, что вы пытаетесь сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...