ActiveMQ的安全性,主要表现在两个方面,一个是它的JMS服务的安全性,一个是它的管理控制台的安全性。在缺省情况下,ActiveMQ在这两个方面都是没有配置安全性的。大家想象一下如果没有安全机制,这将会引起什么样的后果。下文以最新的ActiveMQ5.2为例,详细描述如何配置的过程。
JMS服务安全性
如果没有配置JMS服务的安全性,任何连入网络的人,只要知道ActiveMQ服务器的具体地址(包括IP地址,端口,消息地址[队列或者主题地址]),就可以肆无忌惮的发送、接收消息。那么要解决JMS服务的安全性,最关键的问题就是解决身份认证的问题。
1)增加plugin
<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 queue=">" read="admins" write="admins" admin="admins" />
<authorizationEntry topic=">" read="admins" write="admins" admin="admins" />
<authorizationEntry queue="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins" />
<authorizationEntry topic="ActiveMQ.Advisory.>" read="admins" write="admins" admin="admins" />
</authorizationEntries>
</authorizationMap>
</map>
</authorizationPlugin>
</plugins>
2)在conf中增加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";
};
3)在conf中增加groups.properties文件,内容如下:
admins=system
4)在conf中增加users.properties文件,内容如下:
system=manager
管理控制台安全性
ActiveMQ缺省的管理是通过内置的jetty服务器,只要在浏览器中输入http://localhost:8161/admin,不需要登录,就可以对队列、主题及消息等进行管理,可以想象这非常不安全。那么要解决管理控制台的安全性,除了通过修改管理端口号以及应用名称之外,最关键的也是需要进行配置,必须通过身份认证才能登录。本文要说的方式主要是在不改变内置jetty的方式下,通过配置基本认证的方式来实现安全登录。
1)在activemq.xml中增加realm设置
<userRealms>
<jaasUserRealm name="adminRealm" loginModuleName="adminLoginModule">
</jaasUserRealm>
</userRealms>
2)修改login.config文件,参考上面已见的login.config文件
adminLoginModule {
org.mortbay.jetty.plus.jaas.spi.PropertyFileLoginModule required
debug="true"
file="C:/software/apache-activemq-5.2.0/conf/realm.properties";
};
3)在lib/web中增加jetty-plus-6.1.9.jar;
4)在conf中增加realm.properties文件
system: MD5:1d0258c2440a8d19e716292b231e3190,admins
注意,上面是用户名为system,而密码为manager,如果用户密码不一致,请根据如下命令获得相关信息
java -cp jetty-6.1.9.jar;jetty-util-6.1.9.jar org.mortbay.jetty.security.Password system manager
5)修改webapps/admin/WEB-INF/web.xml
<security-constraint>
<web-resource-collection>
<web-resource-name>adminRealm</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admins</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>adminRealm</realm-name>
</login-config>
总结
经过如上配置后,必须通过用户安全验证才能连接上消息服务器并进行消息发送和接收。当访问http://localhost:8161/admin/时,将会弹出窗口以让用户输入登录帐号和密码。特别说明一下,ActiveMQ跟安全相关的有三个地方,分别是上面说的消息服务器本身的身份认证、Web Console的身份认证,还有一个地方是通过Web Console访问消息服务器的身份认证,也就是conf/credentials.properties,文件内容如下:
activemq.username=system
activemq.password=manager
这三个地方的用户名密码最好一致,尤其是credentials.properties中的账号与users.properties中的管理员账号必须一致。