栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何加密JConsole密码文件的密码

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何加密JConsole密码文件的密码

您可以使用

com.sun.management.jmxremote.login.config
management.properties文件中的配置参数(请参阅%JAVA_HOME%/
lib / management / management.properties)来配置要使用的Authenticator和LoginModule。

默认值如下:

JMXPluggableAuthenticator {    com.sun.jmx.remote.security.FileLoginModule required;};

读取纯文本密码文件

jmxremote.password
。由于
com.sun.jmx.remote.security.JMXPluggableAuthenticator
可以将其重新配置为使用任何LoginModule实现,因此您可以自由选择现有的LoginModule,也可以自由地使用加密的密码文件来实现自己的LoginModule。

要重新实现

FileLoginModule
,您应该看一下该
attemptAuthentication(boolean)
方法,该方法实际上执行身份验证,并且您可能将要替换它。实现该
javax.security.auth.spi.LoginModule
接口并使用给定的CallbackHandler(您将从init()方法中获取该接口)询问用户名和密码。加密/散列收到的密码,并将其与从加密密码文件读取的密码进行比较。伪代码:

public class EncryptedFileLoginModule implements LoginModule {@Overridepublic void initialize(Subject subject, CallbackHandler callbackHandler,        Map<String, ?> sharedState, Map<String, ?> options) {    this.subject = subject;    this.callbackHandler = callbackHandler;}public boolean login() throws LoginException {    attemptLogin();    if (username == null || password == null) {        throw new LoginException("Either no username or no password specified");    }    MessageDigest instance = MessageDigest.getInstance("SHA-1");    byte[] raw = new String(password).getBytes();    byte[] crypted = instance.digest(raw);    // TODO: Compare to the one stored locally    if (!authenticated) throw new LoginException();    return true;}private void attemptLogin() throws LoginException {    Callback[] callbacks = new Callback[2];    callbacks[0] = new NameCallback("username");    callbacks[1] = new PasswordCallback("password", false);        callbackHandler.handle(callbacks);        username = ((NameCallback) callbacks[0]).getName();        user = new JMXPrincipal(username);        char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword();        password = new char[tmpPassword.length];        System.arraycopy(tmpPassword, 0, password, 0, tmpPassword.length);        ((PasswordCallback) callbacks[1]).clearPassword();}

但是,由于这已经是服务器端,因此如果您不通过SSL强制实施JMX,密码仍然会以纯文本格式传输。因此,可以强制实施SSL或使用另一种传输协议机制来对凭据进行编码,然后再通过有线传输它们。

总而言之,最好依赖JAAS提供的现有身份验证机制。例如,如果您在本地Windows环境中运行,则可以轻松地使用

NTLoginModule
for自动登录。但这仅适用于本地计算机。

创建一个文件c:/temp/mysecurity.cfg:

MyLoginModule { com.sun.security.auth.module.NTLoginModule REQUIRED  debug=true debugNative=true;};

接下来,配置jmxremote.access文件以包含您希望授予对JMX服务器访问权限的用户名或角色:

monitorRole readonlycontrolRole readwrite ...mhaller readonly

(我建议启用调试模式,直到它起作用为止。当用户尝试登录时,您将看到所有用户名,域名和组名。)为服务器设置以下JVM参数:

-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=8686-Dcom.sun.management.jmxremote.authenticate=true-Dcom.sun.management.jmxremote.ssl=true-Djava.net.preferIPv4Stack=true-Djava.security.auth.login.config=c:/temp/mysecurity.cfg-Dcom.sun.management.jmxremote.login.config=MyLoginModule

启动您的应用程序,然后尝试使用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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381746.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号