17 Stimmen

Wie validiert man ein Kerberos-Ticket gegen einen Server in Java?

Wir verwenden JAAS, um Single Sign On in einer Java-Anwendung unter Verwendung des Windows Kerberos-Ticket-Cache zu ermöglichen. Unsere Konfigurationsdatei jaas.conf sieht wie folgt aus:

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

Damit können wir einen Jaas LoginContext erstellen und erfolgreich das Kerberos-Ticket des Benutzers erhalten. Dieses Ticket senden wir mit JMI an unsere Serveranwendung. Was wir allerdings nicht schaffen, ist, auf dem Server zu überprüfen, ob das Kerberos-Ticket tatsächlich von unserem Active Directory erstellt wurde.

Im Moment führen wir eine sehr unsichere Validierung des Tickets durch, indem wir einfach prüfen, ob der Name des Server Principal (KerberosTicket.getServer()) unseren Domänennamen im Realm-Teil enthält. 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 die Authentifizierung gegen das Active Directory LDAP unter Verwendung des Kerberos-Tickets. Leider verwenden wir Windows 7 und die Wiederverwendung des Kerberos-Tickets zur Authentifizierung gegenüber dem LDAP funktioniert nur, wenn ein Registrierungseintrag gesetzt wird (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 Benutzer inakzeptabel.

Gibt es eine Möglichkeit, das Ticket mit unserem Active Directory-Server abzugleichen? Ich vermute, dass es eine Möglichkeit gibt, zu überprüfen, ob das KerberosTicket.getServer() Ticket mit dem Ticket unseres Servers übereinstimmt, aber ich habe keine Ahnung, wie man das macht. UPDATE: KerberosTicket().getServer() gibt nur ein KerberosPrincipal zurück, das nichts anderes als den Namen des Servertickets und den Realm enthält und sich daher nicht zur Überprüfung eignet.

Vielen Dank für Ihre Hilfe, memminger

5voto

Max Caceres Punkte 1976

Wie Sie bereits erwähnt haben, ist der richtige Weg zur Lösung dieses Problems die Kerberisierung Ihres Dienstes, was der eigentliche Sinn des Kerberos-Protokolls ist (Authentifizierung von Clients gegenüber Servern). Die Wiederverwendung von Tickets funktioniert nicht, da dies ein Sicherheitsproblem darstellen würde. Ein Kerberos-Dienst muss sich nicht bei Active Directory anmelden, er muss lediglich einen gemeinsamen Schlüssel mit AD haben.

BTW, um SSO mit JAAS zu erhalten, muss der allowtgtsessionkey gesetzt sein, das lässt sich unter Windows nicht umgehen.

2voto

user269667 Punkte 431

Da niemand wirklich eine Antwort auf diese Frage zu wissen scheint, müssen wir wohl einen eigenen Kerberos-Dienst aus unserer Serveranwendung machen. Einen, der sich beim Active Directory selbst anmeldet und bei dem das Attribut ServicePrincipalName richtig gesetzt ist. Ähnlich wie SPNEGO es für HTTP tut. 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 eine Serviceanmeldung. Leider führt dies zu demselben Problem mit dem Registrierungsschlüssel, daher habe ich eine neue Frage auf Gibt es eine Möglichkeit, in Java oder mit einem Befehlszeilenprogramm ein Kerberos-Ticket für einen Dienst über die native SSPI-API zu erhalten? .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X