
本文详解如何为 spring boot 应用集成的 activemq 实现完整身份认证与授权保护,涵盖 broker 端安全插件配置、客户端连接凭证设置、序列化白名单加固及常见配置陷阱规避。
本文详解如何为 spring boot 应用集成的 activemq 实现完整身份认证与授权保护,涵盖 broker 端安全插件配置、客户端连接凭证设置、序列化白名单加固及常见配置陷阱规避。
在 Spring Boot 中启用 ActiveMQ 安全访问,仅配置用户名/密码和 SimpleAuthenticationPlugin 是不充分的——它只完成了「身份认证(Authentication)」,而未启用「授权(Authorization)」。ActiveMQ 默认允许匿名用户执行部分操作(如创建临时队列),若未显式配置授权策略,攻击者仍可能绕过认证直接访问资源。因此,必须同时配置认证插件与授权插件,才能实现真正意义上的连接与消息级安全。
✅ 正确配置 ActiveMQ Broker(activemq.xml)
以下是一个生产就绪的安全配置示例,整合了认证与细粒度授权:
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!-- 1. 定义用户凭证(支持多用户) -->
<bean id="securityPlugin" class="org.apache.activemq.security.SimpleAuthenticationPlugin">
<property name="userGroups">
<map>
<entry key="admin" value="admins"/>
<entry key="producer" value="producers"/>
<entry key="consumer" value="consumers"/>
</map>
</property>
</bean>
<!-- 2. 关键:启用授权插件(必须!) -->
<bean id="authorizationPlugin" class="org.apache.activemq.security.AuthorizationPlugin">
<property name="map">
<bean class="org.apache.activemq.security.DefaultAuthorizationMap">
<property name="tempDestinationAuthorizationEntry">
<bean class="org.apache.activemq.security.AuthorizationEntry">
<property name="groupClass" value="org.apache.activemq.jaas.GroupPrincipal"/>
<property name="queues">
<set>
<value>admins</value>
</set>
</property>
<property name="topics">
<set>
<value>admins</value>
</set>
</property>
<property name="tempTopics">
<set>
<value>admins</value>
</set>
</property>
<property name="tempQueues">
<set>
<value>admins</value>
</set>
</property>
</bean>
</property>
<property name="authorizationEntries">
<list>
<!-- 允许 admins 对所有队列/主题进行读写 -->
<bean class="org.apache.activemq.security.AuthorizationEntry">
<property name="queue" value=">"/>
<property name="topics" value=">"/>
<property name="read" value="admins"/>
<property name="write" value="admins"/>
<property name="admin" value="admins"/>
</bean>
<!-- 限制 producers 仅可发送到指定前缀队列 -->
<bean class="org.apache.activemq.security.AuthorizationEntry">
<property name="queue" value="app.queue.>"/>
<property name="read" value="producers,consumers"/>
<property name="write" value="producers"/>
<property name="admin" value="admins"/>
</bean>
<!-- 限制 consumers 仅可消费 -->
<bean class="org.apache.activemq.security.AuthorizationEntry">
<property name="queue" value="app.queue.>"/>
<property name="read" value="consumers"/>
<property name="write" value="producers"/>
<property name="admin" value="admins"/>
</bean>
</list>
</property>
</bean>
</property>
</bean>
<!-- 3. Broker 配置:启用插件并禁用匿名访问 -->
<broker xmlns="http://activemq.apache.org/schema/core"
brokerName="localhost"
dataDirectory="${activemq.data}"
schedulerSupport="false">
<plugins>
<simpleAuthenticationPlugin anonymousAccessAllowed="false">
<users>
<authenticationUser username="admin" password="password" groups="admins"/>
<authenticationUser username="producer" password="prod123" groups="producers"/>
<authenticationUser username="consumer" password="cons456" groups="consumers"/>
</users>
</simpleAuthenticationPlugin>
<ref bean="authorizationPlugin"/>
</plugins>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?needClientAuth=false"/>
</transportConnectors>
</broker>
</beans>? 关键说明:
✅ Spring Boot 客户端配置(application.properties)
修正原配置中的典型错误(如重复属性、错误的 broker-url 值):
# ✅ 正确:指向 ActiveMQ 服务地址(非 XML 文件路径) spring.activemq.broker-url=tcp://localhost:61616 # ✅ 认证凭据(必须与 activemq.xml 中一致) spring.activemq.user=admin spring.activemq.password=password # ✅ 严格限制反序列化(防止 JMS 反序列化漏洞) spring.activemq.packages.trust-all=false spring.activemq.packages.trusted=org.apache.activemq.command,com.hfc.card.config # ✅ 连接池与内存模式(根据环境调整) spring.activemq.in-memory=false # 生产环境应设为 false,连接外部 ActiveMQ spring.activemq.pool.enabled=true spring.activemq.pool.max-connections=10 spring.activemq.pool.maximum-active-session-per-connection=5 # ⚠️ 可选:启用 SSL(推荐生产环境使用) # spring.activemq.broker-url=ssl://localhost:61617 # server.ssl.key-store=classpath:broker.jks
❗ 常见陷阱提醒:
- 错误地将 spring.activemq.broker-url=activemq.xml —— 这是 Spring Boot 内嵌 ActiveMQ 的配置方式,不适用于外部独立 Broker;
- spring.activemq.packages.trust-all=true 在生产中极度危险,必须禁用并显式声明可信包;
- in-memory=true 会忽略所有外部配置(包括 activemq.xml),务必设为 false 并确保 ActiveMQ 独立运行。
✅ 验证与调试建议
- 启动时检查日志:确认 ActiveMQ 启动日志中出现 Authentication plugin enabled 和 Authorization plugin enabled;
-
测试无凭据连接失败:
telnet localhost 61616 # 应立即断开或超时
- **使用 JMX 控制台(http://localhost:8161/admin/)验证用户登录与队列权限;
-
Spring Boot 日志级别调至 DEBUG:
logging: level: org.apache.activemq: DEBUG org.springframework.jms: DEBUG
✅ 总结
安全接入 ActiveMQ 不是单一配置项任务,而是包含三个不可分割的环节:
? 认证(Authentication):通过 SimpleAuthenticationPlugin 校验用户身份;
? 授权(Authorization):通过 AuthorizationPlugin 控制队列/主题级读写权限;
? 传输与反序列化加固:禁用匿名访问、限制可信包、启用 SSL(推荐)。
缺失任一环节,都将导致“看似有密码,实则形同虚设”的安全隐患。务必以最小权限原则设计用户组与授权规则,并定期审计 activemq.xml 配置变更。










