绕过对用户名/密码的 JConsole 要求 - 当使用带有 JMX 的 Jaas 自定义登录模块来处理授权和身份验证时
Posted
技术标签:
【中文标题】绕过对用户名/密码的 JConsole 要求 - 当使用带有 JMX 的 Jaas 自定义登录模块来处理授权和身份验证时【英文标题】:Bypassing JConsole requirement for username/password - when using a Jaas custom login module with JMX to handle authorization and authentication 【发布时间】:2015-07-31 11:00:31 【问题描述】:我正在使用 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'
登录模块根据当前登录到Windows的用户来处理用户验证和主体设置,用于查询单独的授权逻辑以确定访问级别。
我想要发生的事情:
-
用户在cmd中输入jconsole
jconsole 窗口打开。
用户输入进程地址,例如“本地主机:1234”
用户没有输入用户名或密码(因为这不是必需的,因为授权由自定义 jaas 登录模块处理)。
模块确定用户是否具有读写权限、只读权限或无权限。
进程的 Jconsole 窗口打开,或登录失败。
问题:
要在 jconsole 窗口中访问 jmx 进程,我必须输入一个虚拟用户名和密码,例如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 中创建一个条件,其中用户名和密码字段必须在字段中打开。
如果设置为 false,则永远不会调用登录模块。
是否可以为特定实例扩展 Jconsole 功能、应用配置设置或启用 jaas 登录模块而无需设置:
-Dcom.sun.management.jmxremote.authenticate=true
为了避免在下面突出显示的以下字段中输入用户名和密码的必要性:
我正在寻找类似于here 演示的解决方案。但无需用户输入用户名或密码字段。
编辑:另外,澄清一下,这需要在不修改客户端 JCONSOLE 的情况下完成,因此纯粹使用服务器端更改和设置。
【问题讨论】:
【参考方案1】:通过这个link。尤其是案例3,它可能会对你有所帮助。
***** 在对所提出的问题进行更多澄清后进行更多更新********************** 基本上,您要实现的是绕过(提供 JAAS)对特定客户端连接的安全性,在您的情况下是 JCONSOLE ....我建议:- 1) 为 JMX 服务器提供两个端口:安全和非安全...为 JCONSOLE 使用非安全端口,或者 2)如果您正在编写自己的自定义 JAAS 模块,请尝试编写代码以在 login() 方法中跳过特定客户端的连接 - 我不确定这是否可行,因为您将如何知道请求客户端的上下文...
【讨论】:
谢谢,不过,我的问题是专门针对修改 jconsole 对用户输入需求的需求。案例研究侧重于 JaasLoginModule 和客户端代码。 请继续;不要只发布链接答案,因为链接可能会中断。 回复:编辑。我很好奇是否有更直接的方法来解决这个问题,因为使用 Jaas 登录模块是很常见的要求。仅使用 Jconsole 中的字段限制用户和密码凭据输入似乎很奇怪。我的直接想法是在设置 com.sun.management.jmxremote.authenticate=false 时指向一个 jaas 配置文件。上下文生成由登录模块中调用的单独脚本处理,有效地绕过了检查用户凭据的需要,因为它们将基于当前登录的用户。【参考方案2】:试试这个:
https://blogs.oracle.com/alanb/entry/one_password_to_rule_them 假设以下不是您想要的(基于@ag112 的回答)
-J-Djmx.remote.x.password.file=/path/to/file/jmx.password 然后将您的用户名/凭据与空格放在那里。
【讨论】:
谢谢,但这不是设置密码文件。相反,需要在 jconsole 视图中输入用户名和密码详细信息,其中身份验证由 jaas 模块处理。因此,即使字段已满,输入也会被丢弃,因为 jaas 登录模块会处理用户数据。 从链接中,你不能指定你自己的登录模块吗? -Dcom.sun.management.jmxremote.login.config=SunConfig -Djava.security.auth.login.config=ldap.config 是的,我可以指定我自己的登录模块,但只能使用 com.sun.management.jmxremote.authenticate=true 设置激活它。问题是,Jconsole 要求用户在用户名和密码字段顶部输入,即使登录模块中没有查看这些内容。 只是为了确认。当 com.sun.management.jmxremote.authenticate=true 时,添加密码文件不会改变在用户名和密码字段中输入值的必要性。【参考方案3】:我必须从下面的注释中添加另一个答案:
导航到您要远程连接的服务器实例(无需用户名/密码)。导航服务器实例“server.xml”。查找标签,您可能会发现如下所示
如果在服务器实例中配置了这个,可以在没有任何访问权限的情况下进行监控:
使用以下连接字符串访问远程进程的 Jconsole。
服务:jmx:rmi://10.10.10.11:8082/jndi/rmi://10.10.10.11:8081/server
【讨论】:
以上是关于绕过对用户名/密码的 JConsole 要求 - 当使用带有 JMX 的 Jaas 自定义登录模块来处理授权和身份验证时的主要内容,如果未能解决你的问题,请参考以下文章