Подтвердить что ты не робот

Обход требования JConsole для имени пользователя/пароля - при использовании пользовательского модуля входа Jaas с JMX для обработки авторизации и аутентификации

Я использую JConsole для доступа к запущенному MBean.

MBean использует пользовательский модуль регистрации Jaas и запускается со следующей командой:

java -classpath UserLGUGroupHandlingApplication.jar;MBeanSecure.jar 
-com.sun.management.jmxremote.login.config=management.properties 
-Djava.security.auth.login.config=./sample_jaas.config 
com.test.running.RunningImplementation

С файлом management.properties выглядит так:

com.sun.management.jmxremote.access.file=jmxremote.access
com.sun.management.jmxremote=true
com.sun.management.jmxremote.authenticate=true
com.sun.management.jmxremote.port=1234
com.sun.management.jmxremote.login.config=Sample
com.sun.management.jmxremote.ssl=false
com.sun.management.jmxremote.ssl.need.client.auth=false

и sample_jaas.config:

Sample {
   test.module.AETTLoginModule required debug=true;
};

а затем пользователь получит доступ к этим запущенным процессам, выполнив вход в JConsole из командной строки.

jconsole -debug //or just jconsole

Пользователь выбирает "подключиться удаленно", с RemoteProcess "localhost: 1234"

Модуль login обрабатывает проверку и настройку пользователей на основе пользователя, который в настоящее время входит в систему Windows, который используется для запроса отдельной логики авторизации для определения уровня доступа.

Что я хочу:

  • Пользователь вводит jconsole в cmd
  • Откроется окно jconsole.
  • Пользователь вводит адрес процесса, например. "Локальный: 1234"
  • Пользователь не вводит имя пользователя или пароль (поскольку это не требуется, поскольку авторизация обрабатывается пользовательским модулем входа в jaas).
  • Модуль определяет, имеет ли пользователь чтение, чтение или отсутствие доступа.
  • Открывается окно Jconsole для процесса или сбой входа в систему.

Проблема:

Чтобы получить доступ к процессу jmx в окне jconsole, я должен ввести фиктивное имя пользователя и пароль, например. U: a, P: a, в противном случае я получаю следующую ошибку:

java.lang.SecurityException: Authentication failed! Credentials required
    at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticationFailure(JMXPluggableAuthenticator.java:193)
    at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticate(JMXPluggableAuthenticator.java:145)
    at sun.management.jmxremote.ConnectorBootstrap$AccessFileCheckerAuthenticator.authenticate(ConnectorBootstrap.java:201)
    at javax.management.remote.rmi.RMIServerImpl.doNewClient(RMIServerImpl.java:213)
    at javax.management.remote.rmi.RMIServerImpl.newClient(RMIServerImpl.java:180)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:662)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
    at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source)
    at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2327)
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:277)
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:225)
    at sun.tools.jconsole.ProxyClient.tryConnect(ProxyClient.java:334)
    at sun.tools.jconsole.ProxyClient.connect(ProxyClient.java:296)
    at sun.tools.jconsole.VMPanel$2.run(VMPanel.java:280)

Вопрос

Для запуска модуля регистрации Jaas мне нужен следующий набор:

-Dcom.sun.management.jmxremote.authenticate=true

Но это также создает условие в JConsole, где поля поля userername и passowrd должны быть открыты в поле.

Если для этого параметра установлено значение false, модуль регистрации никогда не вызывается.

Можно ли расширить функциональность Jconsole для конкретного экземпляра, применить настройку конфигурации или включить модуль входа в jaas без необходимости устанавливать:

-Dcom.sun.management.jmxremote.authenticate=true

Чтобы избежать необходимости вводить имя пользователя и пароль в следующих полях, выделенных ниже:

enter image description here

Я ищу решение, подобное описанному здесь. Но без необходимости вводить пользовательские поля или поля пароля.

EDIT: Кроме того, чтобы уточнить, это нужно было бы сделать без изменения клиентской стороны JCONSOLE, поэтому, используя только изменения и настройки на стороне сервера.

4b9b3361

Ответ 1

Пройдите эту ссылку . Особенно смотрите в случае 3, это может вам помочь.

***** больше обновлений после более подробных разъяснений по заданному вопросу *****************
Что в основном вы пытаетесь достичь - это защита от обхода (JAAS) для конкретного клиентского соединения, которое JCONSOLE в вашем случае.... Я бы предложил либо: -  1) У вас есть два порта для JMX-сервера: безопасный и небезопасный... используйте незащищенный порт для JCONSOLE, или
                                                                             2) в случае, если вы пишете свой собственный JAAS-модуль, попробуйте выполнить код, чтобы пропустить соединение для конкретного клиента в методе login() - я не уверен, насколько это возможно, потому что, как вы узнаете контекст запрашивающего клиента...

Ответ 2

Попробуйте следующее:

https://blogs.oracle.com/alanb/entry/one_password_to_rule_them предполагая, что следующее не то, что вы хотели (на основе ответа by @ag112)

-J-Djmx.remote.x.password.file =/path/to/file/jmx.password, а затем разместите свое имя пользователя/учетные данные с пробелом.

Ответ 3

Мне нужно добавить еще один ответ из заметок, как я нашел ниже:

Перейдите к экземпляру сервера, который вы хотите подключить удаленно (без идентификатора пользователя/пароля). Перейдите к экземпляру сервера "server.xml". Найдите тег, который вы можете найти ниже

Если это настроено в экземпляре сервера, его можно контролировать без какого-либо доступа:

Используйте приведенную ниже строку подключения для доступа к Jconsole для удаленного процесса.

услуги: JMX: RMI://10.10.10.11: 8082/JNDI/RMI://10.10.10.11: 8081/сервер