gpt4 book ai didi

java - 如何为 JConsole 的密码文件加密密码

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:36:25 26 4
gpt4 key购买 nike

我正在使用 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=)

最佳答案

您可以使用 management.properties 文件(参见 %JAVA_HOME%/lib/management/management.properties)中的配置参数 com.sun.management.jmxremote.login.config 来配置哪个要使用的身份 validator 和登录模块。

默认如下:

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 接口(interface)并使用给定的 CallbackHandler(您将从 init() 方法中获取它)请求用户名和密码。加密/散列收到的密码,并将其与从加密密码文件中读取的密码进行比较。伪代码:

public class EncryptedFileLoginModule implements LoginModule {

@Override
public 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();
}

但是,由于这已经是服务器端,如果您不强制执行,密码 afaik 仍将以纯文本形式传输通过 SSL 的 JMX。因此,要么强制执行 SSL,要么使用另一种传输协议(protocol)机制,该机制在之前对凭证进​​行编码通过电线传输它们。

总而言之,依赖 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

(我建议启用 Debug模式直到它起作用。当用户尝试登录时,您将看到所有的用户名、域名和组名)为您的服务器设置以下 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 协议(protocol)验证用户
  • com.sun.security.auth.module.LdapLoginModule:(Java 6 中的新功能):通过指定技术连接用户对 LDAP 服务器执行身份验证
  • com.sun.security.auth.module.JndiLoginModule:对在 JNDI 上下文中注册的 LDAP 服务器执行身份验证
  • com.sun.security.auth.module.KeyStoreLoginModule:使用 Java Keystore 验证用户。支持 PIN 或智能卡身份验证。

你会想看看 LdapLoginModule

关于java - 如何为 JConsole 的密码文件加密密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1676513/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com