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中的管理員賬號必須一致。