13 セキュリティ
この章では、JMXテクノロジのセキュリティ機能の設定方法の例を、次のセクション内で説明します。
- 簡単なセキュリティでは、パスワード認証とファイル・アクセス制御に基づいた簡単なセキュリティを実装するコネクタの例を示します。
 - 詳細なセキュリティでは、個々の操作を実行する権限が制御される、より高度なセキュリティ・メカニズムを実装するコネクタの例を示します。
 
ノート:
主体委譲機能は削除されました。クライアント・アプリケーションが複数のアイデンティティとして、または複数のアイデンティティのかわりに操作を実行する必要がある場合、 JMXConnectorFactory.connect()と、返されたJMXConnectorのgetMBeanServerConnection()メソッドを複数回呼び出す必要があります。
               警告:
セキュリティ・マネージャおよびそれに関連するAPIは非推奨であり、今後のリリースでは削除されます。セキュリティ・マネージャの代わりとなるものはありません。詳細および代替手段については、JEP 411を参照してください。注意:
- アプリケーションでは、ユーザーがパスワードをコマンド行に入力するのではなく、パスワードの入力をユーザーに求めるようにする必要があります。
 - 実稼動システムではセキュアな認証メカニズムを使用してください。特に、クライアント・ホストを認証するSSLクライアント証明書とユーザー管理用のパスワード認証の両方を使用します。『Java Platform, Standard Editionモニタリングおよび管理ガイド』のSSLの使用に関する項およびLDAP認証の使用に関する項を参照してください。
 
簡単なセキュリティ
JMXテクノロジを使用して実装できるもっとも簡単なセキュリティは、暗号化、ユーザー名とユーザー・パスワードの認証、およびファイル・アクセス制御に基づくものです。
簡単なセキュリティの例題クラスを使用したRMIコネクタの分析
- 
                           
「簡単なセキュリティ」の項に含まれているソース・コードをコピーし、次の
work_dir/jmx_examples/Security/simpleのサブディレクトリおよび対応するファイルを作成します。/server/Server.java/config/access.properties/config/keystore/config/password.properties/config/truststore/mbeans/SimpleStandardMBean.java/mbeans/SimpleStandard.java/client/Client.java/client/ClientListener.java
 - 
                           
*.javaおよび*.propertiesファイルをIDEまたはテキスト・エディタで開きます。 
次のセクションでは、これらのファイルを分析し、前述したセキュリティ操作をどのように実行するかについて説明します。
簡単なセキュリティの例題のServer.java
次のコード例に、Server.javaクラスを示します。
                     
コード例13-1 RMIコネクタの例題(簡単なセキュリティ)クラスServer.java
public class Server { 
 
  public static void main(String[] args) { 
  try { 
       MBeanServer mbs = MBeanServerFactory.createMBeanServer(); 
 
       HashMap env = new HashMap(); 
 
       SslRMIClientSocketFactory csf =  
                  new SslRMIClientSocketFactory(); 
       SslRMIServerSocketFactory ssf =  
                  new SslRMIServerSocketFactory(); 
       env.put(RMIConnectorServer. 
                  RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE,csf); 
       env.put(RMIConnectorServer. 
                  RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE,ssf); 
 
       env.put("jmx.remote.x.password.file", 
                 "config" + File.separator + "password.properties"); 
       env.put("jmx.remote.x.access.file", 
                 "config" + File.separator + "access.properties"); 
 
       JMXServiceURL url = new JMXServiceURL( 
        "service:jmx:rmi:///jndi/rmi://localhost:9999/server"); 
         JMXConnectorServer cs = 
            JMXConnectorServerFactory.newJMXConnectorServer(url,  
                                                            env,  
                                                            mbs); 
       cs.start(); 
     } catch (Exception e) { 
       e.printStackTrace(); 
     } 
  } 
}このコード例に示すServerクラスは、MBeanサーバーmbsを作成し、環境マップenvにセキュリティ保護されたRMIクライアント・ソケット・ファクトリcsf、セキュリティ保護されたRMIサーバー・ソケット・ファクトリssf、およびプロパティ・ファイルpassword.propertiesとaccess.propertiesを渡します。
                        
