全て。
Camel バージョン 2.10.3 + Java 6 を使用して、JAAS 認証を使用してリモート JMX を動作させようとしています。
このアプリは 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
の空の Map を使用してのインスタンスが作成されます。env
さて、私を逃れている何かがあるのだろうか - リクエストが後でコネクタに届き、 が を実行すると、JAAS アクティビティをトリガーできないjavax.management.remote.rmi.RMIServerImpl
のでしょうか?doNewClient()
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」という接尾辞がないことに注意してください。これが唯一の違いのようです。
万歳!