3.2. JMX 接続を使用したアプリケーションの設定
Cryostat がターゲット Java アプリケーションを検出して通信できるようにする場合、リモート Java Management Extensions (JMX) 接続を許可するようにアプリケーションを設定できます。
前提条件
- Cryostat Web コンソールにログインしている。
- プロジェクトに Cryostat インスタンスを作成している。
手順
リモート JMX 接続を有効にするには、次の手順を実行します。
アプリケーションで、次の Java システムプロパティーを定義します。
-Dcom.sun.management.jmxremote.port=<port_num>注記ターゲットアプリケーションを再構築せずに
-Dcom.sun.management.jmxremote.port=<port_num>プロパティーを追加するには、アプリケーションでJAVA_OPTS_APPEND環境変数を設定します。JAVA_OPTS_APPENDは、Red Hat Universal Base Images (UBI) のみが使用する環境変数です。Red Hat UBI を使用してアプリケーションイメージをビルドする場合は、ビルド時にアプリケーション Docker ファイルで
JAVA_OPTS_APPEND変数を設定するか、ランタイム時に次のコマンドを実行して、JAVA_OPTS_APPEND 変数を設定します。oc set env deployment <name> JAVA_OPTS_APPEND="..."Red Hat UBI を使用してアプリケーションイメージをビルドしない場合は、ベースイメージのドキュメントを参照し、ビルド時またはランタイム時に Java システムプロパティーを追加する方法を確認してください。
アプリケーションへのトラフィックを許可して、アプリケーションがリモート JMX 接続をリッスンするように指定します。Red Hat OpenShift Service を使用し、そのリモート JMX ポートに次の値を指定します。
service.yamlの例apiVersion: v1 kind: Service ... spec: ports: - name: "jfr-jmx" port: 9091 targetPort: 9091 ...
リモート JMX 接続をセキュリティー保護します。
アプリケーションで、リモート JMX 接続の認証と SSL/TLS を有効にして設定します。
-Dcom.sun.management.jmxremote.port=<port_num> # enable JMX authentication -Dcom.sun.management.jmxremote.authenticate=true # define users for JMX auth -Dcom.sun.management.jmxremote.password.file=</path/to/jmxremote.password> # set permissions for JMX users -Dcom.sun.management.jmxremote.access.file=</path/to/jmxremote.access> # enable JMX SSL -Dcom.sun.management.jmxremote.ssl=true # enable JMX registry SSL -Dcom.sun.management.jmxremote.registry.ssl=true # set your SSL keystore -Djavax.net.ssl.keyStore=</path/to/keystore> # set your SSL keystore password -Djavax.net.ssl.keyStorePassword=<password>アプリケーションの TLS 証明書を信頼するように Cryostat を設定します。Cryostat アプリケーションと同じ namespace にアプリケーションのシークレットを作成し、そのシークレットを参照するように Cryostat を設定します。証明書のシークレットを作成するには、次のコマンドを実行します。
oc create secret generic myapp-cert --from-file=tls.crt=/path/to/cert.pem注記証明書は
.pemファイル形式である必要があります。- Cryostat インスタンスの作成時に、信頼できる TLS 証明書のリストにシークレットを追加します。詳細は、TLS 証明書の設定 を参照してください。
パスワード認証以外の方法で Cryostat がアプリケーションに接続していることをアプリケーションが検証できるようにするために、TLS クライアント認証を有効にします。
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true -Djavax.net.ssl.trustStore=</path/to/truststore> -Djavax.net.ssl.trustStorePassword=<password>注記TLS クライアント認証には、Red Hat OpenShift の cert-manager Operator が必要です。
リモート JMX 接続に TLS クライアント認証を使用する場合、アプリケーションのトラストストアに Cryostat 証明書が含まれている必要があります。Cryostat Operator の cert-manager の統合により、Cryostat デプロイメント用の自己署名証明書が作成されます。この証明書は
<cryostat>-tlsシークレットにあります。<cryostat> は作成した Cryostat インスタンスの名前です。注記cert-manager Operator は、このシークレットに Java キーストアトラストストアも配置します。
このトラストストアをアプリケーションデプロイメントにマウントするには、次のコマンドを実行します。"<myapp>" はアプリケーションデプロイメントの名前に置き換え、"<cryostat>" は Cryostat インスタンスの名前に置き換えてください。
oc set volumes deploy <myapp> --add --name=truststore \ --secret-name=<cryostat>-tls --sub-path=truststore.p12 \ --mount-path=/var/run/secrets/<myapp>/truststore.p12Cryostat Operator はトラストストアのパスワードを生成します。このパスワードは、
<cryostat>-keystoreシークレットにあります。これをアプリケーションのデプロイメントで環境変数としてマウントするには、次のコマンドを実行します。oc set env deploy <myapp> --from='secret/<cryostat>-keystore'コンテナーの Java 引数を設定します。以下のコマンドを実行します。
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true -Djavax.net.ssl.trustStore=/var/run/secrets/<myapp>/truststore.p12 -Djavax.net.ssl.trustStorePassword="$(KEYSTORE_PASS)"警告Cryostat とアプリケーションをテスト環境にデプロイした場合は、JMX または TLS 認証を使用せずにターゲットアプリケーションを設定することもできます。これは、次の Java システムプロパティーのセットを使用して行うことができますが、この設定はセキュアではないため、推奨されません。
-Dcom.sun.management.jmxremote.port=<port_num> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false