由于各种RMI漏洞以及我不使用它的事实,我想至少在外部禁用我的JBoss服务器上的RMI,但我不确定如何在不破坏东西的情况下执行此操作
我已经尝试禁用JRMP调用程序,这似乎有效,但问题是我无法启动和停止我的服务器,因为命令:
sudo -u $JBOSS_USER $JBOSS_HOME/bin/shutdown.sh -S
返回错误:
Exception in thread "main" javax.naming.NamingException: Could not dereference object [Root exception is javax.naming.NameNotFoundException: invoker not bound]
at org.jnp.interfaces.NamingContext.resolveLink(NamingContext.java:1215)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:758)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at org.jboss.Shutdown.main(Shutdown.java:214)
Caused by: javax.naming.NameNotFoundException: invoker not bound
at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
at org.jnp.server.NamingServer.getObject(NamingServer.java:543)
at org.jnp.server.NamingServer.lookup(NamingServer.java:267)
at org.jnp.server.NamingServer.lookup(NamingServer.java:270)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
at java.lang.Thread.run(Thread.java:613)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:126)
at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:667)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at org.jnp.interfaces.NamingContext.resolveLink(NamingContext.java:1209)
... 4 more
我没有看到调用者在/path/to/jboss/server/default/conf/jboss-service.xml中的任何其他地方被引用,所以我不确定我需要删除哪些其他引用。
关于我做错了什么的想法,或者我只是要求相互排斥的功能?
答案 0 :(得分:2)
在JBoss 4中,有几个对RMI调用者的引用:
conf/standardjboss.xml
JBoss中的许多功能都使用RMI,即使你的应用没有。最简单的解决方案是将JBoss绑定到远程不可用的地址:
-b 127.0.0.1
<强>更新强>
如果您只想在本地绑定RMI,请编辑jboss-service.xml文件中的BindAddress和RmiBindAddress属性:
<mbean code="org.jboss.naming.NamingService" name="jboss:service=Naming">
<attribute name="Port">1099</attribute>
<attribute name="BindAddress">127.0.0.1</attribute>
<attribute name="RmiPort">1098</attribute>
<attribute name="RmiBindAddress">127.0.0.1</attribute>
</mbean>
答案 1 :(得分:1)
问题是 shutdown.sh 使用RMI请求关闭,因此当您禁用JRMPInvoker时,您已禁用 shutdown.sh 。
一个选项可能是使用HTTP帖子到JMXConsole来请求相同的内容。
>wget --post-data "action=invokeOp&methodIndex=0&name=jboss.system%3Atype%3DServer" \
[--user=admin --password=admin]
http://localhost:18080/jmx-console/HtmlAdaptor
似乎工作正常。
===更新===
我在该网址中使用的 methodIndex 为0,用于关闭,但我确实发现了一些问题,尤其是在使用本机APR时。使用methodIndex of 2(exit)可以更加干净地工作。另外,我为超时和尝试添加了wget选项。修订版看起来像这样:
wget --timeout=1 --tries=1 \
--post-data "action=invokeOp&methodIndex=2&name=jboss.system%3Atype%3DServer" \ [--user=admin --password=admin]
http://localhost:18080/jmx-console/HtmlAdaptor