Spring Security Kerberos SSO для REST API (Tomcat) - PullRequest
0 голосов
/ 01 июня 2018

Вот моя проблема:

Контекст : -Windows Server 2012 с ActiveDirectory -Tomcat -Rest API (Spring)

В настоящее время я пытаюсь ограничить RESTзапрос.Я хочу, чтобы только определенные группы AD могли получить доступ к конкретным ресурсам.Я ограничен проверкой подлинности Kerberos.

Конфигурация системы

  1. Создание пользователя в домене "Tomcat"
  2. setspn -a HTTP/apirest.domain@DOMAIN
  3. Сгенерируйте tomcat.keytab с помощью ktpass

Конфигурация отдыха API

Я использую пример безопасности пружины на github, который вы можете найти здесь:

https://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-samples/sec-server-win-auth

Я знаю, что существует EntryPoint, и это не нужно в моем контексте (API Rest).Я выбрал этот пример, потому что он использует контекст аутентификации Windows и использует его для автоматической аутентификации в контексте безопасности Spring.Сразу после этого отправляется запрос ldap для извлечения всей информации о зарегистрированном пользователе.В моем случае мне нужно извлечь группу.

Я также использую:

https://github.com/GyllingSW/kerberos-demo

Для извлечения роли пользователя с классом «RoleStrippingLdapUserDetailsMapper.java» вместо «ActiveDirectoryLdapAuthoritiesPopulator».Эта реализация также предлагает аутентификацию на локальном хосте, но проблема с токеном NTLM, похоже, исправлена ​​в последнем коммите весенней безопасности.

Я не совсем уверен, что это правильный способ сделать то, что я хочу.

Кажется, что моя аутентификация не удалась, и у меня только одна вещь работает неправильно в моих журналах ..

«Свойство userDn не установлено - анонимный контекст будет использоваться для операций чтения-записи»

Вопросы

  1. Нужно ли запускатьмой сервис Tomcat с использованием учетной записи Tomcat?(Кажется, да)
  2. Правильно ли я поступаю с безопасностью Kerberos?
  3. Как избавиться от анонимного контекста?
  4. Кажется, анонимный контекстбыть установлен сразу после запуска Tomcat.Я хочу получить контекст сразу после этого, мой пользователь (например, user1) запрашивает API остальных (EntryPoint или любой другой)

Если что-то неясно, дайте мне знать, я постараюсь переформулировать!

Спасибо,

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Я нашел способ исправить мою проблему.

В контексте REST API у вас нет точки входа.Я пытался установить свою точку входа на несопоставленный URL, просто чтобы провести переговоры.Сделав это, вы получите ответ HTTP с кодом ошибки 404 (не найден), но с правым заголовком, добавленным Spring Security (WWW-Authenticate).

Веб-браузер не будет отправлять службу заявокесли код ошибки не 401.

Чтобы решить эту проблему, необходимо создать класс CustomEntryPoint ( реализует AuthenticationEntryPoint ) и вам необходимо переопределитьметод "начать" для возврата HTTP-кода 401 с правильным заголовком.

Надеюсь, это могло бы помочь.Если есть лучший способ, дайте мне знать!

0 голосов
/ 02 июня 2018

Вам не нужно запрашивать LDAP, чтобы получить информацию о том, к каким группам принадлежит пользователь.Active Directory уже добавляет эту информацию в тикет Kerberos, который отправляется из браузера в Tomcat.

Вам просто нужно извлечь эту информацию из токена, например, используя библиотеку Kerb4J .Он поставляется с интеграцией Spring, вдохновленной проектом spring-security-kerberos , поэтому переключиться на него будет довольно легко.

Если вы все еще хотите запрашивать LDAP, вам нужно пройти аутентификацию в LDAP, прежде чем вы сможете выполнить какие-либо запросы.Опять же, для этого не нужно использовать учетные записи конечных пользователей - вы можете использовать файл keytab для аутентификации Kerberos в LDAP и групп запросов с использованием учетной записи «Tomcat»

...