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

мы используем JAAS для включения Единой точки входа в JAVA-приложении с помощью кэша Windows Kerberos ticket. Наш 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/guide/security/jgss/tutorials/Troubleshooting.html, ищите allowtgtsessionkey). Это недопустимо для наших пользователей.

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

Спасибо за Вашу справку, memminger

16
задан Artefacto 26 April 2011 в 11:48
поделиться

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

2
ответ дан 30 November 2019 в 23:24
поделиться

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

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

5
ответ дан 30 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: