Подтвердить что ты не робот

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

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

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

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

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

Одна из моих идей заключалась в том, чтобы проверить подлинность Active Directory LDAP с помощью билета 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() билет нашего сервера, но я не знаю, как это сделать. UPDATE: KerberosTicket(). GetServer() возвращает только KerberosPrincipal, который не содержит ничего, кроме имени билета сервера и области, поэтому он не подходит для проверки.

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

4b9b3361

Ответ 1

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

BTW, чтобы получить SSO с использованием JAAS, необходимо установить этот параметр allowtgtsessionkey, нет никакого способа обойти это в Windows.

Ответ 2

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