【问题标题】:Spring Security Kerberos SSO for a REST API (Tomcat)用于 REST API (Tomcat) 的 Spring Security Kerberos SSO
【发布时间】:2018-11-11 22:36:47
【问题描述】:

这是我的问题:

上下文: - 带有 ActiveDirectory 的 Windows Server 2012 -雄猫 -Rest API (Spring)

我目前正在尝试限制 REST 请求。我希望只有特定的 AD 组才能访问特定资源。我仅限于 Kerberos 身份验证。

系统配置

  1. 在域“Tomcat”中创建用户
  2. setspn -a HTTP/apirest.domain@DOMAIN
  3. 使用 ktpass 生成 tomcat.keytab

API 休息配置

我正在使用 github 上的 spring 安全示例,您可以在此处找到:

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

我知道有一个入口点,这在我的上下文中不需要(API 休息)。我选择了这个示例,因为它似乎使用了 windows 身份验证上下文并使用它在 spring 安全上下文中自动对我进行身份验证。紧接着,发送一个 ldap 请求以提取有关登录用户的所有信息。就我而言,我需要提取组。

我也在用:

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

使用类“RoleStrippingLdapUserDetailsMapper.java”而不是“ActiveDirectoryLdapAuthoritiesPopulator”来提取用户的角色。此实现还提供 localhost 身份验证,但 NTLM 令牌的问题似乎在 spring security 的最后一次提交中得到修复。

我不确定这是否是做我想做的事情的正确方法。

我的身份验证似乎失败了,我的日志中只有一件事出错了..

“未设置属性 'userDn' - 匿名上下文将用于读写操作”

问题

  1. 我必须使用 tomcat 帐户运行 tomcat 服务吗? (似乎是,是的)
  2. 我是否在使用 Kerberos 安全性做正确的事情?
  3. 如何摆脱匿名上下文?
  4. 匿名上下文似乎是在 Tomcat 启动后设置的。我想在我的用户(例如 user1)请求其余 API(EntryPoint 或其他)之后获取上下文

如果有不清楚的地方告诉我,我会尝试重新制定!

谢谢,

【问题讨论】:

  • 请避免同时提出多个不同的问题。请参阅How to Ask 页面以获得澄清此问题的帮助。
  • 谢谢,下次会注意的

标签: spring rest tomcat kerberos spring-security-kerberos


【解决方案1】:

您无需查询 LDAP 即可获取有关用户所属组的信息。 Active Directory 已经将此信息添加到从浏览器发送到 Tomcat 的 Kerberos 票证中。

您只需要从令牌中提取此信息,例如使用Kerb4J 库。它带有受spring-security-kerberos 项目启发的 Spring 集成,因此切换到它应该很容易。

如果您仍想查询 LDAP,您需要先在 LDAP 中进行身份验证,然后才能进行任何查询。同样,无需使用最终用户帐户 - 您可以使用 Kerberos authentication in LDAP 的 keytab 文件并使用“Tomcat”帐户查询组

【讨论】:

  • 感谢您的回答,我将尝试使用 LDAP 查询的解决方案,以避免再导入一个依赖项。奇怪的是,我们无法使用 spring-security(使用本机库)从用户令牌中提取组。
  • @csik 基于对 github 的提交,spring-security-kerberos 的积极开发在 3 年前停止,因此它没有很多 Kerberos 功能。使用您的 tomcat kerberos 帐户查询 LDAP 应该可以工作
  • @bedrin - 你有使用 Kerb4j 和 Spring Security 的示例代码吗?
  • @user8297969 这是 Spring Security 配置的示例:github.com/bedrin/kerb4j/blob/0.1.2/kerb4j-server/… - 如果要从 Kerberos 令牌访问组信息,则需要使用 ExtractGroupsUserDetailsS​​ervice:github.com/bedrin/kerb4j/blob/0.1.2/kerb4j-server/…
  • @bedrin - 谢谢。这很有帮助。我注意到我的 SPN 名称出现错误,即 HTTP/myserver.mydomain.local@MYDOMAIN.LOCAL:.AuthenticationServiceException: Invalid name provided (Mechanism level: Illegal character in realm name; one of: '/', ':', '^@' (600))。我没有收到旧的 Spring Security Kerberos 项目的错误。我需要更改我的 SPN 名称吗?
【解决方案2】:

我找到了解决问题的方法。

在 REST API 上下文中,您没有入口点。我试图将我的入口点设置为一个未映射的 URL,只是为了进行协商。通过这样做,您将收到带有错误代码 404(未找到)的 HTTP 响应,但 Spring Security(WWW-Authenticate)添加了正确的标头。

如果错误码不是401,网页浏览器将不会发送票务服务。

要解决这个问题,你必须创建一个CustomEntryPoint类(实现AuthenticationEntryPoint)并且你需要重写“commence”方法返回带有正确标头的 401 HTTP 代码。

我希望这会有所帮助。如果有更好的方法,请告诉我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2013-08-29
    • 2021-11-07
    • 2021-01-16
    • 2013-11-20
    • 2021-12-09
    • 2016-07-08
    相关资源
    最近更新 更多