2010-02-09 2 views
16

Wir verwenden JAAS, um Single Sign On in einer Java-Anwendung mit dem Windows-Kerberos-Ticket-Cache zu aktivieren. Unsere Jaas.conf Konfigurationsdatei sieht wie folgt aus:Wie validiere ich ein Kerberos-Ticket gegen einen Server in Java?

LoginJaas { 
    com.sun.security.auth.module.Krb5LoginModule required 
    useTicketCache=true 
    doNotPrompt=true 
    debug=true; 
}; 

Damit wir eine JAAS Logincontext erstellen und erfolgreich die Benutzer Kerberos-Ticket bekommen. Wir senden dieses Ticket an die Serveranwendung mit JMI. Was wir jedoch nicht schaffen, ist, auf dem Server zu überprüfen, dass das Kerberos-Ticket tatsächlich von unserem Active Directory erstellt wurde.

Momentan führen wir eine sehr unsichere Überprüfung des Tickets durch, indem wir einfach überprüfen, ob der Name des Server Principals (KerberosTicket.getServer()) unseren Domain-Namen im Realm-Teil hat. Aber natürlich könnte jeder einen eigenen Kerberos-Server mit demselben Realm-Namen einrichten und dieses Ticket zum Starten der Anwendung verwenden.

Eine Idee, die ich gefunden habe, war gegen das Active Directory LDAP mit dem Kerberos-Ticket zu authentifizieren. Leider verwenden wir Windows 7 und die erneute Verwendung des Kerberos-Tickets zur Authentifizierung gegen LDAP funktioniert nur, wenn Sie einen Registrierungseintrag festlegen (siehe http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html, suchen Sie nach allowtgtsessionkey). Dies ist für unsere Nutzer inakzeptabel.

Gibt es eine Möglichkeit, das Ticket gegen unseren Active Directory-Server zu validieren? Ich vermute, es gibt eine Möglichkeit zu überprüfen, ob das KerberosTicket.getServer() Ticket dem Ticket unseres Servers entspricht, aber ich habe keine Ahnung, wie das geht. UPDATE: KerberosTicket(). GetServer() gibt nur ein KerberosPrincipal zurück, das nur den Namen und Realm des Servertickets enthält, daher ist es nicht für die Validierung geeignet.

Danke für Ihre Hilfe, Memminger

Antwort

2

Da niemand eine Antwort auf diese wirklich zu wissen scheint, nehme ich, dass wir einen richtigen Kerberos-Dienst aus unserer Server-Anwendung zu machen. Eine, die sich bei Active Directory selbst anmeldet und bei der das Attribut ServicePrincipalName richtig eingestellt ist. So ähnlich wie SPNEGO für HTTP. Ein guter Ausgangspunkt dafür ist der SPNEGO Servlet-Filter auf SourceForge (http://spnego.sourceforge.net/). http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html ist auch ein sehr gutes Beispiel für die Dienstanmeldung. Leider führt dies zu dem gleichen Problem mit dem Registrierungsschlüssel, also habe ich eine neue Frage auf Is there a way in Java or a command-line util to obtain a Kerberos ticket for a service using the native SSPI API? gestellt.

+0

Haben Sie das jemals herausgefunden? –

5

Wie Sie bereits erwähnt haben, ist der richtige Weg, dies zu lösen, durch Kerberisierung Ihres Dienstes, was der Kernpunkt des Kerberos-Protokolls ist (Authentifizierung von Clients gegen Server). Die Wiederverwendung von Tickets funktioniert nicht genau, da dies ein Sicherheitsproblem wäre. Ein Kerberos-Dienst muss sich nicht bei Active Directory anmelden, er muss nur einen gemeinsamen Schlüssel mit AD haben.

Übrigens, um SSO mit JAAS zu bekommen, muss der allowtgtsssessionkey gesetzt sein, an Windows gibt es keinen Weg.

+1

Beachten Sie, dass Active Directory-Benutzernamen mit lateinischen Zeichen im Kerberos-Login-Modul in JAAS nicht funktionieren. Signifikante Einschränkung, außer das System ist nur US-ASCII. – akirekadu

Verwandte Themen