java - enable - jconsole tomcat
Omisión del requisito de JConsole para el nombre de usuario/contraseña: cuando se utiliza un módulo de inicio de sesión personalizado de Jaas con JMX para manejar la autorización y la autenticación (3)
Ir a través de este link . Ver caso 3 especialmente, puede ayudarte.
***** más actualizaciones después de más aclaraciones sobre la pregunta *****************
Básicamente, lo que está tratando de lograr es evitar la seguridad (provista por JAAS) para una conexión de cliente en particular que es JCONSOLE en su caso ... Sugeriría: - 1) Tener dos puertos para el servidor JMX: seguro y no seguro. ... use un puerto no seguro para JCONSOLE, o
2) en caso de que esté escribiendo su propio módulo JAAS personalizado, intente codificar para omitir la conexión para un cliente en particular en el método de inicio de sesión (). No estoy seguro de si esto es posible porque, ¿cómo sabrá el contexto de solicitud del cliente ...
Estoy usando JConsole para acceder a un MBean que se está ejecutando.
El MBean utiliza un módulo de inicio de sesión de Jaas personalizado y se ejecuta con el siguiente comando:
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
Con el archivo management.properties con este aspecto:
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
y el sample_jaas.config:
Sample {
test.module.AETTLoginModule required debug=true;
};
y luego un usuario accederá a estos procesos en ejecución al iniciar sesión a través de JConsole desde la línea de comandos.
jconsole -debug //or just jconsole
El usuario selecciona ''conectar de forma remota'', con RemoteProcess ''localhost: 1234''
El módulo de inicio de sesión maneja la validación del usuario y la configuración de los principales en función del usuario que está conectado actualmente a Windows, que se utiliza para consultar la lógica de autorización independiente para determinar el nivel de acceso.
Lo que quiero que suceda:
- El usuario ingresa jconsole en cmd
- Se abre la ventana jconsole.
- El usuario ingresa la dirección del proceso, por ejemplo, "localhost: 1234"
- El usuario no ingresa el nombre de usuario ni la contraseña (ya que esto no es necesario ya que la autorización es manejada por un módulo de inicio de sesión jaas personalizado).
- El módulo determina si el usuario tiene readwrite, solo lectura o ningún acceso.
- Se abre la ventana de Jconsole para proceso, o falla el inicio de sesión.
La cuestión:
Para acceder al proceso jmx en la ventana jconsole, debo ingresar un nombre de usuario y contraseña falsos, por ejemplo, U: a, P: a, de lo contrario, aparece el siguiente error:
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)
Pregunta
Para que se ejecute el módulo de inicio de sesión de Jaas necesito el siguiente conjunto:
-Dcom.sun.management.jmxremote.authenticate=true
Pero, esto también crea una condición en JConsole donde los campos de nombre de usuario y contraseña deben estar abiertos en el campo.
Si se establece en falso, nunca se llama al módulo de inicio de sesión.
¿Es posible ampliar la funcionalidad de Jconsole para una instancia en particular, aplicar una configuración de configuración o habilitar un módulo de inicio de sesión jaas sin necesidad de configurar:
-Dcom.sun.management.jmxremote.authenticate=true
Para evitar la necesidad de ingresar un nombre de usuario y contraseña en los siguientes campos resaltados a continuación:
Estoy buscando una solución similar a la demostrada here . Pero sin la necesidad de que el usuario ingrese los campos de nombre de usuario o contraseña.
EDITAR: Además, para aclarar, esto debería hacerse sin modificar JCONSOLE del lado del cliente, por lo tanto, simplemente utilizando los cambios y la configuración del lado del servidor.
Prueba esto :
here asumiendo que lo siguiente no es lo que quería (basado en la respuesta de @ ag112)
-J-Djmx.remote.x.password.file = / path / to / file / jmx.password y luego ponga su nombre de usuario / credencial con espacio allí.
Tengo que agregar otra respuesta, de las notas que encontré a continuación:
Navegue a la instancia del servidor que desea conectar de forma remota (sin ID de usuario / contraseña). Navegue por la instancia del servidor ''server.xml''. Busque la etiqueta, que puede encontrar como abajo
Si esto se configura en la instancia del servidor, se puede monitorear sin ningún acceso:
Utilice la siguiente cadena de conexión para acceder a Jconsole para el proceso remoto.
servicio: jmx: rmi: //10.10.10.11: 8082 / jndi / rmi: //10.10.10.11: 8081 / server