如何将对JMX的访问限制为仅限于某些IP地址



我不想每次都麻烦SSL和密码,但仍然不希望我的程序的JMX功能在局域网上被其他人访问。

我这样填充了我的~/.java.policy

grant principal javax.management.remote.JMXPrincipal "*" {
permission java.net.SocketPermission "127.0.0.1", "accept";
permission java.net.SocketPermission "my.lan.ip.addr", "accept";
permission java.net.SocketPermission "another.lan.ip.addr", "accept";
permission java.net.SocketPermission "*", "resolve";
}

不幸的是,这似乎没有效果——当程序启动时使用:

  • -Djava.security.manager
  • -Dcom.sun.management.jmxremote.ssl=false
  • -Dcom.sun.management.jmxremote.authenticate=false
  • -Dcom.sun.management.jmxremote
  • -Dcom.sun.management.jmxremote.port=1234

其JMX功能仍然可以从的任何地方访问,而不仅仅是从列出的少数IP访问。

如何正确操作?非常感谢。

我认为这是不可能的。

JMXPrincipal,例如OpenJDK JMX类的源代码显示您总是需要用户/角色。通配符并不意味着您不需要用户/身份验证。此外,所有其他类(在JMX包中(都不会实例化使用java.net.SocketPermission类的Socket。javax.management.remote.rmi.RMIConnectorServerextends JMXConnectorServer的唯一类,并且在读取VM命令行参数之后被实例化,它通过LoaderHandler使用SocketPermission。此外,看看OpenJDK中的策略示例,您可以将JMX访问权限限制为用户/角色,也可以通过permission java.net.SocketPermission限制JVM的一般访问权限

一天后更新

经过思考,也许仅使用CCD_ 12可能会起作用。如果查看代码,可以指定端口范围。不幸的是,无法指定带有掩码的网络地址,但您通常可以允许所有IP访问除JMX端口之外的所有端口,然后为您的IP添加权限。这也要求您使用启动java进程

-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.rmi.port=9010

然后许可看起来像这个

grant {
permission java.net.SocketPermission "*:1-9009", "listen,resolve,connect,accept";
permission java.net.SocketPermission "*:9011-65535", "listen,resolve,connect,accept";
permission java.net.SocketPermission "127.0.0.1:9010", "accept";
permission java.net.SocketPermission "my.lan.ip.addr:9010", "accept";
permission java.net.SocketPermission "another.lan.ip.addr:9010", "accept";
}

最新更新