2013-01-08 52 views
2

全部。使用org.apache.camel.jmx.createRmiConnector的駱駝+ JMX + LDAP認證

一直在試圖讓遠程的JMX與JAAS認證工作的全光照駱駝版本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類(和駱駝也一樣),注意以下幾點:

在類org.apache.camel.management.DefaultManagementAgent

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

這反過來後來與創造的javax.management.remote.rmi.RMIJRMPServerImpl實例用於env構造函數參數的空映射。

現在,我想知道是否有什麼東西只是逃避我 - 當稍後請求連接器並且javax.management.remote.rmi.RMIServerImpl請求doNewClient()時,它不可能觸發任何JAAS活動?

的RMIServerImpl的

線197-208 - 記駱駝集「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連接器設置?

駱駝不應該提供一個讓JAAS工作的環境嗎?甚至不似乎觸摸JAAS配置文件...

UPDATE:解決

在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!

+0

本質: - 使用的Java6認證的JMX遠程處理 - 設置org.apache.camel.jmx.createRmiConnector =假 - 設置org.apache.camel.jmx.usePlatformMBeanServer =真 – jhberges

回答

0

本質:

  • 使用的Java6認證JMX remoting
  • 設置org.apache.camel.jmx.createRmiConnector =假
  • 集org.apache.camel.jmx。usePlatformMBeanServer =真

以上也示例顯示如何連接到一個搜索保護的LDAP,如所討論的應用程序使用JNDI查找JMS不同的LDAP這實際上是分離的。