
当 ActiveMQ Artemis 的 JMX 连接始终成功(即使提供错误或空凭据)时,根本原因在于 login.config 中启用了 GuestLoginModule,它会将未认证或认证失败的请求降级为默认游客身份;需将其移除并仅保留 required 级别的 PropertiesLoginModule 才能实现真正的凭据校验。
当 activemq artemis 的 jmx 连接始终成功(即使提供错误或空凭据)时,根本原因在于 `login.config` 中启用了 `guestloginmodule`,它会将未认证或认证失败的请求降级为默认游客身份;需将其移除并仅保留 `required` 级别的 `propertiesloginmodule` 才能实现真正的凭据校验。
在 ActiveMQ Artemis 中,JMX 认证行为由 JAAS(Java Authentication and Authorization Service)配置驱动。您当前使用的 login.config 文件中同时配置了 PropertiesLoginModule(sufficient)和 GuestLoginModule(sufficient),这导致认证链存在“兜底逻辑”:只要任一模块成功(包括 GuestLoginModule 在无凭据或凭据无效时自动授予 admin/amq 身份),整个认证即视为通过——因此无论传入何种用户名/密码,连接均不会失败。
要实现严格的凭据校验(即:空密码、错误密码或不存在的用户必须抛出 SecurityException 或 IOException),必须禁用游客模式,仅依赖基于文件的凭证校验,并确保其认证级别为 required(而非 sufficient 或 optional)。
✅ 正确的 login.config 配置
请将 login.config 替换为以下内容(完全移除 GuestLoginModule 行):
activemq {
org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule required
debug=false
reload=true
org.apache.activemq.jaas.properties.user="artemis-users.properties"
org.apache.activemq.jaas.properties.role="artemis-roles.properties";
};
? 关键点说明:
- required:该模块必须成功,否则整个认证失败(即使后续无其他模块);
- 移除 GuestLoginModule:杜绝“无凭据→自动登录”的安全漏洞;
- debug=false 可在调试阶段设为 true,查看 JAAS 日志确认认证流程。
✅ 验证凭证文件有效性
确保 artemis-users.properties 和 artemis-roles.properties 存在且格式正确,例如:
artemis-users.properties:
admin=ENC(8a5...encrypted...) # 或明文 admin=password123(仅测试环境) monitor=monitor123
artemis-roles.properties:
amq=admin,monitor view=monitor
⚠️ 注意:若使用明文密码,请确保 broker.xml 中
已正确定义对应角色权限(如您的配置中已为 amq 角色授权 JMX 操作),否则即使认证通过,也会因授权不足而拒绝 MBean 访问。
✅ 客户端代码无需修改,但建议增强异常处理
您当前的 connectBroker 方法逻辑正确,但可补充对认证失败的明确捕获:
public static MBeanServerConnection connectBroker(String brokerUrl, String user, String password) {
try {
Map<string string> env = new HashMap();
String[] creds = {user, password};
env.put(JMXConnector.CREDENTIALS, creds);
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + brokerUrl + ":13682/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(url, env);
return connector.getMBeanServerConnection();
} catch (IOException e) {
// 此处将捕获:Authentication failed、Invalid credentials 等 JAAS 异常
throw new RuntimeException("Failed to connect to Artemis JMX: " + e.getMessage(), e);
}
}</string>
调用示例(预期行为):
// ✅ 正确凭据 → 成功
connectBroker("localhost", "admin", "password123");
// ❌ 错误凭据 → 抛出 IOException(含 "Authentication failed")
connectBroker("localhost", "admin", "wrongpass");
// ❌ 空凭据 → 抛出 IOException(不再静默降级为 guest)
connectBroker("localhost", "", "");
? 总结
- 根本原因:GuestLoginModule 提供了无条件的“备用登录”,破坏了认证强制性;
- 解决方案:精简 login.config,仅保留 required 的 PropertiesLoginModule;
-
配套要求:确保 artemis-users.properties/artemis-roles.properties 内容有效,且 management.xml 中
授权策略与角色匹配; - 效果:JMX 连接将严格校验凭据,非法访问立即失败,符合生产环境最小权限与安全审计要求。
完成配置后,重启 ActiveMQ Artemis Broker 使 JAAS 设置生效。











