2009-06-11 2 views
5

Nous avons un domaine kerberos dans mon entreprise et je cours quelques Java/Kerberos examples. La question que j'ai est autour du mécanisme de connexion du point de vue du serveur. Lors de l'exécution de l'exemple de serveur GssServer.java, je dois obtenir un javax.security.auth.Subject; dans le code fourni ce fait par un LoginContext ainsi:Kerberos de Java - Obtenir un objet pour l'utilisateur actuellement authentifié

// Create a LoginContext with a callback handler and login 
LoginContext context = new LoginContext(name, new TextCallbackHandler()); 
context.login(); 

Subject subject = context.getSubject(); 

Tout cela est OK et quand je lance l'exemple que je vois une belle invite de connexion. Cependant, mon problème est que c'est pas vraiment comment mon serveur va fonctionner et ni comment j'ai été amené à comprendre comment je devrais présenter des services à partir d'un domaine kerberos. Dans l'exemple GssServer, le problème est mon serveur (lire: service) devrait pas besoin de s'authentifier au KDC afin de présenter son service aux clients. L'accès au fichier keytab côté serveur devrait être suffisant pour cela. Donc, pour la configuration exemple:

//jaas-krb5.conf 
server { 
    com.sun.security.auth.module.Krb5LoginModule required 
    useKeyTab=true 
    storeKey=true 
    keyTab="/home/myusr/my-server.keytab" 
    principal="myserv/mymachine.some.domain"; 
}; 

Et dans le code Java:

GSSManager manager = GSSManager.getInstance(); 
Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2"); 
GSSName gssName = manager.createName("myserv/[email protected]", 
            GSSName.NT_HOSTBASED_SERVICE); 
GSSCredential serverCreds = manager.createCredential(gssName, 
            GSSCredential.DEFAULT_LIFETIME, 
            krb5Mechanism, 
            GSSCredential.ACCEPT_ONLY); 

Le problème avec ceci est que les informations server dans le fichier jaas-krb5.conf n'est pas disponible à moins je me authentifier via le ligne:

Jaas.loginAndAction("server", action);  

Je ne devrais pas avoir à passer par cette authentification! Mais si je ne m'authentifie pas, je me retrouve avec:

Exception in thread "main" GSSException: No valid credentials provided (Mechanism level: Attempt to obtain new ACCEPT credentials failed!) 
    at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:188) 
    at sun.security.jgss.krb5.Krb5AcceptCredential.getInstance(Krb5AcceptCredential.java:73) 
    at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:77) 
    at sun.security.jgss.GSSManagerImpl.getCredentialElement(GSSManagerImpl.java:149) 
    at sun.security.jgss.GSSCredentialImpl.add(GSSCredentialImpl.java:389) 
    at sun.security.jgss.GSSCredentialImpl.<init>(GSSCredentialImpl.java:45) 
    at sun.security.jgss.GSSManagerImpl.createCredential(GSSManagerImpl.java:102) 
    at gsa.hk.GssServer$GssServerAction.run(GssServer.java:79) 
    at gsa.hk.GssServer.main(GssServer.java:57) 
Caused by: javax.security.auth.login.LoginException: No LoginModules configured for com.sun.security.jgss.accept 
    at javax.security.auth.login.LoginContext.init(LoginContext.java:256) 
    at javax.security.auth.login.LoginContext.<init>(LoginContext.java:403) 
    at sun.security.jgss.LoginUtility.login(LoginUtility.java:72) 
    at sun.security.jgss.krb5.Krb5Util.getKeysFromSubject(Krb5Util.java:205) 
    at sun.security.jgss.krb5.Krb5AcceptCredential$1.run(Krb5AcceptCredential.java:184) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:181) 
    ... 8 more 

Il n'est pas surprenant qu'il y ait un problème. Après tout, à moins que je ne m'occupe du sujet server, comment puis-je savoir où se trouve mon keytab, ou quel service je fournis?

Donc ma question est: comment puis-je dire le sur le keytab/service sans m'authentifier dans le code?

Répondre

5

OK. Donc, cela s'avère extrêmement facile en supposant que vous savez que le fichier keytab peut être utilisé à la place de l'authentification. Ceci est décrit un peu dans le JavaDoc for Krb5LoginModule

En gros, si je

loginAndAction("anything", action) 

Alors ma config devrait ressembler à:

//jaas-krb5.conf 
anything { 
    com.sun.security.auth.module.Krb5LoginModule required 
    useKeyTab=true 
    storeKey=true 
    doNotPrompt=true 
    keyTab="/home/myusr/my-server.keytab" 
    principal="myserv/mymachine.some.domain"; 
}; 

Le bit important est l'ajout de doNotPrompt=true. Lorsque cette propriété est définie, le code du serveur utilise les informations dans le keytab

Questions connexes