1

Это пример приложения Kerberos, найденный по адресу https://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-samples/sec-server-win-auth, соответствующий http://docs.spring.io/spring-security-kerberos/docs/1.0.1.RELEASE/reference/htmlsingle/#samples-sec-server-win-auth.Spring Security Kerberos, Kerberos + AD - Ошибка: доступ запрещен, нет ключа для хранения

Все, что я делаю, это изменение src/main/resources/application.yml, чтобы соответствовать моей системе и идти туда и обратно между созданием SPN и Keytab-файлов. Мое приложение весны, кажется, начинает хорошо. Ниже приведена конфигурация Kerberos, которая выводится через консольный вывод.

Debug is true storeKey true useTicketCache false useKeyTab true doNotPrompt true ticketCache is null isInitiator false KeyTab is /etc/client-server.keytab refreshKrb5Config is false principal is HTTP/[email protected] tryFirstPass is false useFirstPass is false storePass is false clearPass is false
principal is HTTP/[email protected]
Will use keytab
Commit Succeeded

Таким образом, я вижу, что клиентское приложение уже приняло мои настройки. Затем я пытаюсь получить доступ к клиент-серверу: 8080/привет через хром на другой машине. Первая ошибка, которую я получаю, - это отказ от Acces (пользователь анонимный). Предполагается, что он перенаправляется на точку входа аутентификации. Тогда я получаю следующее, заканчивая «Нет ключа для хранения»

[nio-8080-exec-4] w.a.SpnegoAuthenticationProcessingFilter : Received Negotiate Header for request client-server:8080/favicon.ico: Negotiate YIIHZAYGKwYBBQUCoIIHWDCCB1SgMDAuBgk……./9AdsoFH2ya7C
[nio-8080-exec-4] o.s.s.authentication.ProviderManager : Authentication attempt using org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider
[nio-8080-exec-4] .a.KerberosServiceAuthenticationProvider : Try to validate Kerberos Token
[nio-8080-exec-4] .a.KerberosServiceAuthenticationProvider : Succesfully validated [email protected]
[nio-8080-exec-4] o.s.s.l.s.FilterBasedLdapUserSearch : Searching for user '[email protected]', with user search [ searchFilter: '', searchBase: 'DC=xxxxx', scope: subtree, searchTimeLimit: 0, derefLinkFlag: false ]
Debug is true storeKey true useTicketCache true useKeyTab true doNotPrompt true ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is HTTP/[email protected] tryFirstPass is false useFirstPass is false storePass is false clearPass is false
Acquire TGT from Cache
Principal is HTTP/[email protected]
2015-11-27 11:38:47.906 DEBUG 3183 --- [nio-8080-exec-4] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession. 2015-11-27 11:38:47.906 DEBUG 3183 --- [nio-8080-exec-4] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed 2015-11-27 11:38:47.912 ERROR 3183 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception org.springframework.ldap.AuthenticationException: No key to store; nested exception is javax.naming.AuthenticationException: No key to store [Root exception is javax.security.auth.login.LoginException: No key to store]

Теперь, похоже, что приложение может проверить мой пользователь, но я понятия не имею, если он может найти свою информацию о пользователе. Просмотр источника для Krb5LoginModule.java по адресу cr.openjdk.java.net/~weijun/7201053/webrev.00/raw_files/new/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java, вы можете найти исключение для входа, без ключа для хранения, путем простого поиска. В коде говорится, что мой ktab (keytab, который я предполагаю), имеет значение null. Как ни странно, вывод на консоль говорит, что когда я пытаюсь перемещаться с помощью браузера, keytab имеет значение null, хотя это не было, когда я запускал приложение.

Кто-нибудь знает, почему мой keytab имеет значение null, когда пользователь пытается получить доступ к моему приложению? Или что-то не так с моей конфигурацией приложения или системы?

ответ

0

Так что я спал на этом на выходные. Как ни странно, похоже, что решение теперь работает с тех пор, как TGT, приобретенный в кеше, прошел время обновления. Я действительно не знаю, как все это работает, но теперь keytab принимается, когда мой пользователь переходит к приложению.
Единственная проблема: Ldap не смог найти мои данные пользователя из-за несоответствия между именем пользователя Kerberos, используемым для запроса LDAP, поэтому мне пришлось повторно реализовать org.springframework.security.ldap.search.FilterBasedLdapUserSearch, чтобы изменить имя пользователя. Тогда решение сработало.

0

У меня возникла аналогичная проблема, и основная причина была на самом деле коррумпированным ключом, созданным kinit. Решение заключалось в удалении кеша (как в/tmp/kbr5cc_ [UID], так и в значении, установленном ticketCache = "/ home/solr/cache" в конфигурационном файле JAAS, и НЕ запускать kinit перед запуском приложения.

чтобы найти то, что происходит, я добавил следующий флаг в JVM: -Dsun.security.krb5.debug = истина

я увидел, что ключ имел начала и окончания времени, установленного на дату эпохи :

>>>DEBUG <CCacheInputStream> key type: 0 
>>>DEBUG <CCacheInputStream> auth time: Thu Jan 01 00:00:00 UTC 1970 
>>>DEBUG <CCacheInputStream> start time: null 
>>>DEBUG <CCacheInputStream> end time: Thu Jan 01 00:00:00 UTC 1970 
>>>DEBUG <CCacheInputStream> renew_till time: null 

 Смежные вопросы

  • Нет связанных вопросов^_^