Spring Blog

Wir freuen uns, Ihnen mitteilen zu können, dass der erste Meilenstein der Spring Security Kerberos-Erweiterung jetzt zum Download verfügbar ist. Die Version ist auch über das Maven Milestone Repository unter http://maven.springframework.org/milestone verfügbar. Mit der Kerberos-Erweiterung von Spring Security werden Ihre Benutzer nur durch Öffnen der URL gegenüber Ihrer Webanwendung authentifiziert. Es ist nicht erforderlich, einen Benutzernamen / ein Passwort einzugeben und keine zusätzliche Software zu installieren.

Bevor ich mich eingehender mit Kerberos befasse, möchte ich Spring Security Extensions vorstellen, ein neues Spring-Erweiterungsprojekt, das Erweiterungsmodule für das Core Spring Security-Projekt bereitstellt. Derzeit haben wir dort zwei Erweiterungen entwickelt: Eine SAML2-Integration und eine Kerberos / SPNEGO-Integration. Jedes Modul wird seinen eigenen Release-Zyklus haben, so dass die Leute von diesen Erweiterungen profitieren können, sobald sie bereit sind und nicht auf das nächste Spring Security Release warten müssen. Wenn Sie Ideen oder sogar Code für weitere Erweiterungen haben, teilen Sie uns dies bitte mit!

Kerberos/SPNEGO

Im ersten Meilenstein dieses Moduls stellen wir Ihnen eine sofort einsatzbereite Kerberos/SPNEGO-Lösung für Webanwendungen zur Verfügung. Kerberos ist ein standardisiertes Netzwerkauthentifizierungsprotokoll, das eine starke Authentifizierung für Client / Server-Anwendungen ermöglicht, z. B. Webanwendungen, bei denen der Browser der Client ist. Es ist auch die empfohlene Methode zur Authentifizierung von Benutzern in einem Windows-Netzwerk und ersetzt das veraltete und relativ unsichere NTLM. Darüber hinaus ist es in * NIX-Umgebungen weit verbreitet und es gibt Implementierungen für jede wichtige Plattform. Es ist also sehr wahrscheinlich, dass Sie Kerberos bereits installiert haben und dies jetzt auch in Ihrer eigenen Webanwendung verwenden können. Das bedeutet, dass Ihr Benutzer nur die URL eingibt und automatisch mit seinem Domain-Benutzernamen authentifiziert wird, zum Beispiel [email protected] . Sie können diesen Benutzernamen dann über Spring Security oder sogar mit request herausfinden.getRemoteUser(). Wie funktioniert das? Hier ein kurzer Überblick:

Der Browser sendet eine GET-Anforderung an Ihre Webanwendung (1), die dann zurückgibt, dass eine „Aushandeln“ -Authentifizierung erforderlich ist (2). Der Browser fordert dann den Kerberos-Server auf, ein sogenanntes Service-Ticket zu erhalten (3). Der Browser sendet dann dieses Service-Ticket, das die Identität des Anrufers nachweist, und einige zusätzliche Dinge an die Webanwendung (5). Nachdem Sie das Ticket basierend auf einem gemeinsamen Geheimnis zwischen Ihrer Webanwendung und dem Kerberos-Server validiert haben, erhalten Sie den Benutzernamen zurück.

Damit dies funktioniert, muss jede Webanwendung auf dem Kerberos-Server registriert werden und erhält ein Dienstprinzip und ein gemeinsames Geheimnis zugewiesen. Für Webanwendungen muss der Dienstprinzipal „HTTP/<full qualified domain name>@DOMAIN“ sein. Zum Beispiel „HTTP/[email protected] „, wenn Ihre App läuft auf web.springsource.com Anschließend müssen Sie die Anmeldeinformationen dieses Principals in eine Keytab-Datei (Shared secret) exportieren und dieser Anwendung zur Verfügung stellen. Jedes Kerberos-basierte System funktioniert auf diese Weise, aber die Erstellung dieses Dienstprinzipals und der Schlüsseltabelle unterscheidet sich zwischen den Systemen. Ich werde Ihnen zeigen, wie Sie dies mit Microsoft Windows und MIT Kerberos tun, aber es sollte auch mit anderen Implementierungen funktionieren.

