去除认证
背景介绍
由于项目安全性的约束,不能在配置文件中暴露一些密码信息。
默认情况下,ActiveMQ在进行接发消息的时候会用户认证。通过ActiveMQ-client初始化ActiveMQConnectionFactory的时候,我们会将用户名和密码暴露在配置文件中。如果对密码进行加密,在程序启动的时候进行解密。有可能存在一点代码量上的改造,【临近上线,这个方案暂时被PASS】。
想通过ActiveMQ服务端去除认证,解决如上所述问题。
去除认证
修改ActiveMQ服务端的配置文件。($ActiveMQ_dir/conf/activemq.xml)
在<plugins>节点中注释下列认证方式:
<!-- <jaasAuthenticationPlugin configuration="activemq" /> -->
在<plugins>节点中添加下列认证方式:
<simpleAuthenticationPlugin anonymousAccessAllowed=“true”>
<users>
<authenticationUser username="admin" password="manager" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
<!-- Lets configure a destination based authorization mechanism -->
<authorizationPlugin>
<map>
<authorizationMap>
<authorizationEntries>
<authorizationEntry queue=">" read="admins,anonymous" write="admins,anonymous" admin="admins,anonymous" />
<authorizationEntry topic=">" read="admins,anonymous" write="admins,anonymous" admin="admins,anonymous" />
<authorizationEntry topic="ActiveMQ.Advisory.>" read="guests,users,anonymous" write="guests,users,anonymous" admin="guests,users,anonymous"/>
</authorizationEntries>
</authorizationMap>
</map>
</authorizationPlugin>
上面配置即是通过认证插件,在接发Query/Topic/ ActiveMQ.Advisory的时候支持匿名用户。
测试
带用户名/密码的配置:
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<constructor-arg index="0" value="${jms.broker.username}"/>
<constructor-arg index="1" value="${jms.broker.password}"/>
<constructor-arg index="2" value="${jms.broker.url}"/>
<property name="useAsyncSend" value="true"/>
</bean>
不带用户名/密码的配置:
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<constructor-arg index="0" value="${jms.broker.url}"/>
<property name="useAsyncSend" value="true"/>
</bean>
实现结果:修改服务端的配置,客户端去除认证配置。对收发消息无影响。
资料参考
ActiveMQ Security:
http://activemq.apache.org/security.html
开启认证
- ActiveMQ目录conf下找到jetty.xml:
<bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint">
<property name="name" value="BASIC" />
<property name="roles" value="user,admin" />
<!-- set authenticate=false to disable login -->
<property name="authenticate" value="true" />
</bean>
# username: password [,rolename ...]
admin: admin123, admin
user: user, user
第一个admin,为认证用户名。第二个admin123,为认证密码。第三个admin,为角色。 3. 重启ActiveMQ验证是否需要认证重启activemq后,访问:http://127.0.0.1:8161/admin/,弹出http基本认证框,这时候认证生效。
JAAS
安全性配置
1.Client(生产者和消费者)连接ActiveMQ需要使用账号;
2.限制具体的Client对于某个/某些Topic/Queue的操作权限.
一、具体配置
1.conf/activemq.xml中增加如下配置,实现消息授权:
<plugins>
<!-- use JAAS to authenticate using the login.config file on the classpath to configure JAAS -->
<jaasAuthenticationPlugin configuration="activemq-domain" />
<!-- lets configure a destination based authorization mechanism -->
<authorizationPlugin>
<map>
<authorizationMap>
<authorizationEntries>
<authorizationEntry topic="FirstTopic" read="smeall,smeadmin" write="smeadmin" admin="smeall,smeadmin" />
<authorizationEntry topic="ActiveMQ.Advisory.>" read="smeall,smeadmin" write="smeadmin" admin="smeall,smeadmin"/>
</authorizationEntries>
</authorizationMap>
</map>
</authorizationPlugin>
</plugins>
该配置指定了:
1.
2.
3.
2.基于JAAS机制,conf目录下增加3个文件,实现登录认证和用户组:
login.config,内容如下,无需修改:
activemq-domain{
org.apache.activemq.jaas.PropertiesLoginModule required
debug=true
org.apache.activemq.jaas.properties.user="users.properties"
org.apache.activemq.jaas.properties.group="groups.properties";
};
users.properties,内容格式username=password,根据实际情况修改:
#userName=password
smeshandong=fulong
smechina=fulong
groups.properties,内容格式groupname=username1,username2,username3,根据实际情况修改:
#group=userName
smeall=smeshandong
smeadmin=smechina
二、Tips
需要将 TIVEMQ_HOME%\conf\加入CLASSPATH
配置文件都放在classpath下就行
三种权限,注意admin权限只是创建权限,不包括写:
read:可以从queue或者topic里面接收消息
write:可以向queue或者topic发送消息
admin:可以创建queue或者topic(可能还有别的功能)
配置权限时必须加上:
注意,实用过程中可动态添加用户,配置用户组,无需重启MQ!!!!!!