プロパティ・ファイルpassword.propertiesには、ユーザー名とパスワードが含まれ、JMXリモートAPIインタフェースJMXAuthenticatorを使用してアクセスします。プロパティjmx.remote.x.password.fileを使用することは、パスワードベースのJMXAuthenticatorを作成し、これをjmx.remote.authenticatorプロパティを通じて環境マップに渡すのと同じ意味を持ちます。
                        
プロパティ・ファイルaccess.propertiesには、ユーザー名と一定レベルのアクセス権、readwriteとreadonlyのいずれかが含まれます。これはアクティブなユーザーが、MBeanサーバー操作にどのレベルでアクセスできるかを表します。このファイルベースのアクセス制御は、アクセス・コントローラMBeanサーバー内に実際のMBeanサーバーをラップする、JMXテクノロジのインタフェースMBeanServerForwarderを使用して実装されます。アクセス・コントローラMBeanサーバーは、適切なチェックを実行したあとに、実際のMBeanサーバーに要求を転送します。
                        
ServerはRMIコネクタ用にJMXサービスURL、urlを作成します。このRMIコネクタはデフォルトのJRMPトランスポート上で動作し、ローカル・ホストのポート9999のRMIレジストリにRMIコネクタ・スタブを登録します。
                        
MBeanサーバーmbs、環境マップenv、およびサービスURL urlはすべてJMXConnectorServerに渡され、セキュアなJMXコネクタ・サーバーcsが新規に作成されます。
                        
簡単なセキュリティの例題のSimpleStandardMBean.java
SimpleStandardMBeanクラスは、MBeanの例題のSimpleStandardMBean.javaで使用されたのと同じ簡単なMBeanインタフェースを定義します。
                     
簡単なセキュリティの例題のSimpleStandard.java
SimpleStandardクラスは、MBeanの例題のSimpleStandard.javaで使用されたのと同じ簡単なMBeanを定義します。
                     
簡単なセキュリティの例題のClientListener.java
ClientListenerクラスは、MBeanの例題のClientListener.javaで使用されたのと同じ簡単な通知リスナーを定義します。
                     
簡単なセキュリティの例題のClient.java
次のコード例に、Client.javaクラスを示します。
                     
コード例13-2 RMIコネクタの例題(簡単なセキュリティ)クラスClient.java
public class Client { 
 
  public static void main(String[] args) { 
  try { 
      HashMap env = new HashMap(); 
 
      String[] credentials = new String[] { "username" , "password" }; 
      env.put("jmx.remote.credentials", credentials); 
      JMXServiceURL url = new JMXServiceURL( 
         "service:jmx:rmi:///jndi/rmi://localhost:9999/server");       
      JMXConnector jmxc = JMXConnectorFactory.connect(url, env); 
      MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); 
      String domains[] = mbsc.getDomains(); 
      for (int i = 0; i < domains.length; i++) { 
         System.out.println("Domain[" + i + "] = " + domains[i]); 
      } 
       
      ObjectName mbeanName =  
          new ObjectName("MBeans:type=SimpleStandard"); 
      mbsc.createMBean("SimpleStandard", mbeanName, null, null); 
      // Perform MBean operations 
      [...] 
      
      mbsc.removeNotificationListener(mbeanName, listener); 
      mbsc.unregisterMBean(mbeanName); 
      jmxc.close(); 
    }  catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
} 
このコード例に示すClientクラスは、環境マップenvにServerが求める資格セット、つまりusernameやpasswordを渡します。これらの資格は、コネクタ・スタブのサービスURLと環境マップがJMXConnectorFactory.connect()に渡されるときに、JMXConnectorのインスタンスjmxcに付与されます。Clientはjmxcを通じて、Server側で起動されたMBeanに接続し、MBeanの操作を実行します。
                        
接続が確立すると、環境マップenvで付与された資格はサーバーに送信されます。サーバーは次に、JMXAuthenticatorインタフェースのauthenticate()メソッドを呼び出し、クライアント資格をパラメータとして渡します。authenticate()メソッドは、クライアントを認証し、アクセス制御の確認に使用されるプリンシパルのセットを含む被認証者を返します。
                        
簡単なセキュリティを使用したRMIコネクタの例題の実行
簡単なセキュリティを使用したRMIコネクタの例題を実行するには、次のステップを実行します。
- 
                           
