JMX を使用する監視と管理

Java 仮想マシン (JVM) には、JMX を使って JVM の監視と管理を可能にする機能が組み込まれています。また、実装されたアプリケーションを JMX で監視することもできます。

システムプロパティの設定

JMX エージェントを有効にして、動作を設定するには、JVM を起動するときに特定のシステムプロパティを設定する必要があります。コマンド行上で次のようにシステムプロパティを設定します。

java -Dproperty=value ...

この方法で任意の数のシステムプロパティを設定できます。値を指定しない場合、デフォルト値で設定されます。JMX 管理プロパティのフルセットは、表 1 に記載されています。JMX 管理および監視プロパティに記載したように設定ファイルでシステムプロパティを設定することも できます。

:java (Java VM) をコマンド行から実行するには、JRE_HOME/bin をパスに追加する必要があります。ここで JRE_HOME は、JRE (Java Runtime Environment) を含むディレクトリです。代わりにコマンドを入力するときにフルパスを入力することもできます。

以下のドキュメントは、Java HotSpot VM によってサポートされている構文とコマンド行オプションのフルセットについて説明しています。

JMX エージェントの有効化

JMX によって Java プラットフォームを監視するには、以下の手順に従ってください。

  1. JVM を起動するときに JMX エージェント (MBean サーバ) を有効にします。以下に対して JMX エージェントを有効にすることができます。
  2. JVM を jconsole などの JMX 準拠のツールで監視します。詳細は、「jconsole の使用」を参照してください。

ローカルの監視と管理

ローカルアクセスに対して JMX エージェントを有効にするには、JVM または Java アプリケーションを起動するときにこのシステムプロパティを設定します。

com.sun.management.jmxremote

このプロパティを設定することにより、JVM 実装 MBean を登録し、RMI コネクタを専用インタフェース経由で公開して、JMX クライアントアプリケーションがローカルの Java プラットフォーム、すなわち、同一マシン上で動作する JVM を監視できるようにします。

たとえば、サンプルアプリケーションの Notepad 用の JMX エージェントは、以下のようにして有効にします。

cd JDK_HOME/demo/jfc/Notepad
java -Dcom.sun.management.jmxremote -jar Notepad.jar

ここで、JDK_HOME は、JDK がインストールされているディレクトリです。

jconsole の使用

jconsole によるローカルの監視は、開発およびプロトタイプ作成に便利です。jconsole 自体がかなりのシステムリソースを消費するため、jconsole をローカルで実稼働環境に使用することはお勧めしません。それよりは、jconsole をリモートシステムで使用して、監視されるプラットフォームから分離してください。

コマンドシェルで jconsole と入力して、jconsole を起動します。引数なしで jconsole を起動する場合、jconsole は自動的にすべてのローカル Java アプリケーションを検出し、監視したいアプリケーションを選択できるダイアログボックスを表示します。システムの監視には、オペレーティングシステムの ファイルアクセス権が必要であるため、jconsole とアプリケーションは両方とも、同じユーザ名で実行する必要があります。

:jconsole をコマンド行から実行するには、JAVA_HOME が JDK を含むディレクトリになっているパスに、JAVA_HOME/bin を追加する必要があります。あるいは、コマンドを入力するときにフルパスを入力することもできます。

jconsole の使用についての詳細は、「jconsole の使用」を参照してく ださい。

リモートの監視と管理

リモートシステムからの監視と管理を可能にするには、JVM を起動するときにこのシステムプロパティを設定します。

com.sun.management.jmxremote.port=portNum

ここで、portNum は、JMX/RMI 接続を有効にしたいポート番号です。必ず未使用のポート番号を指定してください。ローカルアクセスに対して RMI コネクタを公開するのに加えて、このプロパティを設定することにより、標準名「jmxrmi」を使用して、特定のポートのプライベートな読み取り専用レジ ストリで追加の RMI コネクタを公開します。

:以下に説明されているように、セキュリティ用に設定するプロパティの他に上記のシステムプロパティを設定する必要があります。

