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 によって Java プラットフォームを監視するには、以下の手順に従ってください。
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 は自動的にすべてのローカル 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
などのロールに対するパスワードを追加します。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 (Secure sockets layer) は、リモート監視および管理を有効にするときにデフォルトで有効になっています。SSL
を使用するには、JMX エージェント (MBean サーバ) が動作するシステム上でデジタル証明書を設定して、次に SSL
を正しく設定します。コマンド行ユーティリティ keytool
を使用して、証明書を操作します。通常の手順は以下のとおりです。
keytool -genkey
コマンドで鍵ペアを生成します。 keytool -certreq
コマンドで認証局 (CA)
に署名付き証明書を要求します。 keytool -import
コマンドで証明書をキーストアにインポートします。「証明書のインポー
ト」を参照してください。システムプロパティ | 説明 |
---|---|
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 認証を有効にするには、JVM を起動するときにこのシステムプロパティを設定します。
com.sun.management.jmxremote.ssl.need.client.auth=true
クライアント 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 hostName:portNum
ここで、hostName は、アプリケーションを実行するシステム名で、portNum は、JVM
を起動するときに指定したポート番号です。ホスト名とポート番号を省略して、jconsole
が提供するダイアログボックスに入力することもできます。
注: jconsole
をコマンド行から実行するには、JAVA_HOME
が JDK を含むディレクトリになっているパスに、JAVA_HOME/bin
を追加する必要があります。あるいは、コマンドを入力するときにフルパスを入力することもできます。
jconsole の使用についての詳細は、「jconsole の使用」を参照してく ださい。
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
- 監視および管理のために読み取り/書き込みアクセス権を許可します。アクセス制御エントリは、ロール名および関連するアクセスレベルで構成されています。ロール名には、スペースやタブを含めることはできず、パスワー ドファイル内のエントリに対応している必要があります。アクセスレベルは次のいずれかです。
ロールは、アクセスファイル内で 1 つのエントリだけを持つ必要があります。ロールにエントリがない場合、アクセス権はありません。ロールに複数のエントリがある場合、最後のエントリが優先 されます。
アクセスファイルの通常の事前定義のロールは次のとおりです。
# The "monitorRole" role has readonly access.
# The "controlRole" role has readwrite access.
monitorRole readonly
controlRole readwrite
構成ファイルまたはコマンド行で、管理と監視のプロパティを設定できます。コマンド行で指定したプロパティは、構成ファイル内のプロパティを無効に
します。構成ファイルのデフォルトの場所は、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 監視および管理プロパティを示しています。
プロパティ名 | 説明 | 値 |
---|---|---|
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 経由で安全に監視できるようにします。false の場合、SSL は使用されません。 | true / false - デフォルトは、true です。 |
com.sun.management.jmxremote. |
SSL/TLS プロトコルバージョンを有効にするカンマ区切りのリスト。com.sun.management.jmxremote.ssl
と組み合わせて使用されます。 |
デフォルトの SSL/TLS プロトコルバージョン |
com.sun.management.jmxremote. |
SSL/TLS 暗号群を有効にするカンマ区切りのリスト。com.sun.management.jmxremote.ssl
と組み合わせて使用されます。 |
デフォルトの SSL/TLS 暗号群 |
com.sun.management.jmxremote. |
このプロパティが true でプロパティ com.sun.management.jmxremote.ssl
が true の場合、クライアント認証が実行されます。 |
true / false - デフォルトは、false です。 |
com.sun.management.jmxremote. |
このプロパティが false の場合、JMX はパスワードまたはアクセスファイルを使用しません。すべてのユーザがアクセスを許可されます。 | true / false - デフォルトは、true です。 |
com.sun.management.jmxremote. |
パスワードファイルの場所を指定します。com.sun.management.jmxremote.password
が false
の場合、このプロパティとパスワードおよびアクセスファイルは無視されます。それ以外の場合は、パスワードファイルが存在し、有効なフォーマットである必
要があります。パスワードファイルが空であるか存在しない場合、アクセスは許可されません。 |
JRE_HOME/lib/management/ |
com.sun.management.jmxremote. |
アクセスファイルの場所を指定します。com.sun.management.jmxremote.password
が false
の場合、このプロパティとパスワードおよびアクセスファイルは無視されます。それ以外の場合は、アクセスファイルが存在し、有効なフォーマットである必要
があります。アクセスファイルが空であるか存在しない場合、アクセスは許可されません。 |
JRE_HOME/lib/management/ |
com.sun.management.jmxremote. |
RMI 監視のユーザを認証する場合に使用する JAAS
ログイン設定エントリの名前を指定します。このプロパティをデフォルトのログイン設定をオーバーライドするために使用する場合は、JAAS
でロードされたファイルに指定された設定エントリが存在する必要があります。また、設定で指定されたログインモジュールはユーザの資格を取得するために名
前とパスワードのコールバックを使用する必要があります。詳細は javax.security.auth.callback.NameCallback
および
javax.security.auth.callback.PasswordCallback
を参照してください。com.sun.management.jmxremote.authenticate が false
の場合、このプロパティおよびパスワード、アクセスファイルは無視されます。
|
デフォルトのログイン設定はファイルベースのパスワード認証です。 |
MBean サーバ、RMI レジストリ、またはコネクタの起動中にエラーが発生した場合、JVM は例外をスローして終了します。構成エラーには以下のものがあります。
アプリケーションでセキュリティマネージャを実行している場合は、セキュリティ権限ファイルに追加の権限が必要です。