Как ограничить доступ к 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-адресов.

Как это правильно делать? Спасибо!

1 ответ

Я думаю, что это невозможно.

JMXPrincipal, исходный код, например, классов JMX OpenJDK, показывает, что вам всегда требуется пользователь/роль, но подстановочный знак не означает, что вам не нужен пользователь/аутентификация. Кроме того, все остальные классы (в пакете JMX) не создают экземпляр Socket, который используетjava.net.SocketPermissionсорт. javax.management.remote.rmi.RMIConnectorServerэто единственный класс, которыйextends JMXConnectorServerи который создается после чтения параметров командной строки виртуальной машины, используетSocketPermission, через LoaderHandler. Также, глядя на примеры политики из OpenJDK, вы можете либо ограничить доступ JMX для пользователя/роли, либо вы можете ограничить общий доступ к JVM черезpermission java.net.SocketPermission

обновление через день

подумав некоторое время об этом, возможно, используя толькоSockePermissionможет сработать. Если вы посмотрите код, вы можете указать диапазоны портов. К сожалению, невозможно указать сетевой адрес с его маской, но в целом вы можете разрешить всем 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";
}
Другие вопросы по тегам