リモートの監視と管理には、権限のないユーザがアプリケーションを制御または監視できないようにするためにセキュリティが必要です。デフォルトで、 SSL (secure sockets layer) 経由のパスワード認証が有効になっています。以下のセクションで説明されているように、パスワード認証と SSL を個別に無効にすることができます。

JMX エージェントをリモートで使用できるようにしたら、「jconsole によるリモート監視」で説明されているように jconsole を使ってアプリケーションを監視できます。

パスワード認証の使用

デフォルトでは、リモート監視で JMX エージェントを有効にすると、JMX エージェントはパスワード認証を使用します。ただし、パスワードを設定する方法は、シングルユーザ環境にいるか、マルチユーザ環境にいるかによって異なり ます。

パスワードはパスワードファイルにクリアテキストで格納されるため、監視用の通常のユーザ名とパスワードを使用することはお勧めできません。代わり に、monitorRole および controlRole などのパスワードファイルで指定したユーザ名を使用します。詳細は、「パスワードおよび アクセスファイルの使用」を参照してください。

シングルユーザ環境: JRE_HOME/lib/management ディレクトリで以下の手順でパスワードファイルを設定します。

  1. パスワードのテンプレートファイル、jmxremote.password.templatemanagement.jmxremote.password にコピーします。
  2. ファイルアクセス権を設定して、自分だけがパスワードファイルを読み取りおよび書き込みできるようにします。
  3. monitorRolecontrolRole などのロールに対するパスワードを追加します。

マルチユーザ環境: JRE_HOME/lib/managementディ レクトリで以下の手順でパスワードファイルを設定します。

  1. パスワードのテンプレートファイル、jmxremote.password.template をホームディレクトリにコピーします。
  2. ファイルアクセス権を設定して、所有者だけがパスワードファイルを読み取りおよび書き込みできるようにします。
  3. monitorRolecontrolRole などのロールに対するパスワードを追加します。
  4. JVM を起動するときにシステムプロパティを設定します。
    com.sun.management.jmxremote.password.file=pwFilePath
    ここで、pwFilePath はパスワードファイルへのパスです。
警告:クライアントがセキュリティ保護されていない RMI レジストリ (デフォルト) からリモートコネクタを取得すると、JMX リモートコネクタからのパスワード認証でセキュリティの問題が起こる可能性があります。攻撃者がターゲットサーバ上で正当な RMI レジストリが開始される前に偽の RMI レジストリを開始すると、攻撃者はクライアントのパスワードを盗むことができます。このシナリオは、システムプロパティ com.sun.management.jmxremote.port=portNum でリモート管理を有効にして JVM を起動する場合も同じです。SSL が有効になっていても同じです。このような攻撃者は発見されることが多いものの、脆弱性があることは確かです。

この問題を避けるため、認証にはパスワードの代わりに SSL クライアント認証を使用してください。または、クライアントがリモートコネクタオブジェクトを安全に (セキュリティ保護された LDAP 経由で、または共有のセキュリティ保護されたファイルシステムにあるファイルを経由してなど) 取得するようにしてください。

将来のリリースで、この問題は修正される予定です。

パスワード認証の無効化

リモート監視のパスワード認証は、デフォルトで有効になっています。パスワード認証を無効にするには、JVM を起動するときに以下のシステムプロパティを設定します。

com.sun.management.jmxremote.authenticate=false

ここで、portNum は、使用するポート番号です。必ず未使用のポート番号を指定してください。

パスワード認証を無効にする場合、「セキュリティの無効化」で説明しているように SSL を無効にすることもできます。「クライアントの SSL 認証の有効化」で説明しているようにパスワードを無効にして、SSL クライアント認証を有効にしたい場合もあります。

警告: この構成は安全ではありません。JMX ポート番号およびホスト名を知っている (または推測する) リモートユーザが Java アプリケーションおよびプラットフォームを監視および制御できます。開発用のシステムなら許容されるかもしれませんが、実稼働システムにはお勧めしませ ん。

