все.
Пытались заставить удаленный JMX с аутентификацией JAAS работать с 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
Однако во всех смыслах кажется, что я мог бы также работать с отключенной аутентификацией/авторизацией.
При отладке классов JMX и JAAS JRE (а также Camel) обратите внимание на следующее:
В классе 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 RMIServerImpl — помните, что 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...
ОБНОВЛЕНИЕ: РЕШЕНО
Установка следующих системных свойств на виртуальной машине помогла:
-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" - похоже, это единственное отличие.
УРА!