去除认证

背景介绍

由于项目安全性的约束,不能在配置文件中暴露一些密码信息。

默认情况下,ActiveMQ在进行接发消息的时候会用户认证。通过ActiveMQ-client初始化ActiveMQConnectionFactory的时候,我们会将用户名和密码暴露在配置文件中。如果对密码进行加密,在程序启动的时候进行解密。有可能存在一点代码量上的改造,【临近上线,这个方案暂时被PASS】。

想通过ActiveMQ服务端去除认证,解决如上所述问题。

去除认证

修改ActiveMQ服务端的配置文件。($ActiveMQ_dir/conf/activemq.xml)

  1. 在<plugins>节点中注释下列认证方式:
  2. <!-- <jaasAuthenticationPlugin configuration="activemq" /> -->
  3. 在<plugins>节点中添加下列认证方式:
  4. <simpleAuthenticationPlugin anonymousAccessAllowed=“true”>
  5. <users>
  6. <authenticationUser username="admin" password="manager" groups="users,admins"/>
  7. </users>
  8. </simpleAuthenticationPlugin>
  9. <!-- Lets configure a destination based authorization mechanism -->
  10. <authorizationPlugin>
  11. <map>
  12. <authorizationMap>
  13. <authorizationEntries>
  14. <authorizationEntry queue=">" read="admins,anonymous" write="admins,anonymous" admin="admins,anonymous" />
  15. <authorizationEntry topic=">" read="admins,anonymous" write="admins,anonymous" admin="admins,anonymous" />
  16. <authorizationEntry topic="ActiveMQ.Advisory.>" read="guests,users,anonymous" write="guests,users,anonymous" admin="guests,users,anonymous"/>
  17. </authorizationEntries>
  18. </authorizationMap>
  19. </map>
  20. </authorizationPlugin>

上面配置即是通过认证插件,在接发Query/Topic/ ActiveMQ.Advisory的时候支持匿名用户。

测试

带用户名/密码的配置:

  1. <bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  2. <constructor-arg index="0" value="${jms.broker.username}"/>
  3. <constructor-arg index="1" value="${jms.broker.password}"/>
  4. <constructor-arg index="2" value="${jms.broker.url}"/>
  5. <property name="useAsyncSend" value="true"/>
  6. </bean>

不带用户名/密码的配置:

  1. <bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  2. <constructor-arg index="0" value="${jms.broker.url}"/>
  3. <property name="useAsyncSend" value="true"/>
  4. </bean>

实现结果:修改服务端的配置,客户端去除认证配置。对收发消息无影响。

资料参考

ActiveMQ Security:
http://activemq.apache.org/security.html

开启认证

  1. ActiveMQ目录conf下找到jetty.xml:
  1. <bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint">
  2. <property name="name" value="BASIC" />
  3. <property name="roles" value="user,admin" />
  4. <!-- set authenticate=false to disable login -->
  5. <property name="authenticate" value="true" />
  6. </bean>

,true:需要认证; false:不需要认证。 2. ActiveMQ目录conf下找到jetty-realm.properties

  1. # username: password [,rolename ...]
  2. admin: admin123, admin
  3. user: user, user

第一个admin,为认证用户名。第二个admin123,为认证密码。第三个admin,为角色。 3. 重启ActiveMQ验证是否需要认证重启activemq后,访问:http://127.0.0.1:8161/admin/,弹出http基本认证框,这时候认证生效。

JAAS

Jaas方式配置用户登录验证

安全性配置

1.Client(生产者和消费者)连接ActiveMQ需要使用账号;
2.限制具体的Client对于某个/某些Topic/Queue的操作权限.

一、具体配置

1.conf/activemq.xml中增加如下配置,实现消息授权:

  1. <plugins>
  2. <!-- use JAAS to authenticate using the login.config file on the classpath to configure JAAS -->
  3. <jaasAuthenticationPlugin configuration="activemq-domain" />
  4. <!-- lets configure a destination based authorization mechanism -->
  5. <authorizationPlugin>
  6. <map>
  7. <authorizationMap>
  8. <authorizationEntries>
  9. <authorizationEntry topic="FirstTopic" read="smeall,smeadmin" write="smeadmin" admin="smeall,smeadmin" />
  10. <authorizationEntry topic="ActiveMQ.Advisory.>" read="smeall,smeadmin" write="smeadmin" admin="smeall,smeadmin"/>
  11. </authorizationEntries>
  12. </authorizationMap>
  13. </map>
  14. </authorizationPlugin>
  15. </plugins>

该配置指定了:

1.指定了实用JAAS插件管理权限

2.指定了具体的Topic/Queue与用户组的授权关系

3.这个是必须的配置,不能少

2.基于JAAS机制,conf目录下增加3个文件,实现登录认证和用户组:

login.config,内容如下,无需修改:

  1. activemq-domain{
  2. org.apache.activemq.jaas.PropertiesLoginModule required
  3. debug=true
  4. org.apache.activemq.jaas.properties.user="users.properties"
  5. org.apache.activemq.jaas.properties.group="groups.properties";
  6. };

users.properties,内容格式username=password,根据实际情况修改:

  1. #userName=password
  2. smeshandong=fulong
  3. smechina=fulong


groups.properties,内容格式groupname=username1,username2,username3,根据实际情况修改:

  1. #group=userName
  2. smeall=smeshandong
  3. smeadmin=smechina

二、Tips

需要将 TIVEMQ_HOME%\conf\加入CLASSPATH

配置文件都放在classpath下就行

三种权限,注意admin权限只是创建权限,不包括写:

read:可以从queue或者topic里面接收消息
write:可以向queue或者topic发送消息
admin:可以创建queue或者topic(可能还有别的功能)

配置权限时必须加上:

注意,实用过程中可动态添加用户,配置用户组,无需重启MQ!!!!!!