2008-08-22 8 views
6

J'essaie d'implémenter l'authentification NTLM sur l'un de nos sites internes et tout fonctionne. La seule pièce du puzzle que je n'ai pas est comment prendre l'information de NTLM et s'authentifier avec Active Directory.Comment utiliser l'authentification NTLM avec Active Directory

Il existe un good description of NTLM et le encryption used for the passwords, que j'ai utilisé pour implémenter cela, mais je ne suis pas sûr de savoir comment vérifier si le mot de passe de l'utilisateur est valide. J'utilise ColdFusion mais une solution à ce problème peut être dans n'importe quelle langue (Java, Python, PHP, etc.).

Edit:

J'utilise ColdFusion sur Redhat Enterprise Linux. Malheureusement, nous ne pouvons pas utiliser IIS pour gérer cela et au lieu d'écrire ou d'utiliser un outil tiers pour cela.


Mise à jour-je suis arrivé ce travail et voici ce que je faisais

Je suis allé avec le JCIFS library from samba.org.

Notez que la méthode ci-dessous ne fonctionne qu'avec NTLMv1 et NE FONCTIONNE PAS avec NTLMv2. Si vous ne parvenez pas à utiliser NTLMv1 vous pouvez essayer Jespa, qui prend en charge NTLMv2 mais pas open source, ou vous pouvez utiliser Kerberos/SPNEGO.

Voici mon 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> 

