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中的管理员账号必须一致。
http://wenku.baidu.com/view/f9f4664f852458fb770b5627.html


https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/ActiveMQ/page/AMQ%E5%AE%89%E5%85%A8%E6%A0%A1%E9%AA%8C%E5%8F%8AAMQ+Console%E5%AE%89%E5%85%A8%E8%AE%A4%E8%AF%81

一. 对AMQ Broker添加校验需要在broker中添加<plugins></plugins>,一下所有操作均需要设置在plugins中。
1. 进行用户组授权配置
<authorizationPlugin>
 <map>
 <authorizationMap>
 <authorizationEntries>
 <authorizationEntry queue=">" read="admins,users,guests" write="admins,users" admin="admins" />
 <authorizationEntry topic=">" read="admins,users,guests" write="admins,users" admin="admins" />
 <authorizationEntry topic="ActiveMQ.Advisory.>" read="guests,users" write="guests,users" admin="guests,users"/>
 </authorizationEntries>
 </authorizationMap>
 </map>
 </authorizationPlugin>

 ">"为通配符,代表任何消息,被赋予admin操作的用户组具有创建消息队列的权限。
  2.1. 使用简单的用户设置策略
<simpleAuthenticationPlugin> 
 <users> 
 <authenticationUser username="system" password="manager" groups="users,admins"/> 
 <authenticationUser username="user" password="password" groups="users"/> 
 <authenticationUser username="guest" password="password" groups="guests"/> 
 </users> 
 </simpleAuthenticationPlugin> 

  2.2. 使用基于JAAS的认证策略
2.2.1). 配置使用JAAS策略,并定义配置模块为activemq-domain.
 <jaasAuthenticationPlugin configuration="activemq-domain" />

  2.2.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";
 };

  2.2.3). 建立groups.properties配置用户组和用户
 # 组名=用户名
 admins=system
 users=system,user
 guests=guest

  2.2.4). 建立users.properties配置用户和密码
 # 用户名=密码
 system=manager
 user=password
 guest=password

  3. 设置broker连接密码
3.1). 加载证书配置文件
 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 <property name="locations">
 <value>file:///${activemq.base}/conf/credentials.properties</value>
 </property> 
 </bean>
  3.2). 设置证书credentials.properties用户密码
 # 键=值
 activemq.username=system
 activemq.password=manager
  3.3). 设置broker连接用户密码
 <networkConnectors>
 <networkConnector name="host" userName="${activemq.username}" password="${activemq.password}" uri="static://(tcp://localhost:61616)"/> 
 </networkConnectors>

  二. 对AMQ Console添加BASIC认证
1. 可以将jetty的配置独立成单独的文件,然后在activemq.xml进行引用
 <import resource="jetty.xml"/>

  2.1. 在jetty.xml添加BASIC认证
 <bean id="userRealm" class="org.mortbay.jetty.security.HashUserRealm"> 
 <property name="name" value="BPMCSecurity"/> <!-- 认证名 --> 
 <property name="config" value="${activemq.base}/conf/jetty-realm.properties"/>  <!-- 认证用户密码配置 -->
 </bean> 
 <bean id="securityConstraint" class="org.mortbay.jetty.security.Constraint"> 
 <property name="name" value="BASIC" /> <!-- 认证方式,采用BASIC认证 -->
 <property name="roles"> 
 <list>
 <value>admins</value> <!-- 授权角色:admins -->
 </list> 
 </property> 
 <property name="authenticate" value="true"/> 
 </bean> 
 <bean id="securityConstraintMapping" class="org.mortbay.jetty.security.ConstraintMapping"> 
 <property name="constraint" ref="securityConstraint"/> 
 <property name="pathSpec" value="/*"/> 
 </bean> 
<!-- 配置handler -->
 <bean id="securityHandler" class="org.mortbay.jetty.security.SecurityHandler"> 
 <property name="userRealm" ref="userRealm"/> 
 <property name="constraintMappings"> 
 <list> 
 <ref bean="securityConstraintMapping" /> 
 </list> 
 </property> 
 </bean>

  2.2. 添加handler
 在Server bean的handler属性中设置HandlerCollection,并添加handlers list中内容
 <list>
 <ref bean="securityHandler" />
 </list>

  2.3. 添加配置文件jetty-realm.properties
 # 格式(用户名:密码,用户组)
 system: manager,admins