使用org.apache.camel.jmx.createRmiConnector进行Camel + JMX + LDAP身份验证

时间:2013-01-08 12:54:41

标签: apache-camel jmx jaas

所有

一直试图通过JAAS身份验证获得远程JMX,以便在Camel版本2.10.3 + Java 6中使用。

该应用程序使用Java DSL并且是“手动连接”,并使用系统属性运行:

-Dcom.sun.management.jmxremote.authenticate=true 
-Djmx.remote.x.login.config=StagingJmxAuthConfig 
-Dorg.apache.camel.jmx.usePlatformMBeanServer=true 
-Djava.security.auth.login.config=./src/main/resources/conf/ldap-auth.config 
-Dcom.sun.management.jmxremote.ssl=false
-Dorg.apache.camel.jmx.createRmiConnector=true
-Dorg.apache.camel.jmx.rmiConnector.registryPort=9140

但是,出于所有意图和目的,我似乎也可以在关闭身份验证/授权的情况下运行。

调试JRE的JMX和JAAS类(以及Camel),请注意以下事项:

在班级org.apache.camel.management.DefaultManagementAgent中:

cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);

这反过来会创建一个javax.management.remote.rmi.RMIJRMPServerImpl的实例,其中包含env构造函数参数的空Map。

现在,我想知道是否有什么东西只是逃避我 - 当一个请求稍后进入连接器,而javax.management.remote.rmi.RMIServerImpl执行doNewClient()时,它不可能触发任何JAAS活动?

RMIServerImpl的第197-208行 - 记住Camel将“env”设置为null,将其转换为空地图:

JMXAuthenticator authenticator =
    (JMXAuthenticator) env.get(JMXConnectorServer.AUTHENTICATOR);
if (authenticator == null) {
    /*
     * Create the JAAS-based authenticator only if authentication
     * has been enabled
     */
    if (env.get("jmx.remote.x.password.file") != null ||
    env.get("jmx.remote.x.login.config") != null) {
    authenticator = new JMXPluggableAuthenticator(env);
    }
}

我是否正确认为要获得远程服务,JAAS认证JMX工作必须手动编写JMX RMI连接器设置代码?

Camel是否应该提供一个让JAAS工作的环境?甚至似乎都没有触及JAAS配置文件...

更新:已解决

在VM上设置以下系统属性可以解决问题:

-Dcom.sun.management.jmxremote=true 
-Dcom.sun.management.jmxremote.port=9410
-Dcom.sun.management.jmxremote.authenticate=true
-Djmx.remote.x.login.config=StagingJmxAuthConfig
-Dorg.apache.camel.jmx.usePlatformMBeanServer=true
-Djava.security.auth.login.config=./src/main/resources/conf/ldap-auth.config
-Dcom.sun.management.jmxremote.ssl=false 
-Dorg.apache.camel.jmx.createRmiConnector=false 
-Dcom.sun.management.jmxremote.login.config=StagingJmxAuthConfig

对于我们,使用安全的LDAP,以下是登录配置:

StagingJmxAuthConfig {
   com.sun.security.auth.module.LdapLoginModule REQUIRED
   java.naming.security.authentication="simple"
   java.naming.security.principal="cn=Directory Manager"
   java.naming.security.credentials="PASSWORD"
   userProvider="ldap://LDAPHOST:389/BASEDN"
   userFilter="(&(uid={USERNAME})(appRole=SOME_VALUE))"
   authzIdentity=monitorRole
   debug=true
   useSSL=false;
   };

现在我可以使用jmxterm进行连接:

java -jar jmxterm-1.0-alpha-4-uber.jar -l service:jmx:rmi:///jndi/rmi://THEHOST:9410/jmxrmi -u LDAPUSER -p LDAPPASS

请注意,JNDI RMI名称缺少“/ camel”后缀 - 这是唯一的区别,似乎。

HOORAY!

1 个答案:

答案 0 :(得分:0)

本质上:

  • 使用经过身份验证的Java6 JMX remoting
  • 设置org.apache.camel.jmx.createRmiConnector = false
  • 设置org.apache.camel.jmx.usePlatformMBeanServer = true

上面的示例还显示了如何连接到受搜索保护的LDAP,该LDAP实际上是隔离的,因为有问题的应用程序使用不同的LDAP进行JMS的JNDI查找。