SSL の使用

SSL (Secure sockets layer) は、リモート監視および管理を有効にするときにデフォルトで有効になっています。SSL を使用するには、JMX エージェント (MBean サーバ) が動作するシステム上でデジタル証明書を設定して、次に SSL を正しく設定します。コマンド行ユーティリティ keytool を使用して、証明書を操作します。通常の手順は以下のとおりです。

  1. サーバ上でまだ鍵ペアと証明書を設定していない場合は以下の手順に従います。
    1. keytool -genkey コマンドで鍵ペアを生成します。
    2. keytool -certreq コマンドで認証局 (CA) に署名付き証明書を要求します。
    3. keytool -import コマンドで証明書をキーストアにインポートします。「証明書のインポー ト」を参照してください。
      詳細および例については、「keytool - 鍵および証明書管理ツール」(Solaris および Linux) (Windows)を 参照してください。
  2. サーバシステム上で SSL を設定します。このドキュメントでは、SSL の設定とカスタマイズについて詳細には説明しませんが、通常、次の表に記載されているシステムプロパティを 設定する必要があります。詳細は、JSSE ガイドの「デフォルト鍵およびト ラストストア、ストアタイプ、およびストアパスワードのカスタマイズ」を参照してください。

SSL 構成のシステムプロパティ
システムプロパティ 説明
javax.net.ssl.keyStore キーストアの場所
javax.net.ssl.trustStore トラストストアの場所
javax.net.ssl.keyStoreType デフォルトのキーストア型
javax.net.ssl.keyStorePassword デフォルトのキーストアパスワード
javax.net.ssl.trustStoreType デフォルトのトラストストア型
javax.net.ssl.trustStorePassword デフォルトのトラストストアパスワード

詳細は、「keytool - 鍵および証明書管理ツール(Solaris および Linux) (Windows)」および「JSSE ガイド」を参照してください。

クライアント SSL 認証の有効化

クライアント SSL 認証を有効にするには、JVM を起動するときにこのシステムプロパティを設定します。

com.sun.management.jmxremote.ssl.need.client.auth=true

クライアント SSL 認証を使用するには、SSL を有効 (デフォルト) にしておく必要があります。

この構成では、クライアントシステムが有効なデジタル証明書を持つ必要があります。「SSL の使用」で説明したとおりに証明書をインストールして、SSL を設定する必要があります。

SSL の無効化

リモート監視で SSL を無効にするには、JVM を起動するときにこのシステムプロパティを設定します。

com.sun.management.jmxremote.ssl=false

パスワード認証は、「パスワード認証の無効化」で指定したとおりに無効にしない限り 必要になります。

セキュリティの無効化

パスワード認証と SSL の両方を無効 (セキュリティなし) にするには、JVM を起動するときにこれらのシステムプロパティを設定します。

com.sun.management.jmxremote.authenticate=false
com.sun.management.jmxremote.ssl=false

警告:この構成は安全ではありません。JMX ポート番号およびホスト名を知っている (または推測する) リモートユーザが Java アプリケーションおよびプラットフォームを監視および制御できます。開発用のシステムなら許容されるかもしれませんが、実稼働システムにはお勧めしませ ん。

jconsole によるリモート監視

リモートアプリケーションを監視するには、次のように jconsole を起動します。

jconsole hostName:portNum

ここで、hostName は、アプリケーションを実行するシステム名で、portNum は、JVM を起動するときに指定したポート番号です。ホスト名とポート番号を省略して、jconsole が提供するダイアログボックスに入力することもできます。

: jconsole をコマンド行から実行するには、JAVA_HOME が JDK を含むディレクトリになっているパスに、JAVA_HOME/bin を追加する必要があります。あるいは、コマンドを入力するときにフルパスを入力することもできます。

jconsole の使用についての詳細は、「jconsole の使用」を参照してく ださい。

プログラムによる JMX エージェントへの接続

JMX エージェントを有効にしたら、以下の URL を使ってサービスにアクセスできます。

service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi

