Jaspic ServerAuthModule委托给JAAS Krb5LoginModule

时间:2016-03-20 20:38:56

标签: java jboss kerberos spnego jaspic

我必须编写一个自定义的Jaspic ServerAuthModule(需要将专有的身份验证Cookie添加到HTTP响应和HTTP请求以传播到App Server上运行的应用程序)。必须使用Kerberos SPNEGO完成身份验证。

要使用的Application Server是JBOSS EAP 6.4.x

我设法使用JAAS Krb5LoginModule工作进行身份验证。

我使用的JBOSS EAP Standone.xml

  <security-domain name="host" cache-type="default">
    <authentication>
      <login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required">
          <module-option name="debug" value="true"/>
          <module-option name="principal" value="HTTP/macbookAirRCH@EXAMPLE.COM"/>
          <module-option name="storeKey" value="true"/>
          <module-option name="useKeyTab" value="true"/>
          <module-option name="doNotPrompt" value="true"/>
          <module-option name="keyTab" value="/Users/jet/Downloads/kerberos/macbookAirRCH.keytab"/>
      </login-module>
    </authentication>
  </security-domain>
  <security-domain name="SPNEGO" cache-type="default">
    <authentication>
      <login-module code="SPNEGO" flag="required">
          <module-option name="serverSecurityDomain" value="host"/>
      </login-module>
    </authentication>
    <mapping>
      <mapping-module code="SimpleRoles" type="role">
          <module-option name="user@EXAMPLE.COM" value="User,Admin"/>
      </mapping-module>
    </mapping>
  </security-domain>

的JBoss-web.xml中

 <jboss-web>
   <security-domain>SPNEGO</security-domain>
   <valve>
       <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name>
   </valve>
   <context-root>kerberosREST</context-root>
 </jboss-web>

我还设法使用以下配置获得定制的JASPI模块(extends org.jboss.as.web.security.jaspi.modules.WebServerAuthModule):

<security-domain name="testDomain" cache-type="default">
   <authentication-jaspi>
      <login-module-stack name="lm-stack">
         <login-module code="SPNEGO" flag="required">
            <module-option name="serverSecurityDomain" value="host"/>
         </login-module>
      </login-module-stack>
      <auth-module code="ch.test.jaspic.CustomServerAuthModule" flag="required" login-module-stack-ref="lm-stack"/>
    </authentication-jaspi>
       <mapping>
          <mapping-module code="SimpleRoles" type="role">
             <module-option name="user@EXAMPLE.COM" value="User,Admin"/>
             </mapping-module>
          </mapping>
 </security-domain>

的JBoss-web.xml中

<jboss-web>
   <security-domain>testDomain</security-domain>
   <valve>
       <class-name>org.jboss.as.web.security.jaspi.WebJASPIAuthenticator</class-name>
   </valve>
   <context-root>kerberosREST</context-root>
</jboss-web>

如何使用默认的JAAS Krb5LoginModule?

我应该在jboss-web.xml中包含两个阀门吗? (顺序很重要)

的JBoss-web.xml中

<jboss-web>
   <security-domain>testDomain</security-domain>
   <valve>
       <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name>
   </valve>
   <valve>
       <class-name>org.jboss.as.web.security.jaspi.WebJASPIAuthenticator</class-name>
   </valve>
   <context-root>kerberosREST</context-root>
</jboss-web>

非常感谢提前

2 个答案:

答案 0 :(得分:3)

  

要使用的Application Server是JBOSS EAP 6.4.x

不幸的是,JASPIC在这个版本的JBoss上并没有很好地实现。 JBoss EAP 7会很好,应该在今年或明年年初发布(如果一切顺利)(但没有人知道,甚至不是JBoss的人)。 EAP 7有几个beta版本,最新的版本叫做JBoss WildFly 10,稍早版本称为EAP 7 beta版本。

通常,有一个JAAS桥,您可以让JASPIC SAM调用您的JAAS登录模块。您需要了解JASPIC SAM是身份验证机制,而JAAS登录模块是身份存储。

我很确定你需要JASAS登录模块的JBoss特定配置。只需要让JBoss内部代码(例如他们的Servlet FORM认证机制的实现)找到该模块。

如果使用JASPIC,则SAM处于控制之中。

有关桥接配置文件,请参阅此文章以获取更多信息:

https://blogs.oracle.com/nasradu8/entry/loginmodule_bridge_profile_jaspic_in

答案 1 :(得分:3)

对于我的(小)理解,Valve粗略地说是一个较低级别,容器特定和容器范围的Servlet Filter对应物。因此,您尝试做的事情应该确实与您的问题中提供的管道(Valve序列)一起使用。当NegotiationAuthenticator完成实际身份验证后,WebJASPIAuthenticator - 最终由其委派的ServerAuthModule(SAM)将检查经过身份验证的调用者 {{ 1}}(或其他任何Krb5Principal JBoss包装它)与前者的请求相关联,并相应地设置cookie。

我想知道为什么你甚至愿意仅仅为了设置cookie而使用JASPIC,当你可以使用一个简单的Principal代替时(并将一些特定于JBoss的配置作为奖励)。或者您可以选择,如果您愿意放弃任何身份验证机制可移植性跟踪,请尝试扩展Filter,覆盖其NegotiationAuthenticator方法并从那里设置cookie,具体取决于委派的结果覆盖实现。

最后,有一个适当的(尽管更难)供应商中立的方法,你可以放弃authenticate(...)并重新实现其作为SAM的功能。谁知道 - 一个开源的SPNEGO SAM甚至可能存在于某个地方。对于Kerberos身份验证,根据JASPIC的 LoginModule Bridge Profile (规范的第6章)。 NegotiationAuthenticator s(LMs)当然不应该直接使用,而应该通过Krb5LoginModule来使用,而LoginModule s又需要一些LoginContext来找到正确的LM并用它初始化它。无论您是要重用JBoss的Configuration(并因此保留相应的专有XML),提供您自己的持久表示,或者只是在自定义Configuration / LoginContext中对其进行硬编码,选择。

1 理想情况下,您也可以在第二个SAM中重新实现LM,从单独的Configuration编排对两个调用的调用。这样做会将专有的身份验证相关配置减少到零,代价是增加复杂性和维护代码。