Es gibt drei Authentifizierungsprotokolle, mit denen die Authentifizierung zwischen Java und Active Directory unter Linux oder einer anderen Plattform durchgeführt werden kann (und die nicht nur für HTTP-Dienste spezifisch sind):
Kerberos - Kerberos bietet Single Sign-On (SSO) und Delegierung, aber Webserver benötigen auch SPNEGO-Unterstützung, um SSO über den IE zu akzeptieren.
NTLM - NTLM unterstützt SSO über den Internet Explorer (und andere Browser, wenn diese ordnungsgemäß konfiguriert sind).
LDAP - Eine LDAP-Bindung kann verwendet werden, um einfach einen Kontonamen und ein Kennwort zu überprüfen.
Es gibt auch etwas namens "ADFS", das SSO für Websites mit SAML bereitstellt, die den Windows-SSP aufrufen. In der Praxis handelt es sich also im Grunde genommen um einen Umweg, eines der anderen oben genannten Protokolle zu verwenden.
Jedes Protokoll hat seine Vorteile, aber als Faustregel sollten Sie für maximale Kompatibilität im Allgemeinen versuchen, "so zu tun, wie Windows es tut". Was macht Windows?
Erstens begünstigt die Authentifizierung zwischen zwei Windows-Computern Kerberos, da Server nicht mit dem Domänencontroller kommunizieren müssen und Clients Kerberos-Tickets zwischenspeichern können, wodurch die Belastung der Domänencontroller verringert wird (und weil Kerberos die Delegierung unterstützt).
Wenn die authentifizierenden Parteien jedoch nicht beide über Domänenkonten verfügen oder der Client nicht mit dem DC kommunizieren kann, ist NTLM erforderlich. Kerberos und NTLM schließen sich also nicht gegenseitig aus und NTLM wird von Kerberos nicht überholt. In gewisser Hinsicht ist NTLM sogar besser als Kerberos. Beachten Sie, dass ich, wenn ich Kerberos und NTLM in einem Atemzug erwähne, auch SPENGO und die integrierte Windows-Authentifizierung (IWA) erwähnen muss. IWA ist ein einfacher Begriff, der im Grunde Kerberos oder NTLM oder SPNEGO bedeutet, um Kerberos oder NTLM auszuhandeln.
Die Verwendung einer LDAP-Bindung zum Überprüfen von Anmeldeinformationen ist nicht effizient und erfordert SSL. Bis vor kurzem war die Implementierung von Kerberos und NTLM jedoch schwierig, sodass die Verwendung von LDAP als Make-Shift-Authentifizierungsdienst weiterhin besteht. An dieser Stelle sollte dies jedoch generell vermieden werden. LDAP ist ein Informationsverzeichnis und kein Authentifizierungsdienst. Verwenden Sie es für den vorgesehenen Zweck.
Wie implementieren Sie Kerberos oder NTLM in Java und insbesondere im Kontext von Webanwendungen?
Es gibt eine Reihe großer Unternehmen wie Quest Software und Centrify, die Lösungen anbieten, die speziell Java erwähnen. Ich kann diese nicht wirklich kommentieren, da es sich um unternehmensweite "Identity Management-Lösungen" handelt. Wenn man sich also den Marketing-Spin auf ihrer Website ansieht, ist es schwierig, genau zu sagen, welche Protokolle wie verwendet werden. Sie müssten sie für die Details kontaktieren.
Die Implementierung von Kerberos in Java ist nicht besonders schwierig, da die Standard-Java-Bibliotheken Kerberos über die Klassen org.ietf.gssapi unterstützen. Bis vor kurzem gab es jedoch eine große Hürde: Der IE sendet keine rohen Kerberos-Token, sondern SPNEGO-Token. Aber mit Java 6 wurde SPNEGO implementiert. Theoretisch sollten Sie in der Lage sein, GSSAPI-Code zu schreiben, mit dem IE-Clients authentifiziert werden können. Aber ich habe es nicht versucht. Die Sun-Implementierung von Kerberos war im Laufe der Jahre eine Komödie von Fehlern. Aufgrund der Erfolgsbilanz von Sun in diesem Bereich würde ich keine Zusagen über die SPENGO-Implementierung machen, bis Sie diesen Vogel in der Hand haben.
Für NTLM gibt es ein kostenloses OSS-Projekt namens JCIFS mit einem Servlet-Filter für die NTLM-HTTP-Authentifizierung. Es wird jedoch eine Man-in-the-Middle-Methode verwendet, um die Anmeldeinformationen mit einem SMB-Server zu überprüfen, der nicht mit NTLMv2 funktioniert (was langsam zu einer erforderlichen Sicherheitsrichtlinie für Domänen wird). Aus diesem und anderen Gründen soll der HTTP-Filterteil von JCIFS entfernt werden. Beachten Sie, dass es eine Reihe von Ausgründungen gibt, die JCIFS verwenden, um dieselbe Technik zu implementieren. Wenn Sie also andere Projekte sehen, die behaupten, NTLM SSO zu unterstützen, überprüfen Sie das Kleingedruckte.
Die einzig richtige Möglichkeit, NTLM-Anmeldeinformationen mit Active Directory zu überprüfen, ist die Verwendung des DCERPC-Aufrufs NetrLogonSamLogon über NETLOGON mit Secure Channel. Gibt es so etwas in Java? Ja. Hier ist es:
http://www.ioplex.com/jespa.html
Jespa ist eine 100% Java NTLM-Implementierung, die NTLMv2, NTLMv1, vollständige Integritäts- und Vertraulichkeitsoptionen sowie die oben erwähnte Überprüfung der NETLOGON-Anmeldeinformationen unterstützt. Dazu gehören ein HTTP-SSO-Filter, ein JAAS-Anmeldemodul, ein HTTP-Client, ein SASL-Client und -Server (mit JNDI-Bindung), ein generischer "Sicherheitsanbieter" zum Erstellen benutzerdefinierter NTLM-Dienste und vieles mehr.
Mike