2

デフォルトで JBoss 5.1.0.GA によって提供される JMXConnectorServerService を保護する方法を理解しようとしています。

現在、次の URL を JConsole に貼り付けると、認証なしで直接 JMX にアクセスできます: service:jmx:rmi:///jndi/rmi://:1290/jmxconnector

次に、すべての JMX アクセスを保護することを期待して、JMXInvoker を保護するためにこれを行いました

しかし、明らかに、それは JMXConnectorServerService には当てはまりません。jconsole から上記のサービス URL を使用して JMX にアクセスできます。

その後、まだ対応していないこの機能リクエストについて知りました: https://issues.jboss.org/browse/JBAS-8159

今のところ、私はクレイジーなセキュリティ対策について心配していません. この URL が外部ネットワークに公開されることはありません。では、「jmx-console」セキュリティ ドメインを使用して jmx-remoting.sar を保護する最も簡単な方法を知りたいだけですか?

デフォルトの MBean サーバーに切り替えることもできましたが、どうやら 5.1.0.GA では面倒です: https://community.jboss.org/thread/153594

この点に関して、ご意見をいただければ幸いです。

ありがとう!

4

1 に答える 1

3

サービスが確保されているとは思いませんが、パッチがあります。

AS 5 でこれをテストしていないので、もう少し単純なバージョンを試してみますが、AS 4 にバックポートしたところ、問題なく動作しました。

正確にはどのバージョンをお持ちかわかりませんが、これだと仮定しましょ。EAP 版はもう少し複雑なバージョンがありますが、前提は同じです。JMXConnectorServerServiceJMXConnectorServerServiceMBeanを拡張する必要があります。

この実装では、サーバーを作成するコードは次のようになります。

// create new connector server and start it
connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbeanServer);

拡張機能で、次を追加します。

/** The name of the JAAS domain to use for authentication */
protected String jaasDomain = null; 
...
/**
   * Returns the name of the JAAS domain to use for authentication
   * @return the name of a JAAS Domain
   */
public String getJaasDomain() {
   return jaasDomain;
}

/**
  * Sets the name of the JAAS domain to use for authentication
  * @param jaasDomain the JAAS Domain to use for authentication
  */
public void setJaasDomain(String jaasDomain) {
   this.jaasDomain = jaasDomain;
}

ここで、認証に使用する JAAS ドメイン名を含む環境を追加するstartメソッドを再実装する必要があります。

   public void start() throws Exception
   {
      // the address to expose in the urls
      String host = System.getProperty("java.rmi.server.hostname");

      // check to see if registry already created
      rmiRegistry = LocateRegistry.getRegistry(host, registryPort);
      if (rmiRegistry != null)
      {
         try
         {
            rmiRegistry.list();
         }
         catch(RemoteException e)
         {
            log.debug("No registry running at host '" + host +
                  "', port '" + registryPort + "'.  Will create one.");
            rmiRegistry = LocateRegistry.createRegistry(registryPort, null, new DefaultSocketFactory(bindAddress));
         }
      }
      else
      {
         rmiRegistry = LocateRegistry.createRegistry(registryPort, null, new DefaultSocketFactory(bindAddress));
      }

      String serviceURL = "service:jmx:rmi://" + host + "/jndi/rmi://" + host + ":" + registryPort + jndiPath;

      JMXServiceURL url = new JMXServiceURL(serviceURL);

      // create new connector server and start it
      // ==== NEW AUTH CODE HERE ====
      final Map<String, Object> environment = new HashMap<String, Object>();
      environment.put("jmx.remote.x.login.config", jaasDomain);
      connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, environment, mbeanServer);
      // ==== NEW AUTH CODE ENDS ====
      connectorServer.start();

      log.info("JMX Connector server: " + serviceURL);
   }

オプションで、次のように JAAS 名を検証できます。

/**
 * Validates the name of the passed JAAS domain. 
 * If the name is not valid, a RuntimeException will the thrown.
 * @param domain The name of the JAAS domain to validate.
 */
private void validateJaasDomain(String domain) {
    try {
        new LoginContext(domain);
    } catch (Exception e) {
        throw new RuntimeException("The JAAS Domain [" + domain + "] could not be loaded", e);
    }
}

jaasDomain 属性を新しい MBean インターフェースに追加します。

/**
 * Returns the name of the JAAS domain to use for authentication
 * @return the name of a JAAS Domain
 */
public String getJaasDomain();

/**
 * Sets the name of the JAAS domain to use for authentication
 * @param jaasDomain the JAAS Domain to use for authentication
 */
public void setJaasDomain(String jaasDomain);

新しい impl がcom.vijay.JMXConnectorServerServiceで、新しい MBean がcom.vijay.JMXConnectorServerServiceMBeanであると仮定しましょう。デプロイメント記述子は次のようになります: ( jmx-console jaas ドメインを使用します。おそらくセキュリティで保護されているため....)

<!-- ======================================================== -->
<!-- Example Vijay JMX Remoting Service Configuration file        -->
<!-- ======================================================== -->
<server>

   <mbean code="com.vijay.JMXConnectorServerService"
      name="jboss.remoting:service=JMXConnectorServer,protocol=rmi"
      display-name="JMX Connector Server (RMI)">
           <attribute name="BindAddress">
               <!-- Get the port from the ServiceBindingManager -->
               <value-factory bean="ServiceBindingManager" method="getStringBinding" 
                  parameter="jboss.remoting:service=JMXConnectorServer,protocol=rmi"/>
            </attribute>
            <!-- if comment this out, will use 1099 as default and will conflict -->
            <!-- with default JNP (JNDI) port. -->
            <attribute name="RegistryPort">
               <!-- Get the port from the ServiceBindingManager -->
               <value-factory bean="ServiceBindingManager" method="getIntBinding" 
                  parameter="jboss.remoting:service=JMXConnectorServer,protocol=rmi"/>
            </attribute>
            <!-- the path to which will be bound in rmi registry -->
            <!-- the commented value below is the default. -->
            <!-- <attribute name="JndiPath">/jmxconnector</attribute> -->
            <attribute name="JaasDomain">jmx-console</attribute>
   </mbean>
</server>

持っているのはそれだけだ。お役に立てば幸いです。

于 2013-01-17T19:32:00.810 に答える