2010-02-09 8 views
16

Nous utilisons JAAS pour activer l'authentification unique dans une application Java à l'aide du cache de tickets Windows Kerberos. Notre fichier de configuration Jaas.conf ressemble à ceci:Comment valider un ticket Kerberos sur un serveur Java?

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

Avec cela, nous pouvons créer un Jaas LoginContext et obtenir avec succès le ticket Kerberos de l'utilisateur. Nous envoyons ce ticket à l'application serveur en utilisant JMI. Ce que nous ne parvenons pas à faire est de vérifier sur le serveur que le ticket Kerberos a bien été créé par notre Active Directory.

Pour l'instant, nous effectuons une validation très peu sûre du ticket en vérifiant simplement si le nom du serveur principal (KerberosTicket.getServer()) a notre nom de domaine dans la partie domaine. Mais bien sûr, n'importe qui peut configurer son propre serveur Kerberos avec le même nom de domaine et utiliser ce ticket pour démarrer l'application.

Une idée que j'ai trouvé était d'authentifier contre le LDAP Active Directory en utilisant le ticket Kerberos. Malheureusement, nous utilisons Windows 7 et réutiliser le ticket Kerberos pour nous authentifier par rapport au protocole LDAP ne fonctionne que lors de la définition d'une entrée de registre (voir http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html, recherchez allowtgtsessionkey). Ceci est inacceptable pour nos utilisateurs.

Existe-t-il un moyen de valider le ticket sur notre serveur Active Directory? Je soupçonne qu'il existe un moyen de vérifier si le ticket KerberosTicket.getServer() est égal au ticket de notre serveur, mais je n'ai aucune idée de comment faire cela. UPDATE: KerberosTicket(). GetServer() renvoie uniquement un KerberosPrincipal qui ne contient rien d'autre que le nom et le domaine du ticket de serveur. Il ne convient donc pas à la validation.

Merci pour votre aide, MEMMINGER

Répondre

2

Comme personne ne semble savoir vraiment une réponse à cela, je suppose que nous devons faire un service Kerberos approprié de notre application serveur. Un qui se connecte à Active Directory lui-même et qui a l'attribut ServicePrincipalName défini correctement. Un peu comme SPNEGO fait pour HTTP. Un bon point de départ pour ce faire sera le filtre de servlet SPNEGO sur SourceForge (http://spnego.sourceforge.net/). http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html est également un très bon exemple de procédure d'ouverture de session du service. Malheureusement, cela conduit au même problème avec la clé de registre, j'ai donc posté une nouvelle question sur Is there a way in Java or a command-line util to obtain a Kerberos ticket for a service using the native SSPI API?.

+0

Avez-vous déjà découvert cela? –

5

Comme vous l'avez mentionné, la bonne façon de résoudre ce problème consiste à kerbériser votre service, ce qui correspond à tout le point du protocole Kerberos (authentification des clients contre des serveurs). La réutilisation de ticket ne fonctionne pas exactement parce que ce serait un problème de sécurité si c'était le cas. Un service Kerberos n'a pas besoin de se connecter à Active Directory, il doit juste posséder une clé partagée avec AD. BTW, pour obtenir SSO utilisant JAAS nécessite que settgtsessionkey soit défini, il n'y a aucun moyen de contourner cela sous Windows.

+1

Prenez garde que les noms d'utilisateur Active Directory avec caractères latins ne fonctionnent pas dans le module de connexion Kerberos de JAAS. Limitation significative sauf si le système est uniquement US-ASCII. – akirekadu

Questions connexes