如何禁用ActiveMQ服务器的trace方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何禁用ActiveMQ服务器的trace方法相关的知识,希望对你有一定的参考价值。

参考技术A TRACE和TRACK是用来调试web服务器连接的HTTP方式。支持该方式的服务器存在跨站脚本漏洞,通常在描述各种浏览器缺陷的时候,把"Cross-Site-Tracing"简称为XST。攻击者可以利用此漏洞欺骗合法用户并得到他们的私人信息。
•虚拟主机用户可以在.htaccess文件中添加如下代码过滤TRACE请求:
RewriteEngine on
RewriteCond %REQUEST_METHOD ^(TRACE|TRACK)
RewriteRule .* - [F]
•服务器用户在httpd.conf尾部添加如下指令后重启apache即可:
如果是自己的服务器,可以轻松设置,如果是购买的虚拟主机,你可以找idc服务商让他们帮你关闭,一般他们会建议你使用第一种办法。

在代理的activemq网络中禁用jmx(spring,xbean)

【中文标题】在代理的activemq网络中禁用jmx(spring,xbean)【英文标题】:Disable jmx in activemq network of brokers (spring, xbean) 【发布时间】:2011-02-01 12:40:42 【问题描述】:

由于我一直在努力解决这个问题,所以我发布了我的解决方案。 在代理的 activemq 网络中禁用 jmx 会删除有关注册 jmx 连接器的竞争条件。在同一台机器上启动多个activemq服务器时:

无法启动 jmx 连接器:无法绑定到 URL [rmi://localhost:1099/jmxrmi]:javax.naming.NameAlreadyBoundException:jmxrmi [根异常是 java.rmi.AlreadyBoundException:jmxrmi]

另一个问题是,即使你没有引起竞争条件,这个异常仍然可能发生。即使在等待它们之间正确初始化的同时启动一个又一个代理。如果一个进程由 root 作为第一个实例运行,另一个作为普通用户运行,则用户进程会尝试注册自己的 jmx 连接器,尽管已经有一个。

或者当成功注册 jmx 连接器的代理出现故障时发生的另一个异常:

无法启动 jmx 连接器:无法绑定到 URL [rmi://localhost:1099/jmxrmi]:javax.naming.ServiceUnavailableException [根异常是 java.rmi.ConnectException:连接拒绝主机:localhost;嵌套异常是:java.net.ConnectException: Connection denied]

这些异常会导致代理网络停止工作,或者根本无法工作。 禁用 jmx 的技巧是,jmx 也必须在 connectionfactory 中禁用。 文档http://activemq.apache.org/jmx.html 并没有明确说明这是需要的。于是我苦苦挣扎了 2 天,才找到解决办法:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.3.1.xsd">

<!-- Spring JMS Template -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <constructor-arg ref="connectionFactory" />
</bean>

<!-- Caching, sodass das jms template überhaupt nutzbar ist in sachen performance -->
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <constructor-arg ref="amqConnectionFactory" />
    <property name="exceptionListener" ref="jmsExceptionListener" />
    <property name="sessionCacheSize" value="1" />
</bean>

<!--
    Jeder Client verbindet sich mit seinem eigenen broker, broker sind untereinander vernetzt. Nur wenn hier
    nochmals jmx deaktiviert wird, bleibt es auch deaktiviert...
-->
<amq:connectionFactory id="amqConnectionFactory" brokerURL="vm://broker:default?useJmx=false" />

<!--
    Broker suchen sich einen eigenen Port und sind gegenseitig verbunden, ergeben dadurch ein Grid. Dies zwar etwas
    langsamer, aber dafür ausfallsicherer. Siehe http://activemq.apache.org/networks-of-brokers.html
-->
<amq:broker useJmx="false" persistent="false">
    <!-- Wird benötigt um JMX endgültig zu deaktivieren -->
    <amq:managementContext>
        <amq:managementContext connectorHost="localhost" createConnector="false" />
    </amq:managementContext>
    <!-- Nun die normale Konfiguration für Network of Brokers -->
    <amq:networkConnectors>
        <amq:networkConnector networkTTL="1" duplex="true" dynamicOnly="true" uri="multicast://default" />
    </amq:networkConnectors>
    <amq:persistenceAdapter>
        <amq:memoryPersistenceAdapter />
    </amq:persistenceAdapter>
    <amq:transportConnectors>
        <amq:transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default" />
    </amq:transportConnectors>
</amq:broker>

</beans>

有了这个,就不需要为 jvm 指定 -Dcom.sun.management.jmxremote=false。这对我也不起作用,因为 connectionfactory 启动了 jmx 连接器。

编辑:

Tonys 的回答让我重新考虑了配置,我找到了一个同样有效的简化版本。

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.3.2.xsd">

<!-- Caching, sodass das jms template überhaupt nutzbar ist in sachen performance -->
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <constructor-arg ref="amqConnectionFactory" />
    <property name="exceptionListener" ref="jmsExceptionListener" />
    <property name="sessionCacheSize" value="1" />
</bean>

<!--
    Jeder Client verbindet sich mit seinem eigenen broker, broker sind untereinander vernetzt. Nur wenn hier nochmals jmx
    deaktiviert wird, bleibt es auch deaktiviert...
-->
<amq:connectionFactory id="amqConnectionFactory" brokerURL="vm://default?broker.persistent=false" />

<!--
    Broker suchen sich einen eigenen Port und sind gegenseitig verbunden, ergeben dadurch ein Grid. Dies zwar etwas
    langsamer, aber dafür ausfallsicherer. Siehe http://activemq.apache.org/networks-of-brokers.html
-->
<amq:broker useJmx="false" persistent="false">
    <amq:networkConnectors>
        <amq:networkConnector networkTTL="1" conduitSubscriptions="true" duplex="true" dynamicOnly="true"
            uri="multicast://default" />
    </amq:networkConnectors>
    <amq:persistenceAdapter>
        <amq:memoryPersistenceAdapter />
    </amq:persistenceAdapter>
    <amq:transportConnectors>
        <amq:transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default" />
    </amq:transportConnectors>
</amq:broker>

【问题讨论】:

【参考方案1】:

可以将其他参数传递给代理 URL,例如

vm://localhost?broker.persistent=false&broker.useJmx=false

broker.useJmx=false 可以解决问题。

【讨论】:

如果你得到 SAXParseException -- "对实体 "broker.useJmx" 的引用必须以 ';' 结尾分隔符。”,然后使用 & 代替 & -- vm://localhost?broker.persistent=false&broker.useJmx=false【参考方案2】:

vm:// URI 连接到 brokerName 属性与 URI 中使用的属性匹配的代理,否则它会启动一个具有比名称的嵌入式代理。所以你可以很容易地设置vm://foo where &lt;amq:broker brokerName="foo"/&gt;

有时可能会出现竞争条件,即工厂在代理之前启动,然后启动嵌入式实例(请参阅 htp://activemq.apache.org/vm-transport-reference.html)。您可以通过使用 ConnectionFactory 的 Spring bean 配置中的依赖属性来解决此问题。

【讨论】:

以上是关于如何禁用ActiveMQ服务器的trace方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache Tomcat 6.0 中禁用 PUT TRACE DELETE 请求

强制 Apache ActiveMQ 的 JMX 只能从 localhost 访问

如何在 Spring Boot 应用程序的嵌入式 untertow 中禁用 HTTP TRACE

如何心跳感知与ActiveMQ服务器的连接状态

apache 禁止trace或track防止xss攻击

Visual Studio 在调试模式下禁用 TRACE