JMX远程监控原理与安全配置
如何实现对远程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: "*"