2015-05-19 25 views
23

Ich verwende JConsole, um auf eine MBean zuzugreifen, die ausgeführt wird.Umgehung der JConsole-Anforderung für Benutzername/Kennwort - bei Verwendung eines benutzerdefinierten Jaas-Anmeldemoduls mit JMX für Autorisierung und Authentifizierung

Die MBean verwenden eine Login-Modul benutzerdefinierte JAAS und wird mit dem folgenden Befehl:

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 

Mit der management.properties Datei wie folgt aussehen:

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 

und der sample_jaas.config:

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

und dann wird ein Benutzer auf diese laufenden Prozesse zugreifen, indem er sich anmeldet h JConsole über die Befehlszeile.

jconsole -debug //or just jconsole 

Der Benutzer wählt ‚Remote-Verbindung‘ mit RemoteProcess ‚localhost: 1234‘

Die Loginmodule übernimmt die Benutzervalidierung und Einstellung von Principals auf dem Benutzer basiert derzeit in Windows angemeldet, die verwendet wird, Abfrage einer separaten Berechtigungslogik, um die Zugriffsebene zu bestimmen.

Was ich will geschehen:

  1. Benutzer Kraftspender JConsole in cmd
  2. Das jconsole Fenster öffnet sich.
  3. Der Benutzer gibt die Adresse des Prozesses ein, z. "localhost: 1234"
  4. Benutzer nicht Geben Sie einen Benutzernamen oder ein Kennwort ein (da dies nicht erforderlich ist, da die Autorisierung von einem benutzerdefinierten JAAS-Anmeldemodul gehandhabt wird).
  5. Das Modul legt fest, ob der Benutzer schreibgeschützt, schreibgeschützt oder nicht zugreifbar ist.
  6. Das Jconsole-Fenster für den Prozess wird geöffnet, oder die Anmeldung schlägt fehl.

Das Problem:

Um den JMX-Prozess im jconsole Fenster gelange ich muß einen Dummy-Benutzername und das Passwort eingeben, zum Beispiel U: a, P: a, sonst bekomme ich die folgende Fehlermeldung:

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) 

Frage

Für den JAAS Login-Modul Ich brauche den folgenden Satz zu laufen:

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

Aber Dadurch wird auch eine Bedingung in JConsole erstellt, in der die Felder Benutzername und Kennwort im Feld geöffnet sein müssen.

Wenn dies auf false gesetzt ist, wird das Login-Modul nie aufgerufen.

Ist es möglich, die JConsole Funktionalität für eine bestimmte Instanz entweder zu erweitern, eine Konfigurationseinstellung, einzeln oder jaas Login-Modul ermöglichen, ohne zu setzen zu benötigen:

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

Um die Notwendigkeit der Eingabe eines zu verhindern Benutzername und Passwort in den folgenden Bereichen hervorgehoben unten:

enter image description here

ich bin für eine Lösung ähnlich der here demonstriert suchen. Aber ohne dass der Benutzer den Benutzernamen oder das Passwort eingeben muss.

EDIT: Auch, um dies zu klären, müsste dies ohne Änderung der Client-Seite JCONSOLE getan werden, also rein mit serverseitigen Änderungen und Einstellungen.

Antwort

4

Gehen Sie durch diese link. Besonders in Fall 3 kann es Ihnen helfen.

***** Weitere Updates nach mehr Klärung der Frage gefragt *****************
Was Sie im Grunde versuchen zu erreichen ist Bypass (JAAS bereitgestellten) Sicherheit für eine bestimmte Client-Verbindung, die JCONSOLE in Ihrem Fall ist .... Ich würde vorschlagen, entweder: - 1) Haben zwei Ports für JMX-Server: sichere und nicht sichere ... verwenden Sie nicht sichere Port für JCONSOLE oder
2) Falls Sie Ihr eigenes JAAS-Modul schreiben, versuchen Sie, die Verbindung für einen bestimmten Client in der login() -Methode zu überspringen - ich bin mir nicht sicher, ob dies machbar ist, weil Sie den Kontext des anfordernden Clients kennen werden ...

+1

Danke, aber meine Frage speziell ist die jconsole Notwendigkeit für Benutzer zum Ändern Eingabe auf die Anforderungen. Die Fallstudie konzentriert sich auf das JaasLoginModule und den clientseitigen Code. – Loco234

+0

Bitte con; t Link nur Antworten, da Links können brechen. – NathanOliver

+0

Re: die Bearbeitung. Ich bin neugierig, ob es einen einfacheren Ansatz dazu gibt, da die Verwendung eines Jaas Login-Moduls eine ziemlich häufige Anforderung ist. Es wäre merkwürdig, die Eingabe von Benutzer- und Passwortberechtigungen nur über die Felder in Jconsole zu beschränken. Mein erster Gedanke war, auf eine JAAS-Konfigurationsdatei zu zeigen, während ich com.sun.management.jmxremote.authenticate = false setzte. Die Kontextgenerierung wird von einem separaten Skript ausgeführt, das im Anmeldemodul aufgerufen wird. Dadurch wird die Überprüfung der Benutzeranmeldeinformationen effektiv umgangen, da sie auf dem aktuell angemeldeten Benutzer basieren. – Loco234

0

Versuchen Sie Folgendes:

https://blogs.oracle.com/alanb/entry/one_password_to_rule_them unter der Annahme, finden Sie nicht, was Sie (basierend auf Antwort von @ ag112) wollte

-J-Djmx.remote.x.password.file =/path/to/file/jmx.password und dann setzen Ihr Benutzername/Credential mit Leerzeichen dort.

+0

Danke, aber es ist nicht das Einrichten einer Passwortdatei. Stattdessen müssen Benutzername und Passwort in der jconsole-Ansicht eingegeben werden, in der die Authentifizierung vom jaas-Modul übernommen wird. Selbst wenn die Felder voll sind, wird die Eingabe verworfen, da das JAAS-Login-Modul stattdessen die Benutzerdaten verarbeitet. – Loco234

+0

Über den Link können Sie nicht Ihr eigenes Login-Modul angeben? -Dcom.sun.management.jmxremote.login.config = SunConfig -Djava.security.auth.login.config = ldap.config – Optional

+0

Ja, ich bin in der Lage meine eigene Login-Modul angeben, kann aber aktivieren Sie es nur mit der com.sun.management.jmxremote.authenticate = Einstellung wahr. Das Problem ist, dass Jconsole Benutzereingaben in den Feldern Benutzername und Passwort benötigt, auch wenn diese im Anmeldemodul nicht berücksichtigt werden. – Loco234

0

muss ich eine andere Antwort hinzufügen, von den Noten wie ich weiter unten gefunden:

Navigieren Sie zu dem Serverinstanz Sie remote Verbindung herstellen möchten (ohne Benutzer-ID/Passwort). Navigieren Sie zur Serverinstanz 'server.xml'. Geben Sie für Tag, können Sie gefunden wie unten

Wenn dies in der Serverinstanz konfiguriert ist, kann es ohne Zugang überwacht werden:

Verwenden Sie die folgenden Verbindungszeichenfolge die JConsole für den Remote-Zugriff auf verarbeiten.

Service: JMX: rmi: //10.10.10.11: 8082/jndi/rmi: //10.10.10.11: 8081/Server