Java Management Extensions(JMX)は、Javaプログラムの監視や管理を可能にするフレームワークです。また、カスタム実装したMBeanを使用して特定のメトリクスを検出することも可能です。ローカル環境では、jvisualvm、jconsole、またはJMCを使って直接JVMに接続できますが、リモートでの利用には以下の設定が必要です。
JMXによるリモートアクセスの設定
次の例では、Java 11に基づいた設定を行っています。
java \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=9000 \
-Dcom.sun.management.jmxremote.rmi.port=9100 \
-Djava.rmi.server.hostname=192.168.1.1 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar app.jar
- com.sun.management.jmxremote:JMXのリモートサービスを有効化します。
- java.rmi.server.hostname:JMXサービスが使用するIPアドレスまたはホスト名を指定します。
- com.sun.management.jmxremote.port:JMXサービスがリッスンするポート番号です。
- com.sun.management.jmxremote.rmi.port:RMIサービス用のポート番号です。
認証付きリモートアクセスの設定
認証を有効にする場合、以下のように設定します。
java \
-Dcom.sun.management.jmxremote=true \
-Djava.rmi.server.hostname=192.168.1.1 \
-Dcom.sun.management.jmxremote.port=9100 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=/path/to/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=/path/to/jmxremote.access \
-jar app.jar
- com.sun.management.jmxremote.password.file:パスワードファイルへのパスを指定します。
- com.sun.management.jmxremote.access.file:アクセス権限を定義したファイルへのパスです。
jmxremote.passwordおよびjmxremote.accessファイルには、次のような内容を追加します。
# jmxremote.access
admin readwrite
# jmxremote.password
admin Passw0rd!
SSLを使用したセキュアなリモートアクセス
SSLを有効にする場合は、次のように設定します。
nohup java \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=9200 \
-Dcom.sun.management.jmxremote.rmi.port=9300 \
-Djava.rmi.server.hostname=192.168.1.1 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=true \
-Dcom.sun.management.jmxremote.registry.ssl=true \
-Djavax.net.ssl.keyStore=/path/to/keystore.jks \
-Djavax.net.ssl.keyStorePassword=Passw0rd! \
-Djavax.net.ssl.trustStore=/path/to/truststore.jks \
-Djavax.net.ssl.trustStorePassword=Passw0rd! \
-jar app.jar > /dev/null 2>&1 &
- javax.net.ssl.keyStore:キーストアファイルのパスを指定します。
- javax.net.ssl.trustStore:トラストストアファイルのパスを指定します。
キーストアとトラストストアの生成
次のシェルスクリプトを使用して、必要な証明書を生成できます。
#!/bin/bash
CLIENT_ALIAS="client"
SERVICE_ALIAS="server"
PASSWORD="Passw0rd!"
HOSTNAME="localhost"
VALIDITY_DAYS=365
keytool -genkeypair -alias $CLIENT_ALIAS -keyalg RSA -validity $VALIDITY_DAYS -keystore "$CLIENT_ALIAS.keystore" -storepass $PASSWORD -keypass $PASSWORD -dname "CN=$HOSTNAME, OU=Dev, O=Company, L=City, S=State, C=Country"
keytool -exportcert -alias $CLIENT_ALIAS -keystore "$CLIENT_ALIAS.keystore" -file "$CLIENT_ALIAS.cer" -storepass $PASSWORD
keytool -importcert -alias $CLIENT_ALIAS -file "$CLIENT_ALIAS.cer" -keystore "$SERVICE_ALIAS.truststore" -storepass $PASSWORD -noprompt
keytool -genkeypair -alias $SERVICE_ALIAS -keyalg RSA -validity $VALIDITY_DAYS -keystore "$SERVICE_ALIAS.keystore" -storepass $PASSWORD -keypass $PASSWORD -dname "CN=$HOSTNAME, OU=Dev, O=Company, L=City, S=State, C=Country"
keytool -exportcert -alias $SERVICE_ALIAS -keystore "$SERVICE_ALIAS.keystore" -file "$SERVICE_ALIAS.cer" -storepass $PASSWORD
keytool -importcert -alias $SERVICE_ALIAS -file "$SERVICE_ALIAS.cer" -keystore "$CLIENT_ALIAS.truststore" -storepass $PASSWORD -noprompt
mkdir -p client server
mv $CLIENT_ALIAS.* client/
mv $SERVICE_ALIAS.* server/
jstatdの設定と起動
jstatdは、RMIベースのサーバーで、JVMの作成や終了、その他の実行状態を監視することができます。
jstatd.policyファイルの作成
jdk9以降の場合、以下のように設定します。
grant codebase "jrt:/jdk.jstatd" {
permission java.security.AllPermission;
};
grant codebase "jrt:/jdk.internal.jvmstat" {
permission java.security.AllPermission;
};
jstatdサービスの開始
jstatd -J-Djava.rmi.server.hostname=192.168.1.1 -J-Djava.security.policy=./jstatd.policy -p 1099 > /dev/null 2>&1 &
これにより、リモートからJVMとその上で実行されているプログラムを監視できるようになります。