Как проверить билет Kerberos на сервере в Java?

мы используем JAAS для включения единого входа в приложении Java с использованием кэша билетов Windows Kerberos. Наш конфигурационный файл jaas.conf выглядит так:

LoginJaas {
  com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=true
  doNotPrompt=true
  debug=true;
};

С его помощью мы можем создать Jaas LoginContext и успешно получить билет Kerberos пользователя. Мы отправляем этот билет нашему серверному приложению с помощью JMI. Однако нам не удается проверить на сервере, что билет Kerberos действительно был создан нашей Active Directory.

На данный момент мы выполняем очень небезопасную проверку билета, просто проверяя, имеет ли имя участника-сервера (KerberosTicket.getServer ()) наше доменное имя в части области. Но, конечно, любой может создать собственный сервер Kerberos с тем же именем области и использовать этот билет для запуска приложения.

Одна из идей, которые я нашел, заключалась в аутентификации в Active Directory LDAP с использованием билета Kerberos. К сожалению, мы используем Windows 7, и повторное использование билета Kerberos для аутентификации по LDAP работает только при установке записи в реестре (см. http://java.sun.com/j2se/1.5.0/docs/руководство/безопасность/jgss/tutorials/Troubleshooting.html, ищите allowtgtsessionkey). Это неприемлемо для наших пользователей.

Есть ли способ проверить билет на нашем сервере Active Directory? Я подозреваю, что есть способ проверить, совпадает ли билет KerberosTicket.getServer () с билетом нашего сервера, но я понятия не имею, как это сделать. ОБНОВЛЕНИЕ: KerberosTicket (). GetServer () возвращает только KerberosPrincipal, который не содержит ничего, кроме имени и области билета сервера, поэтому он не подходит для проверки.

Спасибо за помощь, меммингер


person user269667    schedule 09.02.2010    source источник


Ответы (2)


Как вы упомянули, правильный способ решить эту проблему - это керберизация вашей службы, что составляет всю суть протокола Kerberos (аутентификация клиентов по серверам). Повторное использование билетов не работает точно, потому что в противном случае это было бы проблемой для безопасности. Службе Kerberos не нужно «входить в Active Directory», ей просто нужен общий ключ с AD.

Кстати, чтобы получить SSO с помощью JAAS, требуется, чтобы этот параметр allowtgtsessionkey был установлен, в Windows этого нет.

person Max Caceres    schedule 25.08.2010
comment
Помните, что имена пользователей Active Directory с латинскими символами не работают в модуле входа Kerberos в JAAS. Существенное ограничение, если только система не использует кодировку US-ASCII. - person akirekadu; 04.04.2014

Поскольку никто, кажется, действительно не знает ответа на этот вопрос, я полагаю, что нам нужно создать надлежащую службу Kerberos из нашего серверного приложения. Тот, который входит в саму Active Directory и для которого правильно установлен атрибут ServicePrincipalName. Вроде как SPNEGO для HTTP. Хорошей отправной точкой для этого будет фильтр сервлетов SPNEGO на SourceForge (http://spnego.sourceforge.net/). http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html также является очень хорошим примером того, как выполнить вход в службу. К сожалению, это приводит к той же проблеме с ключом реестра, поэтому я разместил новый вопрос на Есть ли в Java или утилите командной строки способ получить билет Kerberos для службы с использованием собственного SSPI API? .

person user269667    schedule 18.02.2010
comment
Вы когда-нибудь догадывались об этом? - person Josh C.; 13.08.2014