Jboss 5.1.0 EJB安全性(通过JNDI进行未经身份验证的主体)

时间:2013-04-05 19:17:29

标签: security ejb-3.0 jndi jboss5.x jaas

如何在JBoss-5.1.0.GA应用服务器中保护未经身份验证的主体的远程EJB?在配置我的ejb安全性后,我仍然可以通过JNDI查找访问远程EJB,而无需传入主体和凭据?这是一种安全风险。基本上我想禁用远程EJB上的所有未经身份验证的JNDI查找。

这是我的 server / conf / login-config.xml 配置:

       <application-policy name="<my security domain name>">
    <authentication>
        <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">         
            <module-option name="dsJndiName">**java:jdbc/<my datasource name>**</module-option>
            <module-option name="principalsQuery"><my users query></module-option>
            <module-option name="rolesQuery"><my roles query></module-option>
            <module-option name="debug">true</module-option>
        </login-module>
    </authentication>
  </application-policy>

这是我的ejb jar中的 jboss.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC
"-//JBoss//DTD JBOSS 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss_5_0.dtd">
  <jboss>
 <security-domain><my security domain name from login-config></security-domain>
  </jboss>

以下是我如何进行JNDI查找以访问我的bean作为客户端 请注意,主体和凭据未传入上下文

    Hashtable<String, String> props = new Hashtable<String, String>();
     props.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");      
    props.put(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");      

    props.put(Context.PROVIDER_URL,"jnp://localhost:1099"); 
    //props.put(Context.SECURITY_PRINCIPAL,""); 
    //props.put(Context.SECURITY_CREDENTIALS,"");   
    ctx = new InitialContext(props);
    ctx.lookup("<earname>/<ejb interface definition>/remote">

有什么问题? 当没有/错误的主体/凭证被传递时,用户被认证为匿名主体并且通过JNDI具有对远程EJB的完全访问权

我已尝试解决此问题:

  • 我从 server / conf / login-config.xml 中的所有登录模块中删除了以下行,但它没有效果

    <module-option name="unauthenticatedIdentity">anonymous</module-option>
    
  • 我删除了来自 server / conf / jboss-service.xml 的以下行,认为它会解决问题,但它没有效果

     <attribute name="DefaultUnauthenticatedPrincipal">anonymous</attribute>
    
  • 我从login-config.xml中删除了应用程序策略“client-login”,默认情况下,因为我使用的是DatabaseLoginModule

  • server / depoly / security / security-policies-jboss-beans中的 jboss-ejb-policy jboss-web-policy 。 xml 正在login-config.xml

  • 中扩展我的DatabaseLoginModule策略
  • 我的ejb类/接口中没有与安全相关的注释

需要注意的其他事项

  • 我在Jboss-as-7.1.1.final中测试了这个场景,我得到 EjbAccessException:无效用户这是正确的(你将它添加到jboss-ejb3.xml中它会通过安全域保护所有EJB)

    <assembly-descriptor>
       <s:security>
         <ejb-name>*</ejb-name>
         <s:security-domain><security domain name here></s:security-domain>
       </s:security>
     </assembly-descriptor>
    
  • 此处的问题不是授权,但所有ejb安全注释的身份验证都没有帮助

  • 我想做的是阻止匿名校长完全拨打JNDI

  • 我在org.jboss.security上启用了TRACE登录,我可以看到,当我调用JNDI时,我会在日志中获得以下命中

    Principal: anonymous:callerRunAs=null:callerRunAs=null:ejbRestrictionEnforcement=false:ejbVersion=null];    policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@1f51a2f;
    
  • 我已经验证了我的所有配置工作,并且当我通过WebAuthetication使用程序化登录时,DatabaseLoginModule正常工作

  • 即使从数据库传递初始上下文有效的主体/凭证,也会使用匿名主体来指示主体/凭证甚至不被上下文处理

  • 我可以通过@RolesAllowed @DeclareRoles来保护我的EJB ......但就像我提到的那样,这将是一个授权问题,而不是身份验证,如果我有很多角色和EJB,那么就可维护性而言这不会很好

如何在JBoss 7.1.1中自动禁用/阻止整个应用程序的未经身份验证的匿名JNDI查找?我知道我可以升级我的应用服务器作为一个解决方案,但我没有选择这样做。这在Jboss 5.1.0中应该是可行且容易的。但我到处寻找答案,我找不到它?谢谢你的帮助。

0 个答案:

没有答案