Payara のセキュア管理における JMX 監視 (ja)

この記事は Java EE Advent Calendar 2017 の 4 日目です。昨日分は @koduki さんの「Java EE Security APIが街にやってきた!」です。早速の Java EE 8 新機能紹介ですよ!

今回は定番である JMX のちょっとした補足です。昨年の Payara Advent Calendar 2016 で上妻さん @n_agetsu が「PayaraのJMX Monitoring Service」という秀逸な記事を寄稿してくださいました。1 年たった今でも役立つ内容なので、Payara をご利用の方はぜひご一読ください。

さて、上妻さんの記事には触れられていませんが、Payara の JMX にはいくつか特徴があります。

  • 既定で JMX ポート 8686 が有効です。さらに管理コンソールを使えばチェックボックス 1 つで有効/無効を制御できます (asadmin でもコマンド 1 つです)。
  • JMX と Java EE Management (JSR 77) を包含した AMX (Application Management Extension) を経由することで、Flashlight Framework の Tree Node API でアクセスできるすべての監視プローブを MBean から参照できます。
    ※既定では AMX は無効です。忘れないうちに AMX を有効にしておきましょう。
  • Flashlight Framework のプローブには、ロギングレベルを OFF | LOW | HIGH の 3 段階で制御できます。既定ではすべて OFF です。レベルを HIGH に設定するとそのプローブの情報が監視できるようになります。パフォーマンスを気にしないのであればすべて HIGH に設定すればよいでしょう。
    ※ロギングレベル LOW は形だけ用意されていますが、実装されていない (OFF か HIGH と同じ) という疑惑があります。トラブル回避のために使用しないようにしてください。
  • セキュア管理を有効にすると、標準の JMX ポートでの通信が SSL/TLS で暗号化されます。

1 点、とても重要ですのでもう一度言います。Payara のセキュア管理を有効にすると、標準の JMX ポート (8686) での通信が SSL/TLS で暗号化されます。これが意味することは、そのままでは JConsole、VisualVM、Java Mission Control 等からリモート接続できないということです。回避策はいくつかあります。

(1) セキュア管理を使用せず SSH でトンネリングする

趣旨とずれているような方法ですが、たぶん有効です。管理コンソールのポート 4848 と JMX のポート 8686、(必要であればアプリケーションのポート 8080 / 8181 も) を SSH でトンネリングすれば、そもそもセキュア管理を使用せずに済むはずです。私は SSH にそれほど詳しくないのでこの方法は採りませんが。

(2) 監視ツール側も SSL/TLS で通信するように設定する

Payara が推奨している最も無難な方法です (ソースは失念しましたが、Payara Blog かドキュメントのどこかに軽く触れられていたような気がします)。例えば、VisualVM (NetBeans の JMX 監視機能も含む) を使用する場合、Payara の keystore を VisualVM で共有するとこれが可能になります。監視ツールによっては Java の keystore ではなく一般的な電子証明書を使用しますが、その場合は Payara の keystore から証明書をエクスポートして使用してください。

(3) Payara 側で標準でない JMX ポートを追加する

監視ツールによっては JMX over SSL/TLS に対応できないものがあります。その場合は、Payara 側で SSL/TLS を使わない JMX ポートを追加すると接続できます。参照する MBean は標準 JMX ポートを使用した場合と同じですので、その点はご安心ください。Payara の JVM オプションに以下を追加して、インスタンスを再起動してください。

-Djava.rmi.server.hostname=hostname
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=28888
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.ssl.need.client.auth=false

この設定ではポート 28888 で JMX リモート接続が可能になります。

Tomcat ではこの方法で JMX を有効にするため、裏技というほどのものではありません。単に Undocumented なだけです。

明日も昨年の Payara Advent Calendar 2016 に関連して。Payara の Notification Service がこの 1 年で大きく進化しました。そのさわりをご紹介する予定です。