如何在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
我的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中应该是可行且容易的。但我到处寻找答案,我找不到它?谢谢你的帮助。