全部。使用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活動?
線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!
本質: - 使用的Java6認證的JMX遠程處理 - 設置org.apache.camel.jmx.createRmiConnector =假 - 設置org.apache.camel.jmx.usePlatformMBeanServer =真 – jhberges