Как ограничить доступ к 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";
}