2011-01-03 6 views
3

これはおそらく以前の回答ですが、すべての検索で明確な答えが得られませんでした。私は現在、リモートマシン上でスクリプトを実行し結果を保存するためにsshキーを使用するJavaアプリケーションを持っています。私はkeytabを使ってこれをKerberos認証に変更しています。私はkeytabをセットアップし、perlスクリプトを使ってテストしました。誰かが私に、Javaアプリケーションでケルベロスのキータブを使う方法を教えてくれる例を教えてくれたら、それは非常に役に立ちます。Kerberosキータブを使って認証するjavaアプリケーションからリモートサーバー上でスクリプトを実行する

おかげで、

答えて

3

キランは、ここではJavaでキータブを使用しての完全な実装です。

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

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

loginAs方法は、あなたの特権アクションを実行するために使用することができます件名を返します。

関連する問題