Выполнить сценарий на удаленном сервере из Java-приложения, проходящего проверку подлинности с помощью ключей Kerberos - PullRequest
3 голосов
/ 03 января 2011

Скорее всего, это был ответ ранее, но все мои поиски не дали мне однозначного ответа. У меня есть Java-приложение, которое в настоящее время использует ssh-ключи для запуска скрипта на удаленной машине и сохранения результатов. Я нахожусь в процессе изменения этого к аутентификации Kerberos, используя keytabs. Я настроил keytab и протестировал его, используя скрипт perl. Если бы кто-то мог указать мне на примеры, которые говорят мне, как использовать ярлыки клавиш Kerberos в приложении Java, это было бы очень полезно.

Спасибо, Киран

1 Ответ

3 голосов
/ 07 января 2011

Вот полная реализация использования keytab в Java.

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 вернет вам субъект, который можно использовать для выполнения привилегированного действия:

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