Maintenant toutes les URL /admin/* nécessitera l'authentification NTLM.

Répondre

0

Hm, je ne suis pas sûr de ce que vous essayez d'accomplir. Habituellement, l'implémentation de NTLM sur un site interne est aussi simple que de décocher «Activer l'accès anonyme» dans «Authentification et contrôle d'accès» dans l'onglet «Sécurité du répertoire» des propriétés du site Web dans IIS. Si cela est effacé, les utilisateurs de votre application Web verront une boîte de dialogue contextuelle NTLM.

Vous n'avez pas besoin d'écrire du code qui s'interface avec Active Directory. IIS prend soin de l'authentification pour vous.

Pouvez-vous être plus précis sur ce que vous essayez de faire?

1

Si je comprends bien.
NTLM est l'une des méthodes d'authentification intégrées d'IIS. Si l'hôte est enregistré sur le domaine dudit répertoire actif, il devrait être automatique. Une chose à surveiller est que le nom d'utilisateur doit être dans l'un des deux formats.

Si vous essayez d'aller à l'encontre d'un autre actif, vous devez répertoire utiliser une authentification de style des formulaires et un code LDAP.

Si vous essayez de faire l'Intranet Non Zéro Connexion chose avec IIS authentification intégrée

  • le domaine doit être répertorié comme un site de confiance dans le navigateur IEx
  • ou utiliser une URL l'utilise le netbios nom à la place du nom DNS.
  • pour que cela fonctionne dans firefox lire here
2

La source ModNTLM pour Apache peut vous fournir les bons pointeurs.

Si possible, vous devriez envisager d'utiliser Kerberos à la place. Il vous permet d'authentifier Apache contre AD, et c'est un espace de projet plus actif que NTLM.

18

Ce que vous demandez vraiment est: Est-il possible de valider les jetons "WWW-Authenticate: NTLM" soumis par IE et d'autres clients HTTP lors de la connexion unique (SSO). SSO signifie que l'utilisateur saisit son mot de passe à un moment «unique» lorsqu'il exécute Ctrl-Alt-Suppr et le poste de travail se souvient et l'utilise si nécessaire pour accéder aux autres ressources de manière transparente sans demander de nouveau mot de passe à l'utilisateur.

Notez que Kerberos, comme NTLM, peut également être utilisé pour implémenter l'authentification SSO. Lorsqu'ils sont présentés avec un en-tête «WWW-Authenticate: Negotiate», IE et d'autres navigateurs envoient des jetons Kerberos et/ou NTLM enveloppés par SPNEGO. Plus sur cela plus tard, mais d'abord je vais répondre à la question comme demandé. La seule façon de valider une "réponse" de mot de passe NTLMSSP (comme celles encodées dans les en-têtes "WWW-Authenticate: NTLM" soumis par IE et d'autres navigateurs) est un appel NetrLogonSamLogon (Ex) DCERPC avec le service NETLOGON de un contrôleur de domaine Active Directory qui est une autorité pour le compte cible ou a une «approbation» avec une autorité pour le compte cible. De plus, pour sécuriser correctement la communication NETLOGON, le cryptage Secure Channel doit être utilisé et requis à partir de Windows Server 2008.

Inutile de dire que très peu de paquets implémentent les appels de service NETLOGON nécessaires. Les seuls que je connais sont:

  1. de Windows (bien sûr)

  2. Samba - Samba est un ensemble de logiciels pour UNIX qui implémente un certain nombre de protocoles de Windows, y compris le service Netlogon nécessaire appels. En fait, Samba 3 dispose d'un démon spécial appelé "winbind" que d'autres programmes comme les modules PAM et Apache peuvent (et font) utiliser. Sur un système Red Hat, vous pouvez faire un yum install samba-winbind et yum install mod_auth_ntlm_winbind. Mais c'est la partie facile - mettre ces choses en place est une autre histoire. Jespa - Jespa (http://www.ioplex.com/jespa.html) est une bibliothèque 100% Java qui implémente tous les appels de service NETLOGON nécessaires.Il fournit également des implémentations d'interfaces Java standard pour l'authentification des clients de diverses façons, comme avec un filtre HTTP Servlet, serveur SASL, JAAS LoginModule, etc.

Prenez garde qu'il ya un certain nombre d'accepteurs d'authentification NTLM qui ne le font pas implémenter les appels de service NETLOGON nécessaires mais faire plutôt autre chose qui mène finalement à l'échec dans un scénario ou un autre. Par exemple, pendant des années, la façon de faire cela en Java était avec le filtre de servlet d'authentification HTTP NTLM d'un projet appelé JCIFS. Mais ce filtre utilise une technique man-in-the-middle qui a été responsable d'un "bug hiccup" de longue date et, plus important encore, il ne supporte pas NTLMv2. Pour ces raisons et d'autres, il est prévu d'être retiré de JCIFS. Il y a plusieurs projets qui ont été involontairement inspirés par ce paquet qui sont maintenant également condamnés. Il y a aussi beaucoup de fragments de code postés dans les forums Java qui décodent le jeton d'en-tête et extraient le domaine et le nom d'utilisateur mais ne font absolument rien pour réellement valider les réponses du mot de passe. Il suffit de dire, si vous utilisez un de ces fragments de code, vous pourriez aussi bien marcher avec votre pantalon. NTLM est l'un des nombreux fournisseurs de support de sécurité Windows (SSP). Il existe également un SSP Digest, un SSP Kerberos, etc. Mais le SSP Négocier, également connu sous le nom de SPNEGO, est généralement le fournisseur que MS utilise dans ses propres clients de protocole. Le fournisseur SSP de négociation négocie simplement le fournisseur SSP NTLM ou le fournisseur SSP Kerberos. Notez que Kerberos ne peut être utilisé que si le serveur et le client ont des comptes dans le domaine cible et que le client peut communiquer suffisamment avec le contrôleur de domaine pour acquérir un ticket Kerberos. Si ces conditions ne sont pas satisfaites, le SSP NTLM est utilisé directement. NTLM n'est donc pas obsolète. Enfin, certaines personnes ont mentionné l'utilisation d'une liaison simple LDAP comme service de validation de mot de passe de fortune. LDAP n'est pas vraiment conçu comme un service d'authentification et pour cette raison, il n'est pas efficace. Il n'est également pas possible d'implémenter SSO en utilisant LDAP. SSO nécessite NTLM ou SPNEGO. Si vous pouvez trouver un accepteur NETLOGON ou SPNEGO, vous devriez l'utiliser à la place.

Mike

1

Check out Waffle. Il implémente SSO pour les serveurs Java utilisant l'API Win32. Il y a servlet, soupape tomcat, sécurité à ressort et autres filtres.

1

Vous pouvez résoudre la fenêtre d'authentification Firefox en effectuant les étapes suivantes dans Firefox:

  1. Ouvrez Mozilla Firefox
  2. Tapez about: config dans la barre d'adresse
  3. Entrez network.automatic-ntlm-auth. trusted-uri dans la recherche texfield
  4. Double-cliquez sur le nom de la préférence et saisissez le nom de votre serveur en tant que valeur chaîne
  5. Fermer l'onglet
  6. Redémarrez Firefox.
Questions connexes