2

我有一个由 Kerberos 保护的集群,并且有一个需要代表用户与集群交互的 REST API。我已经使用带有 SPNEGO 的 Spring Security 对用户进行身份验证,但是当我尝试使用 Hadoop SDK 时,根据我的尝试,它由于各种原因而失败。

当我在用户登录后直接尝试使用 SDK 时,它给了我SIMPLE authentication is not enabled.

我注意到会话AuthenticatorUserNamePasswordAuthenticationToken没有意义的,因为我正在使用来自用户的凭据对 Kerberos 领域进行身份验证。

我正在尝试通过我自己的服务帐户和 keytab 开箱即用地使用这个项目:https ://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-samples/sec -server-spnego-form-auth

4

2 回答 2

0

首先,Spring Sec Kerberos Extension 是一段糟糕的代码。我已经评估过一次并弃权使用它。您需要对您的集群进行身份验证的客户端凭据。您在这里基本上有两个选择:

  1. 如果你在 Tomcat 上,你可以试试 Spring Security 的 JEE pre-auth wrapper 和我的Tomcat SPNEGO AD Authenticator from trunk。If 将收到来自客户端的委托凭证,这将使您能够执行您的任务,假设您的服务器帐户是受信任的委托。
  2. 如果上述方法不可行,请使用 Java 8 使用 S4U2Proxy/S4U2Self 并代表用户主体获取 Kerberos 票证,然后执行您的 REST API 调用。

只要你有GSSCredential流程是一样的。

免责声明:我不了解 Hadoop,但 GSS-API 过程始终相同。

于 2016-03-09T22:02:06.413 回答
0

值得一提的是,您可以利用 Apache Knox ( http://knox.apache.org ) 在安全集群中使用 Hadoop REST API。Knox 将为您处理与各种组件的 SPNEGO 协商。您可以使用基于 HTTP 标头的预授权 SSO 提供程序将最终用户的身份传播到 Knox。

详细信息:http: //knox.apache.org/books/knox-0-8-0/user-guide.html#Preauthenticated+SSO+Provider

但是,如果您使用该提供商,您将需要确保只有受信任的客户端才能调用您的服务。

或者,您可以使用默认 Shiro 提供程序使用用户名/密码针对 LDAP 向 Knox 进行身份验证。

以这种方式使用 Knox 的一大好处是,您的服务永远不需要知道关于集群是否经过 kerberized 的任何信息。诺克斯从你那里抽象出来。

于 2016-03-16T13:40:45.990 回答