Dienstprinzipal mit Microsoft Windows 2008 Server erstellen

Obwohl sich dies auf Microsoft Windows 2008 Server bezieht, sollte es in 2003 und sogar 2000 Server sehr ähnlich sein. In ActiveDirectory erstellen Sie einfach einen normalen Domänenbenutzer und weisen ihm dann einen Dienstprinzipal (SPN) zu. Und nun Schritt für Schritt:

Erstellen Sie einen normalen Benutzer, der zum Dienstprinzipal wird. Der Benutzername und das Passwort sind für Kerberos bedeutungslos, aber Sie sollten natürlich einen nützlichen Namen wählen, wie http-web.springsource.com . Stellen Sie einfach sicher, dass Sie die Option „Benutzer muss Passwort bei nächster Anmeldung ändern“ deaktivieren und „Passwort läuft nie ab“ aktivieren.

Danach müssen Sie das Befehlszeilentool „ktpass.exe“. Es ist bereits in Windows 2008 Server enthalten, in früheren Versionen müssen Sie es selbst installieren. Stellen Sie einfach sicher, dass Sie eine Version verwenden, die Ihrer Serverversion entspricht, und auch das Gebietsschema sollte übereinstimmen. Dieses Tool weist Ihrem zuvor erstellten Benutzer den Dienstprinzipalnamen (SPN) zu und exportiert den Benutzerschlüssel in eine Keytab-Datei. Wenn Ihr Service Principal ist „HTTP/[email protected] “ und Ihr Benutzer ist http-web.springsource.com , dann sollte Ihr ktpass Befehl wie folgt aussehen:


ktpass /out http-web.keytab /mapuser /princ HTTP/ /pass *

ktpass fordert Sie zur Eingabe eines Passworts auf. Sie sollten eine sichere zufällige dafür wählen. Wenn Sie jetzt eine Datei http-web.keytab in Ihrem Verzeichnis, dann hat alles gut funktioniert. Diese Datei wird später in Ihrer Anwendung benötigt, da sie das gemeinsame Geheimnis zur Validierung der Servicetickets enthält.

Service Principal mit MIT Kerberos erstellen

Auf *NIX-Systemen und auch unter Mac OS X ist die MIT Kerberos-Implementierung weit verbreitet. Mit MIT Kerberos ist es noch einfacher. Öffnen Sie einfach die Kadmin-Konsole und führen Sie die folgenden Befehle aus:


kadmin: addprinc -randkey HTTP/web.springsource.comkadmin: ktadd -k /http-web.keytab HTTP/web.springsource.com

Sie sollten dann eine Datei http-web haben.keytab unter root. Diese Datei wird später in Ihrer Anwendung benötigt, da sie das gemeinsame Geheimnis zur Validierung der Servicetickets enthält.

Spring Security konfigurieren

Zunächst die Anforderungen:

  • Spring Security 3.0.0 M2
  • SONNE JRE/JDK 1.6.x
  • Kerberos-Umgebung
  • Browser, der SPNEGO unterstützt (Firefox, IE, Safari)

Um das Kerberos-Modul in Spring Security zu verwenden, müssen Sie lediglich einen Filter, einen Authentifizierungseingangspunkt und einen Authentifizierungsanbieter deklarieren. Wir haben eine Beispiel-Web-App hinzugefügt, die Sie als Ausgangspunkt verwenden können. Sie müssen nur Ihren Dienstprinzipalnamen konfigurieren und Ihre generate Keytab dort platzieren. Die Beispiel-App ist im oben genannten Download enthalten.

