当前位置: 首页 > 面试题库 >

在Java 6上运行的JMX客户端/服务器上支持Kerberos身份验证/授权

通京
2023-03-14
问题内容

我有我的JMX服务器,该服务器注册从本地文件读取的bean,并根据需要将其提供给其他JMX客户端。可以使用“
jconsole”或通过在Tomcat容器下运行的Java应用程序访问服务器。

我想要的是添加身份验证,以防止“未知”身份访问JMX Server。为此,我使用以下JVM选项添加了Kerberos身份验证@服务器

-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

我的jaas.conf看起来像这样>>

MyKrbAuth {
com.sun.security.auth.module.Krb5LoginModule required debug=true debugNative=true;
};

当我以上述配置启动我的JMX服务器并尝试使用“ jconsole”连接它时,在客户端出现以下异常,连接失败>>

Cipher: Crypto Permission check failed
Cipher: granted: (CryptoPermission * 128)
Cipher: requesting: (CryptoPermission AES 256)

但是在服务器身份验证看来是成功的>>

[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]

从上面看来,客户端无法解码响应(已加密AES256)。


问题答案:

解决了上述问题。以下是在您的JMX客户端/服务器上引入Kerberos身份验证/授权的步骤

要启用Kerberos @ JMX服务器,

  1. 使用以下一组args启动服务器=>

    -Dcom.sun.management.jmxremote=true
    

    -Dcom.sun.management.jmxremote.port=
    -Dcom.sun.management.jmxremote.authenticate=true
    -Dcom.sun.management.jmxremote.ssl=false
    -Djava.security.auth.login.config=
    -Djava.security.krb5.conf=
    -Dcom.sun.management.jmxremote.login.config=
    -Djava.net.preferIPv4Stack=true


  2. 在$ JAVA_HOME / jre / lib / management / jmxremote.access中添加访问条目。一旦用户通过身份验证,将基于jmxremote.access提供对JMX服务器的读/写访问权限。可以在服务器启动时使用以下jvm arg提供.access文件的位置

    -Dcom.sun.management.jmxremote.access.file=<acees_control_file>
    

启用Kerberos @ JMX客户端(jconsole)

  1. 使用调试选项启动jconsole并连接到服务器

    jconsole -J-Djava.security.debug=all
    
  2. 如果请求的加密是AES256,则下载无限强度的加密策略jar文件,提取策略文件并将其放在$ JAVA_HOME / jre / lib / security /中。[感谢Mark指出了政策的包容性。]

上面的内容应该使Kerberos在JMX客户端和JMX服务器端均可工作

如果仍然遇到连接问题,则可以使用logging.properties文件=>为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

并使用以下命令启动jconsole

jconsole -J-Djava.util.logging.config.file=<location_of_logging.properties>


 类似资料:
  • 任务:将Kerberos active directory身份验证添加到不安全的报告和数据操作桌面应用程序。此应用程序是。。。 用Stackless Python 2.7编写 使用Twisted进行客户端-服务器交互 客户端编译为exe并在Windows上运行 服务器在Linux(红帽)上运行 目前,我们从用户帐户中提取Windows网络ID(登录名)并传递到服务器,服务器会查找用户配置为具有的权

  • 应如何管理它们? 一些更具体的问题: 根据定义,本机应用程序(实际上是公共客户端)不能安全地存储其凭据(client_id+secret)。是未注册的客户吗?如果我不能使用秘密来验证/验证它,我还应该做什么? 客户端注册≠endpoint注册:第一个是关于注册客户端凭据();第二个关于注册客户端重定向endpoint。重定向endpoint注册是否足以授予客户端的真实性? 客户端凭据授予是否使用相

  • 它总是导致带有错误消息的catch块 登录失败:未知的用户名或错误的密码。失败:未知的用户名或错误的密码。 我确信给定的密码是正确的。 如何使用给定的密码验证用户名?

  • 想得到一些关于设置简单的双向ApacheSSL的建议。 我们使用openSSL创建了一个密钥文件和csr请求。然后,我们将其提交给CA,并收到一个crt文件与CA的crt文件一起返回。 我们已经配置了ApacheHTTP。conf文件,并在加载mod_ssl模块后添加了以下参数。 开启SSLEngine SSLCACertificateFile/local/fast/fcHome/deployme

  • 我正在尝试使用ServerEvents设置servicestack。我已经为ServerEventsFeature添加了插件。我正在使用Javascript服务器事件客户端,我尝试了一个简单的示例,在用户经过身份验证后在客户端上执行此操作。 在apphost文件上: 要向我正在呼叫的客户端发送事件,请执行以下操作: 我成功地在客户端上的show通知功能上接收到它。 然而,订阅服务仍然存在。disp

  • 问题内容: 我正在开发一个使用Jersey框架的REST应用程序。我想知道如何控制用户身份验证。我搜索了很多地方,最近的文章是:http : //weblogs.java.net/blog/2008/03/07/authentication- jersey 。 但是,本文只能与GlassFish服务器和附加数据库一起使用。无论如何,在到达请求的REST资源之前,我是否可以在Jersey中实现一个接