2009-06-11 14 views
5

Abbiamo un dominio Kerberos nella mia azienda e sto eseguendo alcuni dei Java/Kerberos examples. La domanda che ho è intorno al meccanismo di accesso dal punto di vista del server. Quando si esegue l'esempio del server GssServer.java, ho bisogno di ottenere un javax.security.auth.Subject; nel codice fornito questo è tramite un LoginContext così:kerberos da Java - ottenere un oggetto per l'utente attualmente autenticato

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

Subject subject = context.getSubject(); 

Questo è tutto OK e quando corro l'esempio vedo un prompt di login bella. Tuttavia il mio problema è che questo è non in realtà come verrà eseguito il mio server e né come sono stato portato a capire come dovrei presentare i servizi all'interno di un dominio Kerberos. Nell'esempio GssServer, il problema è il mio server (leggi: servizio) se non è necessario autenticarsi nello KDC per presentare il proprio servizio ai client. L'accesso al file keytab sul lato server dovrebbe essere sufficiente per farlo. Così, per l'esempio di configurazione:

//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"; 
}; 

E nel codice 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); 

Il problema di questo è che le informazioni server nel file jaas-krb5.conf non è disponibile a meno identifico me stesso attraverso il riga:

Jaas.loginAndAction("server", action);  

Non avrei dovuto passare attraverso questa autenticazione! Ma se io non autentica me stesso, io alla fine con:

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 

Non è sorprendente che ci sia un problema. Dopotutto, a meno che non abbia un handle sull'oggetto server, come faccio a sapere dove si trova il mio keytab o quale servizio fornisco?

Quindi la mia domanda è: come posso comunicare allo del keytab/servizio senza autenticarmi nel codice?

risposta

5

OK. Quindi questo risulta essere estremamente semplice partendo dal presupposto che si possa sapere che il file keytab può essere usato al posto dell'autenticazione. Questo è delineato un po 'nel JavaDoc for Krb5LoginModule

In sostanza, se mi

loginAndAction("anything", action) 

Poi il mio config dovrebbe essere simile:

//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"; 
}; 

Il bit importante è l'aggiunta di doNotPrompt=true. Quando questa proprietà è impostata, il codice server utilizza le informazioni nel keytab

Problemi correlati