Wenn Sie die Sicherheit öffnen.in der XML-Datei der Beispielanwendung, die sich unter / src/main/webapp/WEB-INF befindet, sehen Sie eine grundlegende Spring Security-Konfiguration, die das neue Kerberos-Modul verwendet.

Die ersten beiden Beans (SpnegoEntryPoint und SpnegoAuthenticationProcessingFilter) sind für den Handshake verantwortlich, und der KerberosServiceAuthenticationProvider validiert dann schließlich das Serviceticket. Derzeit unterstützen wir nur die Kerberos / SPNEGO-Implementierung, die in SUNS JRE / JDK enthalten ist. Da Sie nur den Benutzernamen von Kerberos zurückerhalten, benötigen Sie auch einen UserDetailsService , um die Rollen und möglicherweise einige andere Benutzerattribute abzurufen. In diesem Beispiel verwenden wir nur eine Dummy-Implementierung, um das Testen zu vereinfachen.

Wie Sie sehen, haben wir bereits den Namen des Dienstprinzips und den Speicherort der Schlüsseltabelle eingegeben. Ändern Sie diese Werte für Ihren Bedarf und stellen Sie sicher, dass die zuvor generierte Keytab unter diesem Speicherort verfügbar ist.

Starten Sie nun Ihren Server und versuchen Sie eine SPNEGO-Authentifizierung. Sie sollten Ihren vollständigen Domain-Benutzernamen im Browser sehen. In Ihrem Code können Sie den Benutzernamen mit den normalen Spring-Sicherheitsklassen oder sogar mit der Standard-Java-Servlet-Aufrufanforderung abrufen.getRemoteUser(). Wenn es nicht funktioniert (vielleicht sehen Sie eine leere Seite), überprüfen Sie diese Dinge:

  • Überprüfen Sie die Protokolldatei
  • Stellen Sie sicher, dass Sie den vollständigen qualifizierten Domainnamen (nicht die IP-Adresse und nicht den Kurznamen) in Ihrer URL verwenden.
  • Wenn Sie Internet Explorer verwenden: Aktivieren Sie „Windows Integrated Authentication“ und stellen Sie sicher, dass die Domäne (in unserem Fall web.springsource.com ) ist im Abschnitt lokale Intranet-Site des IE aufgeführt.
  • Wenn Sie Firefox verwenden: Schauen Sie hier.
  • Wenn Sie einen Windows-Client verwenden: Client und Server müssen sich auf verschiedenen Computern befinden, da Windows sonst NTLM anstelle von Kerberos verwendet.
  • Überprüfen Sie, ob die Uhrzeit auf allen beteiligten Maschinen synchronisiert ist.
  • Wenn Sie Microsoft AD verwenden, finden Sie hier weitere Hilfe: http://msdn.microsoft.com/en-us/library/ms995329.aspx
    • Außerdem kann das Einrichten einer richtigen Kerberos-Umgebung kompliziert sein, und es ist wichtig, dies richtig zu machen, bevor Sie mit der Kerberos-Erweiterung von Spring Security beginnen. Die meisten Probleme, auf die wir während der Beratung stoßen, sind Probleme mit der Kerberos-Umgebung und nicht mit der Anwendung selbst.

      Wenn Sie die Spring Security Kerberos-Erweiterung nicht in Ihrem eigenen Maven-Projekt verwenden möchten, müssen Sie das Spring Security-Repository zu Ihrem Pom hinzufügen.XML. Es sollte so aussehen:

und natürlich die Abhängigkeit:

Es gibt noch einiges zu tun, zum Beispiel Kerberos auch für Java-Clients und nicht nur für den Server bereitzustellen, aber wir hoffen, dass Sie dieses Meilenstein-Release ausprobieren und Feedback geben. Das Community-Forum ist der beste Ort, um Fragen zu stellen oder Diskussionen über neue Funktionen zu beginnen. Wenn Sie etwas falsch finden, können Sie alternativ ein Jira-Problem aufwerfen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.