ここで、hostName はホスト名で portNum は、JMX エージェントを有効にしたときに指定したポート番号です。

次のように、URL を使って、javax.management.remote.JMXServiceURL オブジェクトのインスタンスを生成し、次に JMXConnectorFactory.connect メソッドを使用して接続を作成することにより、クライアントはエージェントへのコネクタを作成できます。

JMXServiceURL u = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi:// “ + hostName + ":"+ portNum + "/jmxrmi");
JMXConnector c = JMXConnectorFactory.connect(u);

パスワードおよびア クセスファイルの使用

パスワードおよびアクセスファイルは、リモート監視および管理のセキュリティを制御します。これらのファイルは、デフォルトでは、JRE_HOME/lib/management にあり、標準の Java プロパティファイルフォーマットです。フォーマットに関する詳細は、「java.util.properties」を参 照してください。

パスワードファイル

パスワードファイルは、さまざまなロールとそのパスワードを定義します。アクセス制御ファイル (デフォルトでは、jmxremote.access) は、それぞれのロールに許可されるアクセス権を定義します。ロールを機能させるには、パスワードとアクセスファイルの両方にエントリを持つ必要がありま す。

JRE には、jmxremote.password.template という名前のパスワードファイルテンプレートがあります。このファイルを JRE_HOME/lib/management/jmxremote.password またはホームディレクトリにコピーして、アクセスファイルで定義したロールのパスワードを追加します。

パスワードファイルにはパスワードがクリアテキストで含まれるため、必ず所有者だけがこのファイルへの読み取りおよび書き込みアクセス権を持つよう にしてください。セキュリティ上の理由から、システムは所有者だけがファイルを読み取りまたは書き込み可能であることを確認し、そうでない場合は終了しま す。このため、マルチユーザ環境では、パスワードファイルをホームディレクトリなどの非公開の場所に置きます。

プロパティ名はロールで、関連付けられた値はロールのパスワードです。

たとえば、パスワードファイルのエントリの例は次のようになります。

# The "monitorRole" role has password "QED".
# The "controlRole" role has password "R&D".
monitorRole QED
controlRole R&D

アクセスファイル

デフォルトでは、アクセスファイルは、jmxremote.access という名前です。プロパティ名はパスワードファイルと同じ領域からの ID です。関連する値は「readonly」または「readwrite」のいずれかにする必要があります。

アクセスファイルはロールとアクセスレベルを定義します。デフォルトでは、アクセスファイルは次の 2 つの主要なロールを定義します。

アクセス制御エントリは、ロール名および関連するアクセスレベルで構成されています。ロール名には、スペースやタブを含めることはできず、パスワー ドファイル内のエントリに対応している必要があります。アクセスレベルは次のいずれかです。

ロールは、アクセスファイル内で 1 つのエントリだけを持つ必要があります。ロールにエントリがない場合、アクセス権はありません。ロールに複数のエントリがある場合、最後のエントリが優先 されます。

アクセスファイルの通常の事前定義のロールは次のとおりです。

# The "monitorRole" role has readonly access.
# The "controlRole" role has readwrite access.
monitorRole readonly
controlRole readwrite

JMX 管理および監視プロパティ

構成ファイルまたはコマンド行で、管理と監視のプロパティを設定できます。コマンド行で指定したプロパティは、構成ファイル内のプロパティを無効に します。構成ファイルのデフォルトの場所は、JRE_HOME/lib/management/management.properties です。ここで JRE_HOME は、Java 実行時環境がインストールされているディレクトリです。com.sun.management.jmxremote または com.sun.management.jmxremote.port のいずれかのコマンド行プロパティが設定されている場合、JVM はこのファイルを読み取ります。SNMP 管理は同じ構成ファイルを使用します。詳細は、「SNMP 監視および管理」を参照してください。

次のコマンド行オプションでこの構成ファイルに別の場所を指定することもできます。

com.sun.management.config.file=ConfigFilePath

ここで、ConfigFilePath は、この構成ファイルへのパスです。

