Обновление файла kerberors krb.conf с помощью System.property () «java.security.krb5.conf» не работает

#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 conf

4. А затем 3. динамически измените содержимое исходного файла krb5.conf и посмотрите, что произойдет

Ответ №1:

Вы должны вызвать sun.security.krb5.Config.refresh(); , чтобы перезагрузить конфигурацию из нового файла.