2016-03-07 49 views
2

我有一个受Kerberos保护的群集,并且有一个REST API需要代表用户与群集进行交互。我使用Spring Security和SPNEGO来验证用户,但是当我尝试使用Hadoop SDK时,基于我尝试的各种原因,它失败了。转发SPNEGO凭证以保护群集

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

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

我想用这个项目的开箱即用我自己的服务帐户和密钥表:https://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-samples/sec-server-spnego-form-auth

+0

当使用“Hadoop SDK”时,我想你会创建一个Hadoop的'Configuration'和一个Hadoop'UserGroupInformation'。如何将配置属性以隐式的方式提供给'Configuration'(即,将''core-site.xml'等放在本地目录中,并将该目录添加到CLASSPATH中)*或显式地提供给配置属性?如果是隐式的,你是否检查文件是否被实际读取*(否则Hadoop默默恢复为硬编码的默认值,例如SIMPLE认证,并且你的程序将在随后发生意外的异常消息时崩溃并烧录)*? –

+0

如果还不是这种情况,可以按照https://steveloughran.gitbooks.io/kerberos_and_hadoop/content/sections/secrets.html中的说明提升一些调试标志,例如'-Dsun.security.krb5。debug = true'和'export HADOOP_JAAS_DEBUG = true' –

+0

我正在显式地添加配置文件,但我试图避免使用UGI,因为它全部使用静态成员,而且我需要支持线程安全操作。我可能对于在用户的主体下工作的所有东西都有一个基本的误解,但我希望它能像获得对一个'Subject“的引用并在'Subject内部运行我的HDFS列表等一样简单.doAs' – Benny

回答

0

首先,春季节Kerberos扩展是一个可怕的一段代码。我曾评估一次,并弃用它。您需要客户端向您的集群进行身份验证的凭据。你已经基本上两个选项:

  1. 如果你是在Tomcat上,你可以尝试使用Spring Security的JEE AUTH预包装跟我一起Tomcat SPNEGO AD Authenticator from trunk。如果将从客户端接收委派的凭据,这将使您能够执行您的任务,并假设您的服务器帐户受信任进行委派。
  2. 如果上述不是选项,请使用Java 8的S4U2Proxy/S4U2Self并代表用户主体获取Kerberos票证,然后执行您的REST API调用。

只要你有GSSCredential流量是相同的。

声明:我不知道Hadoop,但GSS-API过程总是相同的。

+0

*“我不知道Hadoop,但是GSS-API过程总是一样的“* - 你是一个乐观主义者......有关”Kerberos和Hadoop“的GitBook的副标题**”超越大门的疯狂“**以及HP摘录Lovecraft遍布各处*(并且匹配的ApacheCon演示文稿也有一些相关的插图)* –

+0

@SamsonScharfrichter也许这些东西没有做好。它是开源的,改进它,因为你比我更了解Hadoop。如果我会使用Hadoop,我会这样做。 –

+0

HortonWorks的工作人员正在努力......而且他们比任何人都更合格(并为此付出代价)。在此期间,我们可以哭泣,哭泣。 –

0

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

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

您需要确保只有受信任的客户端可以但是,如果将此使用提供商的呼叫服务。

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

以这种方式使用Knox的好处之一是您的服务永远不需要知道群集是否被kerberized。诺克斯从你那里抽象出来。