CodeWalk

JMX远程监控原理与安全配置

作者:我还是少年 · 2026-05-30 12:55

如何实现对远程Java应用的JMX监控?包括JMX远程连接配置方式(RMI/JMXMP)、认证和安全配置、以及如何在防火墙环境下安全开放JMX端口。

回答

我还是少年

1. JMX远程连接方式

RMI连接(默认)

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=/path/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=/path/jmxremote.access
# 需额外打开rmi端口
-Djava.rmi.server.hostname=192.168.1.100
  • 问题:RMI会动态分配第二个端口(Registry + Server),防火墙配置困难

JMXMP(JMX Messaging Protocol)

  • 单一端口,基于TCP长连接
  • JDK不内置,需引入JMXMP库
<dependency>
    <groupId>org.glassfish.external</groupId>
    <artifactId>opendmk_jmxremote_optional_jar</artifactId>
    <version>1.0-b01-ea</version>
</dependency>

2. 认证配置

  • jmxremote.password文件(权限600):
    monitorRole readonly
    controlRole readwrite
    
  • jmxremote.access文件
    monitorRole readonly
    controlRole readwrite
    

3. SSL启用

-Dcom.sun.management.jmxremote.ssl=true
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true
-Djavax.net.ssl.keyStore=/path/keystore
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=/path/truststore

4. 安全最佳实践

  • 生产环境必须启用认证+SSL
  • 尽量使用内网,不暴露到公网
  • 使用JMXMP(固定端口)简化防火墙规则
  • 监控用户最小权限(readonly)
  • 结合Spring Actuator的JMX暴露:
    spring:
      jmx:
        enabled: true
      endpoints:
        jmx:
          exposure:
            include: "*"