Как проверить билет Kerberos на сервере в Java? - PullRequest
16 голосов
/ 09 февраля 2010

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

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

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

Спасибо за вашу помощь, Memminger

Ответы [ 2 ]

5 голосов
/ 26 августа 2010

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

Кстати, чтобы получить единый вход с использованием JAAS, необходимо установить этот ключ allowtgtsession, в Windows это никак не обойти.

2 голосов
/ 18 февраля 2010

Поскольку никто, кажется, действительно не знает ответа на этот вопрос, я предполагаю, что мы должны сделать надлежащий сервис 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 для службы, использующей собственный API SSPI? 1006 *.

...