2013-03-13 7 views
11

ユーザー名とパスワードを含むWebフォームの内容を取得し、kerberosを使用してWindowsベースのドメインに認証するJavaベースのWebアプリケーションがあります。ケルベロスの詳細なログをJavaで有効にする

KDCアドレスは、ルックアップごとに異なるIPアドレスにマッピングされるように構成されており、これはコマンドラインからpingコマンドを使用して確認できます。

コールはほとんどの要求に対してただちに応答しますが、応答は断続的に低速です(5-10秒またはそれ以上)。私は、これがどのドメインコントローラが使用されているのかもしれないと思います。

kerberosログを有効にしようとしましたが、ドメインコントローラのIPアドレスは表示されません。どのようにしてより詳細なログを有効にして、不快なドメインコントローラを識別しようとしますか?

コード抽出は、ファイルシステムからkerb.confとkerb_context.confを取得します。

kerb.confは次のとおりです。

[libdefaults] 
default_realm = EXAMPLE.COM 

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

kerb_context.confは次のとおりです。

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

例ソースがある:私は有効にする方法を見つけることができませんでした

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); 
      } 
    } 

答えて

1

そのような詳細なロギングではなく、別のアプローチを採用することにしました。以下のコードは、同じディレクトリにjaas.conf設定ファイルがあれば必要な自己完結型のアプリケーションです。

この短いテストアプリケーションで使用するための例示jaas.confをが示されている:

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

このコードは結果をキャッシュするJavaを回避するために、システムプロパティsun.net.inetaddr.ttlを設定するように注意されDNSルックアップ。私の場合、DNSルックアップはリクエストごとに変わります。これはかなり粗悪なコードですが、ネットワーク内の構成や実行に問題があるKDCを実証します。

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

あなたはtrueにシステムプロパティsun.security.krb5.debugを設定することでログを有効にすることができます。

を参照してくださいOracle documentation

+1

'-Dsun.security.krb5.debug = true'に私はコピーして、この十分な回数を貼り付けるので、私は、私はそれワンライナーにするだろうと思っていました。 –

関連する問題