加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 08:31:14 所属栏目:Java 来源:网络整理
导读:我正在使用JConsole访问我的应用程序MBean,并使用password.properties文件.但根据Sun的规范,此文件仅包含明文格式的密码. com.sun.management.jmxremote.password.file = LT; someLocation /password.properties 现在我想加密密码并将其用于JConsole的JMX用
我正在使用JConsole访问我的应用程序MBean,并使用password.properties文件.但根据Sun的规范,此文件仅包含明文格式的密码.

com.sun.management.jmxremote.password.file = LT; someLocation> /password.properties

现在我想加密密码并将其用于JConsole的JMX用户身份验证(Remote部分中的用户名和密码字段).我可以使用任何预定义的加密逻辑或我自己的加密算法.

有没有人知道任何这样的拦截将明文密码更改为加密密码,以便JMX Framework也知道加密密码?

我当前的密码文件:

guest  guest
admin  admin

使用加密它应该看起来像:

guest  ENC(RjqpRYbAOwbAfAEDBdHJ7Q4l/GO5IoJidZctNT5oG64=)
admin  ENC(psg3EnDei6fVRuqHeLwOqNTgIWkwQTjI2+u2O7MXXWc=)

解决方法

您可以使用management.properties文件中的配置参数com.sun.management.jmxremote.login.config(请参阅%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或实现自己的
它使用加密的密码文件.

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

public class EncryptedFileLoginModule implements LoginModule {

@Override
public void initialize(Subject subject,CallbackHandler callbackHandler,Map<String,?> sharedState,?> 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,password,tmpPassword.length);
        ((PasswordCallback) callbacks[1]).clearPassword();
}

但是,由于这已经是服务器端,如果您不强制执行,密码仍将以纯文本形式传输
JMX over SSL.因此,要么强制执行SSL,要么使用其他传输协议机制来编码凭证
通过电线传输它们.

总而言之,依靠JAAS提供的现有身份验证机制可能要好得多.例如,如果
如果您在本地Windows环境中运行,则可以轻松使用NTLoginModule进行自动登录.但它只适用于本地机器.

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

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

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

monitorRole readonly
controlRole 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将尝试使用null username和null password进行身份验证,这是明确阻止的.
当用户没有输入用户名和密码时,VisualVM通过使用空字符串做得更好.

另请注意,远程连接时NTLoginModule不起作用,我认为你必须使用更复杂的登录模块,
但是Sun已经提供了足够的内容:

> com.sun.security.auth.module.Krb5LoginModule:使用Kerberos协议对用户进行身份验证
> com.sun.security.auth.module.LdapLoginModule

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读