次の表は、すべての JMX 監視および管理プロパティを示しています。

表 1. JMX 管理および監視プロパティ
プロパティ名 説明
com.sun.management.jmxremote jconsole で使用される専用インタフェース上に公開された JMX コネクタ経由で JMX リモートエージェントおよびローカルの監視を有効にします。jconsole ツールは、エージェントを開始したユーザ ID と同じユーザ ID で実行した場合、このコネクタを使用できます。このコネクタ経由の要求については、パスワードやアクセスファイルはチェックされません。 true / false - デフォルトは、true です。
com.sun.management.jmxremote. port JMX リモートエージェントを有効にして、指定したポート経由で待機するためにリモート JMX コネクタを作成します。デフォルトでは、SSL、パスワード、およびアクセスファイルプロパティがこのコネクタに使用されます。また、com.sun.management.jmxremote プロパティで説明したローカルの監視も有効にします。 ポート番号 - デフォルトはありません。
com.sun.management.jmxremote.
ssl
SSL 経由で安全に監視できるようにします。false の場合、SSL は使用されません。 true / false - デフォルトは、true です。
com.sun.management.jmxremote.
ssl.enabled.protocols
SSL/TLS プロトコルバージョンを有効にするカンマ区切りのリスト。com.sun.management.jmxremote.ssl と組み合わせて使用されます。 デフォルトの SSL/TLS プロトコルバージョン
com.sun.management.jmxremote.
ssl.enabled.cipher.suites
SSL/TLS 暗号群を有効にするカンマ区切りのリスト。com.sun.management.jmxremote.ssl と組み合わせて使用されます。 デフォルトの SSL/TLS 暗号群
com.sun.management.jmxremote.
ssl.need.client.auth
このプロパティが true でプロパティ com.sun.management.jmxremote.ssl が true の場合、クライアント認証が実行されます。 true / false - デフォルトは、false です。
com.sun.management.jmxremote.
authenticate
このプロパティが false の場合、JMX はパスワードまたはアクセスファイルを使用しません。すべてのユーザがアクセスを許可されます。 true / false -
デフォルトは、true です。
com.sun.management.jmxremote.
password.file
パスワードファイルの場所を指定します。com.sun.management.jmxremote.password が false の場合、このプロパティとパスワードおよびアクセスファイルは無視されます。それ以外の場合は、パスワードファイルが存在し、有効なフォーマットである必 要があります。パスワードファイルが空であるか存在しない場合、アクセスは許可されません。 JRE_HOME/lib/management/
jmxremote.password
com.sun.management.jmxremote.
access.file
アクセスファイルの場所を指定します。com.sun.management.jmxremote.password が false の場合、このプロパティとパスワードおよびアクセスファイルは無視されます。それ以外の場合は、アクセスファイルが存在し、有効なフォーマットである必要 があります。アクセスファイルが空であるか存在しない場合、アクセスは許可されません。 JRE_HOME/lib/management/
jmxremote.access
com.sun.management.jmxremote.
login.config
RMI 監視のユーザを認証する場合に使用する JAAS ログイン設定エントリの名前を指定します。このプロパティをデフォルトのログイン設定をオーバーライドするために使用する場合は、JAAS でロードされたファイルに指定された設定エントリが存在する必要があります。また、設定で指定されたログインモジュールはユーザの資格を取得するために名 前とパスワードのコールバックを使用する必要があります。詳細は javax.security.auth.callback.NameCallback および javax.security.auth.callback.PasswordCallback を参照してください。

com.sun.management.jmxremote.authenticate が false の場合、このプロパティおよびパスワード、アクセスファイルは無視されます。
デフォルトのログイン設定はファイルベースのパスワード認証です。

構成エラー

MBean サーバ、RMI レジストリ、またはコネクタの起動中にエラーが発生した場合、JVM は例外をスローして終了します。構成エラーには以下のものがあります。

アプリケーションでセキュリティマネージャを実行している場合は、セキュリティ権限ファイルに追加の権限が必要です。