Dev*_*ani 6 java authentication authorization jmx kerberos
我有我的JMX服务器,它注册从本地文件读取的bean,并根据需要将它们提供给其他JMX客户端.可以使用"jconsole"或在Tomcat容器下运行的Java应用程序访问服务器.
我想要的是添加身份验证,以防止"未知"身份访问JMX服务器.为此,我使用以下JVM选项添加了Kerberos authentication @ server
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=5555
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=false
-Djava.security.auth.login.config=./conf/jaas.conf
-Djava.security.krb5.conf=./conf/krb5.conf
-Dcom.sun.management.jmxremote.login.config=MyKrbAuth
-Ddynamic.mbean.store=./conf/mbeans
-Djava.net.preferIPv4Stack=true
Run Code Online (Sandbox Code Playgroud)
我的jaas.conf看起来像这样>>
MyKrbAuth {
com.sun.security.auth.module.Krb5LoginModule required debug=true debugNative=true;
};
Run Code Online (Sandbox Code Playgroud)
当我使用上面的配置启动我的JMX服务器并尝试使用"jconsole"连接它时,我在客户端获得以下异常并且连接失败>>
Cipher: Crypto Permission check failed
Cipher: granted: (CryptoPermission * 128)
Cipher: requesting: (CryptoPermission AES 256)
Run Code Online (Sandbox Code Playgroud)
但在服务器身份验证似乎是成功>>
[java] [STARTED] Mbean Server
[java] Debug is true storeKey false useTicketCache false useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false
[java] [Krb5LoginModule] user entered username: username
[java]
[java] Acquire TGT using AS Exchange
[java] principal is user@localhost.com
[java] EncryptionKey: keyType=3 keyBytes (hex dump)=0000: FD 46 7C 02 19 9B 34 E9
[java] EncryptionKey: keyType=1 keyBytes (hex dump)=0000: FD 46 7C 02 19 9B 34 E9
[java] EncryptionKey: keyType=23 keyBytes (hex dump)=0000: FE 6D 82 01 8A D7 AB 60 98
[java] EncryptionKey: keyType=16 keyBytes (hex dump)=0000: 89 02 31 5D F7 5B 3E 89 BC F7 8A 01 A1 80 C7
[java] EncryptionKey: keyType=17 keyBytes (hex dump)=0000: A5 67 71 17 F6 57 A9 26 01 09 B1 EB 75 46 6C
[java]
[java] Commit Succeeded
[java]
Run Code Online (Sandbox Code Playgroud)
从上面看来客户端无法解码响应(这是AES256加密)..如何解决?
设法解决了上述问题。以下是在 JMX 客户端/服务器上引入 Kerberos 身份验证/授权的步骤
要启用 Kerberos @ JMX 服务器,
使用以下一组参数启动服务器=>
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=<port_no>
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=false
-Djava.security.auth.login.config=<locatin_of_jaas.conf>
-Djava.security.krb5.conf=<locatin_of_krb5.conf>
-Dcom.sun.management.jmxremote.login.config=<name_of_login_config_to_be_used>
-Djava.net.preferIPv4Stack=true
Run Code Online (Sandbox Code Playgroud)在 $JAVA_HOME/jre/lib/management/jmxremote.access 中添加访问条目。一旦用户通过身份验证,将基于 jmxremote.access 提供对 JMX 服务器的读/写访问权限。可以在服务器启动时使用以下 jvm arg 提供 .access 文件的位置
-Dcom.sun.management.jmxremote.access.file=<acees_control_file>
Run Code Online (Sandbox Code Playgroud)启用 Kerberos @ JMX 客户端 (jconsole)
使用调试选项启动 jconsole 并连接到服务器
jconsole -J-Djava.security.debug=all
Run Code Online (Sandbox Code Playgroud)如果请求的加密是 AES256,则下载无限强度的加密策略 jar 文件,提取策略文件并将其放置在 $JAVA_HOME/jre/lib/security/ 中。[感谢马克指出政策包容性。]
上面应该使 Kerberos 在 JMX 客户端和 JMX 服务器端都工作
如果您仍然遇到连接问题,那么您可以使用logging.properties file =>为jconsole启用详细调试
handlers = java.util.logging.ConsoleHandler
.level = INFO
java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
// Use FINER or FINEST for javax.management.remote.level - FINEST is very verbose...
javax.management.level = FINEST
javax.management.remote.level = FINER
Run Code Online (Sandbox Code Playgroud)
并使用启动 jconsole
jconsole -J-Djava.util.logging.config.file=<location_of_logging.properties>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2572 次 |
| 最近记录: |