#java #kerberos #jaas #java.security
#java #kerberos #jaas #java.security
Вопрос:
Я хочу указать на другой файл krb.conf, dynamically, without restarting the JVM
. Я искал другое решение в Stackoverflow и попытался соответствующим образом реализовать решение. Но каким-то образом, даже если я обновлю System.property(«java.security.krb5.conf», …), чтобы указать the new krb.conf file
, JAAS не сможет понять это и все еще использует более ранний файл conf. Ниже приведены подробности моего решения с кодом:
Мой файл Jaas.conf выглядит следующим образом:
Mutual {
com.sun.security.auth.module.Krb5LoginModule required client=TRUE;
};
sp.kerb.sso.KinitExample {
com.sun.security.auth.module.Krb5LoginModule required
client=TRUE
refreshKrb5Config=true
debug=true;
};
Я установил refreshKrb5Config=true
по понятным причинам, поскольку хочу перезагрузить файл конфигурации krb.
Вот код, который я пытаюсь выполнить: package sp.kerb.sso;
import sun.security.krb5.internal.tools.Kinit;
public class KinitExample {
public static void main(String[] args) {
String kerberosFileName = "C:\Windows\krb5.ini";
String jaas_config_file_name = "C:\Users\User1\temp\howrah.jaas.conf";
System.setProperty("java.security.auth.login.config", jaas_config_file_name); // setting the jaas config file
System.setProperty("java.security.krb5.conf" , kerberosFileName); // setting the kerberos file
System.setProperty("java.security.krb5.debug" , "true");
final String administrator = "admin@exampledomain.lab".toUpperCase();
String cacheFileLoc = "C:\Users\User1\temp\admin.cache";
// Perfoming Kinit ...
Kinit.main(new String[]{"-c",cacheFileLoc, administrator , "Password123" });
kerberosFileName = "C:\Users\User2\temp\new.krb.conf"; // Using new KRB configuration file
System.setProperty("java.security.krb5.debug" , "true");
System.setProperty("java.security.auth.login.config", jaas_config_file_name); // setting the property again
System.setProperty("java.security.krb5.conf" , kerberosFileName); // setting the property again
System.out.println(System.getProperty("java.security.krb5.conf")); // Prints the updated conf file location.
cacheFileLoc = "C:\Users\User2\temp\newadmin.cache";
String newAdmin = "administrator@test.lab".toUpperCase();
Kinit.main(new String[]{"-c",cacheFileLoc, newAdmin , "Password123" });
}
}
Кэш для the admin
создан, но кэш для the newAdmin
не создан, поскольку соответствующие файлы krb.conf имеют разные области, и JAAS, похоже, не может подключиться к области из new.krb.conf и, следовательно, сбой с кодом ошибки infamour 906.
Что я делаю не так? То, чего я хочу достичь, возможно? Как мне решить проблему?
Также обратите внимание, что, если я полностью прокомментирую логику создания кэша администратора и начну с new.krb.conf (весь код, связанный с newAdmin), он отлично работает и создает кэш для newAdmin
Комментарии:
1. «файлы krb.conf имеют разные области » >> у вас есть веская причина не объединять эти файлы? Я имею в виду, что в крупных транснациональных корпорациях я видел более 10 областей Kerberos (на самом деле домены AD) , перечисленных с включенной аутентификацией между областями (неявно через «корневой» домен / область) . Иногда с определенной областью (MIT Kerberos или FreeIPA) , обслуживающей конкретный кластер Hadoop, кроме того.
2. Причиной разных файлов krb.conf является то, что наше приложение работает как средний уровень для извлечения / поиска объектов AD из доменов AD. Мы не знаем, какие домены AD обрабатывать заранее, чтобы создать единый / статический файл krb.conf
3. Две вещи, которые нужно попробовать: 1. установите некоторые флаги отладки JAAS, т.Е.
-Djava.security.debug=gssloginconfig,configfile,configparser,logincontext
Проблемы с конфигурацией игнорируются, флаги — единственный способ их обнаружения // 2. сбросьте конфигурацию JAAS, например, с другим именем файла и посмотрите, не отображается ли также Kerberos conf4. А затем 3. динамически измените содержимое исходного файла krb5.conf и посмотрите, что произойдет
Ответ №1:
Вы должны вызвать sun.security.krb5.Config.refresh();
, чтобы перезагрузить конфигурацию из нового файла.