我使用jconsole访问我的应用程序mbean,并使用password.properties文件。但是根据sun的规范,这个文件只包含明文格式的密码。 com.sun.management.jmxremote.password.file=<someLocation>/password.properties
现在我想加密密码,并将其用于jconsole的jmx用户身份验证(远程部分中的用户名和密码字段)。我可以使用任何预定义的加密逻辑或我自己的加密算法。
是否有人知道任何这样的拦截,将纯文本密码更改为加密密码,以便jmx框架也知道加密密码?
我的当前密码文件:
guest guest
admin admin
通过加密,它应该看起来像:
guest ENC(RjqpRYbAOwbAfAEDBdHJ7Q4l/GO5IoJidZctNT5oG64=)
admin ENC(psg3EnDei6fVRuqHeLwOqNTgIWkwQTjI2+u2O7MXXWc=)
1条答案
按热度按时间cedebl8k1#
您可以使用配置参数
com.sun.management.jmxremote.login.config
在management.properties文件(请参阅%java\u home%/lib/management/management.properties)中配置要使用的身份验证程序和登录模块。默认值如下:
它读取纯文本密码文件
jmxremote.password
. 自从com.sun.jmx.remote.security.JMXPluggableAuthenticator
可以重新配置为使用任何loginmodule实现,您可以自由选择现有的loginmodule或实现自己的loginmodule,后者使用加密的密码文件。重新实施
FileLoginModule
,你应该看看attemptAuthentication(boolean)
方法,它实际执行身份验证,您可能要替换它。实施javax.security.auth.spi.LoginModule
接口并使用给定的callbackhandler(您将从init()方法获得它)请求用户名和密码。加密/散列收到的密码,并将其与从加密密码文件中读取的密码进行比较。伪代码:但是,由于这已经是服务器端,如果您不通过ssl强制使用jmx,密码仍将以纯文本形式传输。因此,要么强制使用ssl,要么使用另一种传输协议机制,在通过有线传输凭证之前对凭证进行编码。
总之,依赖jaas提供的现有身份验证机制可能要好得多。例如,如果您在本地windows环境中运行,则可以轻松地使用
NTLoginModule
用于自动登录。但它只在本地机器上工作。创建文件c:/temp/mysecurity.cfg:
接下来,配置jmxremote.access文件以包含要授予对jmx服务器访问权限的用户名或角色:
(我建议启用调试模式,直到它工作为止。当用户尝试登录时,您将看到所有用户名、域名和组名)为服务器设置以下jvm参数:
启动应用程序并尝试使用jconsole或visualvm进行连接。
注意jconsole,您将需要指定用户名和密码,尽管它不会被使用。任何密码和用户名都可以。原因是jconsole将尝试使用空用户名和空密码进行身份验证,这将被显式阻止。当用户没有输入用户名和密码时,visualvm使用空字符串作为用户名和密码做得更好。
另外请注意,远程连接时ntloginmodule不起作用,我认为您必须使用更复杂的登录模块,但sun已经提供了足够的模块:
com.sun.security.auth.module.krb5loginmodule:使用kerberos协议对用户进行身份验证
com.sun.security.auth.module.ldaploginmodule:(java 6中的新功能):通过指定技术连接用户来对ldap服务器执行身份验证
com.sun.security.auth.module.jndiloginmodule:对jndi上下文中注册的ldap服务器执行身份验证
com.sun.security.auth.module.keystoreloginmodule:使用java密钥库对用户进行身份验证。支持pin或智能卡身份验证。
您需要看看ldaploginmodule