http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/management/agent.html#remote
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 プラットフォームを監視するには、以下の手順に従ってください。
- JVM を起動するときに JMX エージェント (MBean サーバ) を有効にします。以下に対して JMX エージェントを有効にすることができます。
- ローカル監視 - ローカルシステムで動作するクライアント管理アプリケーション用。
- リモート監視 - リモートシステムで動作するクライアント管理アプリケーション用。
- 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
ディレクトリで以下の手順でパスワードファイルを設定します。
- パスワードのテンプレートファイル、
jmxremote.password.template
を management.jmxremote.password
にコピーします。
- ファイルアクセス権を設定して、自分だけがパスワードファイルを読み取りおよび書き込みできるようにします。
monitorRole
や controlRole
などのロールに対するパスワードを追加します。
マルチユーザ環境: JRE_HOME/lib/
management
ディレクトリで以下の手順でパスワードファイルを設定します。
- パスワードのテンプレートファイル、
jmxremote.password.template
をホームディレクトリにコピーします。
- ファイルアクセス権を設定して、所有者だけがパスワードファイルを読み取りおよび書き込みできるようにします。
monitorRole
や controlRole
などのロールに対するパスワードを追加します。
- 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
を使用して、証明書を操作します。通常の手順は以下のとおりです。
- サーバ上でまだ鍵ペアと証明書を設定していない場合は以下の手順に従います。
keytool -genkey
コマンドで鍵ペアを生成します。
keytool -certreq
コマンドで認証局 (CA) に署名付き証明書を要求します。
keytool -import
コマンドで証明書をキーストアにインポートします。「証明書のインポート」を参照してください。
詳細および例については、「keytool - 鍵および証明書管理ツール」(Solaris および Linux) (Windows)を参照してください。
- サーバシステム上で 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 つの主要なロールを定義します。
monitorRole
- 監視のための読み取り専用アクセスを許可します。
controlRole
- 監視および管理のために読み取り/書き込みアクセス権を許可します。
アクセス制御エントリは、ロール名および関連するアクセスレベルで構成されています。ロール名には、スペースやタブを含めることはできず、パスワードファイル内のエントリに対応している必要があります。アクセスレベルは次のいずれかです。
- readonly: MBean の属性に読み取りアクセスを許可します。監視の場合、これは、このロールのリモートクライアントが測定を読み取ることができるが、実行プログラムの環境を変更するアクションは実行できないことを意味します。
- readwrite: MBean の属性への読み取りおよび書き込みアクセス、属性への操作の呼び出し、これらの属性の作成または削除を許可します。アプリケーションの操作を妨害できるのは、信頼できるクライアントだけであるため、このアクセス権は信頼できるクライアントにだけ許可する必要があります。
ロールは、アクセスファイル内で 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 は例外をスローして終了します。構成エラーには以下のものがあります。
- ポート番号へのバインドの失敗
- 無効なパスワードファイル
- 無効なアクセスファイル
- パスワードファイルが所有者以外に読み取り可能になっている
アプリケーションでセキュリティマネージャを実行している場合は、セキュリティ権限ファイルに追加の権限が必要です。