2

全て。

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」という接尾辞がないことに注意してください。これが唯一の違いのようです。

万歳!

4

1 に答える 1

0

本質的に:

上記の例は、検索で保護されたLDAPに接続する方法も示しています。これは、問題のアプリケーションがJMSのJNDIルックアップに別のLDAPを使用するため、実際には分離されています。

于 2013-01-09T09:47:25.587 に答える