RMIコネクタの例題を実行します:
$ javac mbeans/SimpleStandard.java \ mbeans/SimpleStandardMBean.java \ server/Server.java \ client/Client.java \ client/ClientListener.java - ローカル・ホストのポート9999でRMIレジストリを起動します。 
$ export CLASSPATH=server ; rmiregistry 9999 & Serverを起動します。$ java -classpath server:mbeans \ -Djavax.net.ssl.keyStore=config/keystore \ -Djavax.net.ssl.keyStorePassword=password \ Server &MBeanサーバーとRMIコネクタの作成の確認が表示されます。
Clientを起動します。$java -classpath client:server:mbeans \ -Djavax.net.ssl.trustStore=config/truststore \ -Djavax.net.ssl.trustStorePassword=trustword \ Clientコネクタ・クライアントと各種のMBean操作の作成、および作成後の接続の終了の確認が表示されます。
この例からわかるように、すべての処理が、JMXコネクタで説明した基本的なRMIコネクタの例とまったく同じ方法で進められているように見えます。ただし、password.propertiesを開きパスワードを変更する場合、Clientを起動するとjava.lang.SecurityExceptionが表示され、接続に失敗します。
                     
詳細なセキュリティ
警告:
セキュリティ・マネージャおよびそれに関連するAPIは非推奨であり、今後のリリースでは削除されます。セキュリティ・マネージャの代わりとなるものはありません。詳細および代替手段については、JEP 411を参照してください。このセクションの2つの例題は、簡単なセキュリティに示す例題と非常に似ていますが、異なる点として、簡単なファイルベースのアクセス制御が、ポリシー・ベースのアクセス制御に置き換えられています。
詳細なセキュリティの例題クラスを使用したセキュアなRMIコネクタの分析
- 
                           「詳細なセキュリティ」の項に含まれているソース・コードをコピーし、次の
work_dir/jmx_examples/Security/fine_grainedのサブディレクトリおよび対応するファイルを作成します。/server/Server.java/config/java.policy/config/keystore/config/password.properties/config/truststore/mbeans/SimpleStandard.java/mbeans/SimpleStandardMBean.java/client/ClientListener.java/client/Client.java
 *.javaおよび*.propertiesファイルのすべてをIDEまたはテキスト・エディタで開きます。
次の各項で、これらのファイルの分析を説明します。
詳細なセキュリティの例題のServer.java
この例のServer.javaクラスは、unresolvable-reference.htmlで使用されるクラスによく似ています。ただし、詳細なセキュリティの例題では、環境マップにマップされるaccess.propertiesファイルがありません。それ以外は、両クラスは同一です。
                     
詳細なセキュリティの例題のjava.policy
java.policyファイルは、次の権限を付与します。
                     
serverコード・ベースのすべての権限。これがあることで、コネクタ・サーバーはコネクタを作成し、リモート・ユーザーの呼出しで要求される操作を実行できるmbeansコード・ベースに対するMBeanTrustPermission。これによって、信頼されたMBeanをMBeanサーバーに登録できるJMXPrincipalで表されるユーザー、username.に対する、各種のMBean操作およびMBeanサーバー操作を実行する権限
詳細なセキュリティを使用したRMIコネクタの例題の実行
詳細なセキュリティを使用したRMIコネクタの例題を実行するには、次のステップを実行します。
- RMIコネクタの例題を実行します: 
$ javac mbeans/SimpleStandard.java \ mbeans/SimpleStandardMBean.java \ server/Server.java \ client/Client.java \ client/ClientListener.java - ローカル・ホストのポート9999でRMIレジストリを起動します。 
$ export CLASSPATH=server ; rmiregistry 9999 & Serverを起動します。$java -classpath server:mbeans \ -Djavax.net.ssl.keyStore=config/keystore \ -Djavax.net.ssl.keyStorePassword=password \ -Djava.security.manager \ -Djava.security.policy=config/java.policy \ Server &環境マップの初期化、MBeanサーバーとRMIコネクタの作成の確認が表示されます。
Clientを起動します。$ java -classpath client:server:mbeans \ -Djavax.net.ssl.trustStore=config/truststore \ -Djavax.net.ssl.trustStorePassword=trustword \ Clientコネクタ・クライアントの作成、RMIサーバーへの接続、各種のMBean操作、および接続の終了の確認が表示されます。