2013-03-13 8 views
11

Ho un'applicazione Web basata su Java che prende il contenuto di un modulo Web contenente un nome utente e una password e autentica l'utilizzo di Kerberos in un dominio basato su Windows.Abilita la registrazione dettagliata per kerberos in java

L'indirizzo KDC è apparentemente configurato per associare a indirizzi IP diversi ad ogni ricerca e questo può essere confermato utilizzando il comando ping dalla riga di comando.

La chiamata risponde immediatamente alla maggior parte delle richieste ma la risposta è lenta (5-10 secondi o anche più lunga) a intermittenza. Penso che questo potrebbe essere dovuto a quale controller di dominio viene utilizzato.

Ho provato ad attivare la registrazione Kerberos ma l'indirizzo IP del controller di dominio non è mostrato. Come posso attivare una registrazione più dettagliata per provare a identificare i controller di dominio dodgy, per favore?

Il codice estrae il file kerb.conf e kerb_context.conf dal file system.

Il kerb.conf è:

[libdefaults] 
default_realm = EXAMPLE.COM 

[realms] 
CYMRU.NHS.UK = { 
     kdc = example.com:88 
     admin_server = example.com 
     kpasswd_server = example.com 
} 

Il kerb_context.conf è:

primaryLoginContext { 
     com.sun.security.auth.module.Krb5LoginModule required 
     useTicketCache=false 
     refreshKrb5Config=true 
     debug=true; 
}; 

La fonte esempio è:

static NadexUser executePerformLogin(String username, String password) throws LoginException { 
      char[] passwd = password.toCharArray(); 
      String kerbConf = ERXFileUtilities.pathForResourceNamed("nadex/kerb.conf", "RSCorp", null); 
      String kerbContextConf = ERXFileUtilities.pathURLForResourceNamed("nadex/kerb_context.conf", "RSCorp", null).toExternalForm(); 
      System.setProperty("java.security.krb5.conf", kerbConf); 
      System.setProperty("java.security.auth.login.config", kerbContextConf); 
      try { 
        LoginContext lc = new LoginContext("primaryLoginContext", new UserNamePasswordCallbackHandler(username, password)); 
        lc.login(); 
        return new _NadexUser(lc.getSubject()); 
      } 
      catch (javax.security.auth.login.LoginException le) { 
        throw new LoginException("Failed to login : " + le.getLocalizedMessage(), le); 
      } 
    } 

risposta

1

non ho trovato un modo per trasformare su tale registrazione dettagliata, ma invece ha deciso di adottare un approccio diverso. Il codice seguente è un'applicazione autonoma che richiede semplicemente un file di configurazione jaas.conf nella stessa directory.

Un esempio Jaas.conf per l'uso con questa applicazione breve test è mostrato:

primaryLoginContext { 
     com.sun.security.auth.module.Krb5LoginModule required 
     useTicketCache=false 
     refreshKrb5Config=true 
     debug=false; 
}; 

Questo codice è attento impostare la struttura sun.net.inetaddr.ttl sistema per evitare java caching dei risultati della Ricerca DNS. Per il mio caso, la ricerca DNS cambia ad ogni richiesta. È una parte di codice piuttosto approssimativa, ma mostrerà tutti i KDC configurati male o in esecuzione all'interno della rete.

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.math.BigDecimal; 
import java.math.RoundingMode; 
import java.net.InetAddress; 
import java.net.MalformedURLException; 
import java.net.UnknownHostException; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.Set; 
import java.util.Vector; 

import javax.security.auth.callback.Callback; 
import javax.security.auth.callback.CallbackHandler; 
import javax.security.auth.callback.NameCallback; 
import javax.security.auth.callback.PasswordCallback; 
import javax.security.auth.callback.UnsupportedCallbackException; 
import javax.security.auth.login.LoginContext; 

public class TestNadex { 
    private static final String DEFAULT_HOST = "cymru.nhs.uk"; 

