2011-01-03 4 views
3

Dies wurde am ehesten früher beantwortet, aber alle meine Suchabfragen haben mir keine endgültige Antwort. Was ich habe, ist eine Java-Anwendung, die derzeit ssh-Schlüssel verwendet, um ein Skript auf einem Remote-Rechner auszuführen und die Ergebnisse zu speichern. Ich bin dabei, dies in eine Kerberos-Authentifizierung mit Keytabs zu ändern. Ich habe das Keytab eingerichtet und getestet mit einem Perl-Skript. Wenn mich jemand auf Beispiele verweisen könnte, die mir sagen, wie man Kerberos-Keytabs in einer Java-Anwendung verwendet, wäre das sehr hilfreich.Führen Sie ein Skript auf dem Remote-Server von einer Java-Anwendung authentifizieren über Kerberos Keytabs

Danke, Kiran

Antwort

3

Hier ist eine vollständige Implementierung eines keytab in Java verwenden.

import javax.security.auth.Subject; 
import javax.security.auth.kerberos.KerberosPrincipal; 
import javax.security.auth.login.AppConfigurationEntry; 
import javax.security.auth.login.Configuration; 
import javax.security.auth.login.LoginContext; 
import javax.security.auth.login.LoginException; 
import java.security.Principal; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.Set; 

public class SecurityUtils { 
    public static class LoginConfig extends Configuration { 
     private String keyTabLocation; 
     private String servicePrincipalName; 
     private boolean debug; 

     public LoginConfig(String keyTabLocation, String servicePrincipalName, boolean debug) { 
      this.keyTabLocation = keyTabLocation; 
      this.servicePrincipalName = servicePrincipalName; 
      this.debug = debug; 
     } 

     @Override 
     public AppConfigurationEntry[] getAppConfigurationEntry(String name) { 
      HashMap<String, String> options = new HashMap<String, String>(); 
      options.put("useKeyTab", "true"); 
      options.put("keyTab", this.keyTabLocation); 
      options.put("principal", this.servicePrincipalName); 
      options.put("storeKey", "true"); 
      options.put("doNotPrompt", "true"); 
      if (this.debug) { 
       options.put("debug", "true"); 
      } 
      options.put("isInitiator", "false"); 

      return new AppConfigurationEntry[]{new AppConfigurationEntry("com.sun.security.auth.module.Krb5LoginModule", 
        AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options),}; 
     } 
    } 

    public static Subject loginAs(String keyTabLocation, String servicePrincipal) { 
     try { 
      LoginConfig loginConfig = new LoginConfig(keyTabLocation, servicePrincipal, true); 
      Set<Principal> princ = new HashSet<Principal>(1); 
      princ.add(new KerberosPrincipal(servicePrincipal)); 
      Subject sub = new Subject(false, princ, new HashSet<Object>(), new HashSet<Object>()); 
      LoginContext lc; 
      lc = new LoginContext("", sub, null, loginConfig); 
      lc.login(); 
      return lc.getSubject(); 
     } catch (LoginException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

Die loginAs Methode kehren Sie ein Thema, das verwendet werden kann, eine privilegierte Aktion auszuführen:

result = Subject.doAs(subject, 
     new PrivilegedExceptionAction<NamingEnumeration<SearchResult>>() { 
      public NamingEnumeration<SearchResult> run() throws NamingException { 
       return context.search(directoryBase, filterBuilder.toString(), searchCtls); 
      } 
     });