2013-03-13 1 views
11

사용자 이름과 암호가 포함 된 웹 양식의 내용을 가져 와서 Kerberos를 사용하여 Windows 기반 도메인에 인증하는 Java 기반 웹 응용 프로그램이 있습니다.Kerberos에 대한 자세한 로깅 활성화

KDC 주소는 각 조회시 다른 IP 주소로 매핑되도록 구성되어 있으며 이는 명령 줄에서 ping 명령을 사용하여 확인할 수 있습니다.

전화가 대부분의 요청에 즉시 응답하지만 응답이 느리게 (5-10 초 또는 그 이상) 간헐적으로 발생합니다. 나는 이것이 어떤 도메인 컨트롤러가 사용 된 것일 수 있다고 생각한다.

kerberos 로깅을 설정하려고했지만 도메인 컨트롤러의 IP 주소가 표시되지 않습니다. dodgy 도메인 컨트롤러를 식별하기 위해 자세한 로깅을 어떻게 설정할 수 있습니까?

코드 추출은 파일 시스템에서 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; 
}; 

이 코드는 결과를 캐싱 자바를 방지하기 위해 시스템 프로퍼티 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을 설정하여 로깅을 사용하도록 설정할 수 있습니다.

+1

Oracle documentation를 참조하십시오'-Dsun.security.krb5.debug = TRUE '내가 복사하고이 충분한 시간을 붙여, 그래서 내가 한 라이너 만들 것이라고 생각했다. –

관련 문제