    public static void main(String[] args) { 
     System.setProperty("sun.net.inetaddr.ttl", "0"); 
     String username=null; 
     String password=null; 
     try { 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      System.out.println("Enter username: "); 
      username = br.readLine().trim(); 
      System.out.println("Enter password: "); 
      password = br.readLine().trim(); 
      testHost(DEFAULT_HOST, username, password); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
    } 

    static void testHost(String host, String username, String password) { 
     HashMap<String, Vector<Long>> results = new HashMap<String, Vector<Long>>(); 
     for (int i=0; i<200; i++) { 
      InetAddress ia; 
      try { 
       ia = InetAddress.getByName(host); 
       long startTime = System.currentTimeMillis(); 
       executePerformLogin(ia.getHostAddress(), username, password); 
       long endTime = System.currentTimeMillis(); 
       long duration = endTime - startTime; 
       if (results.containsKey(ia.toString()) == false) { 
        Vector<Long> v = new Vector<Long>(); 
        v.add(duration); 
        results.put(ia.toString(), v); 
       } 
       else { 
        Vector<Long> v = results.get(ia.toString()); 
        v.add(duration); 
       } 
       Thread.sleep(1000); 
      } catch (UnknownHostException e) { 
       System.out.println("Unknown host: " + host); 
       System.exit(1); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     Set<String> keys = results.keySet(); 
     for (String key : keys) { 
      System.out.println("For address: " + key); 
      Vector<Long> times = results.get(key); 
      int count = times.size(); 
      long total = 0; 
      for (Long t : times) { 
       System.out.println(t + " milliseconds"); 
       total += t; 
      } 
      System.out.println("Mean duration: " + new BigDecimal(total).divide(new BigDecimal(count), RoundingMode.HALF_UP)); 
     } 
    } 

    static void executePerformLogin(String hostname, String username, String password) throws MalformedURLException { 
     System.setProperty("java.security.krb5.realm", "CYMRU.NHS.UK"); 
     System.setProperty("java.security.krb5.kdc", hostname); 
     File jaas = new File("jaas.conf"); 
     String jaasconf = jaas.toURI().toURL().toExternalForm(); 
     System.setProperty("java.security.auth.login.config", jaasconf); 
     //  System.setProperty("java.security.krb5.realm", "cymru.nhs.uk"); 
     //  System.setProperty("java.security.krb5.kdc", "cymru.nhs.uk"); 
     try { 
      System.out.println("Performing NADEX login for username: " + username + " at " + new Date() + " to server " + hostname); 
      LoginContext lc = new LoginContext("primaryLoginContext", new UserNamePasswordCallbackHandler(username, password)); 
      lc.login(); 
      System.out.println("Successful login for " + lc.getSubject().toString() + " at " + new Date()); 
     } 
     catch (javax.security.auth.login.LoginException le) { 
      System.err.println("Failed to login: " + le); 
     } 
    } 

    public static class UserNamePasswordCallbackHandler implements CallbackHandler { 
     private final String _userName; 
     private final String _password; 

     public UserNamePasswordCallbackHandler(String userName, String password) { 
      _userName = userName; 
      _password = password; 
     } 

     public void handle(Callback[] callbacks) throws IOException, 
     UnsupportedCallbackException { 
      for (Callback callback : callbacks) { 
       if (callback instanceof NameCallback && _userName != null) { 
        ((NameCallback) callback).setName(_userName); 
       } 
       else if (callback instanceof PasswordCallback && _password != null) { 
        ((PasswordCallback) callback).setPassword(_password.toCharArray()); 
       } 
      } 
     } 
    } 
} 
15

È possibile attivare la registrazione impostando proprietà di sistema sun.security.krb5.debug a true.

Vedi Oracle documentation

+1

'-Dsun.security.krb5.debug = true' I copiare e incollare questo numero sufficiente di volte, così ho pensato di fare un one-liner. –