activemq作为消息中间件这样一个独立的个体存在,连通用户和服务器。如果没有一套完备的安全机制去设置用户权限设置消息分发机制可想后果是非常严重。ActiveMQ如果不加入安全机制的话,任何人只要知道消息服务的具体地址(包括ip,端口,消息地址[队列或者主题地址,),都可以肆无忌惮的发送、接收消息。今天我们就探讨一下他的安全机制。

1.安全机制介绍

我们讨论安全机制一般包括两个部分:

  1. 验证(Authentication):就是要验证一个用户的有效性,即用户名、密码是否正确;
  2. 授权(Authorization):就是授予用户某种角色,以使用户只能访问具有相应角色的资源。

activemq考虑到安全方案效率问题,他提供了可插拔的安全机制,你可以使用不同的安全插件灵活为你的系统配置安全访问方式。目前activemq提供两种安全控制插件:

  1. 简单认证插件(Simple authentication plugin-in)
  2. JAAS认证插件(Java Authentication and Authorization Service)

下面我们分别就这两种插件的使用做一个说明。

2.简单认证插件

简单认证插件的目的就是让用户简单配置。我们打开activemq服务的目录apache-activemq,在 conf目录下找到activemq.xml。进去找到:

 <shutdownHooks>
<bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
</shutdownHooks>

在他下面添加如下即可:

<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="admin" password="admin" groups="users,admins"/>
<authenticationUser username="user" password="password" groups="users"/>
</users>
</simpleAuthenticationPlugin>
</plugins>

☆注意:此处添加的用户名和密码要和你在项目中配置的activemq用户名密码是一致的,如果在项目中不是此处已经配置过的用户发送消息的话,activemq客户端不会受理该消息。这样就达到了对非命中用户拦截的目的。

比如说你有客户端使用的用户是:

<amq:connectionFactory id="amqConnectionFactory"
brokerURL="tcp://127.0.0.1:61616"
userName="admin"
password="admin" />

那你就把该用户配置到activemq的配置文件中:

 <authenticationUser username="admin" password="admin" groups="users,admins"/>

上面是对用户进行限制,我们也可以对ip进行限制,还是在刚才的配置里面加上下面这一句:

<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="admin" password="admin" groups="users,admins"/>
<!-- <authenticationUser username="user" password="password" groups="users"/>
<authenticationUser username="guest" password="password" groups="guests"/>-->
</users> <transportConnectors>
<transportConnector name="connection1" uri="tcp://0.0.0.0:61616" />
</transportConnectors>
</simpleAuthenticationPlugin>
</plugins>

0.0.0.0代表本网络中的所有主机,意味着该网段的所有主机都是可以通讯的。如果改成localhost或者127.0.0.1这种的那就只有本机了。这样我们就达到了通过IP限制的目的。

3.JAAS认证插件

JAAS(Java Authentication and Authorization Service)也就是java的验证Authentication)、授权(Authorization)服务。简单来说,验证Authentication就是要验证一个用户的有效性,即用户名、密码是否正确。授权Authorization就是授予用户某种角色,可以访问哪些资源。JAASAuthentication Plugin依赖标准的JAAS机制来实现认证。通常情况下,你需要通过设置Java.security.auth.login.config系统属性来配置login

modules的配置文件。如果没有指定这个系统属性,那么JAAS Authentication Plugin会缺省使用login.config作为文件名。

首先我们需要编写一个login.config文件:

activemq {
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文件:

admin=admin
user=ad1
guest=ad1

group.properties文件:

admins=admin
users=user
guests=guest

☆需要注意的是,PropertiesLoginModule使用本地文件的查找方式,而且查找时采用的base directory即login.config文件所在的目录,所以说这三个文件需要在同一个目录里才会找得到。另外,activemq 5.9 默认提供了以上的配置文件,我们来看一下文件目录:

然后我们还是在activemq.xml配置文件中添加插件。还是上面简单插件添加的位置,添加以下插件即可,只不过你的把之前添加的简单插件注释掉。

<plugins>
<jaasAuthenticationPlugin configuration="activemq-domain" />
<authorizationPlugin>
<map>
<authorizationMap>
<authorizationEntries>
<!-- .表示通配符,例如USERS.>表示以USERS.开头的主题,>表示所有主题,read表示读的权限,write表示写的权限,admin表示角色组-->
<authorizationEntry queue=">" read="admins,guests" write="guests" admin="admins,guests" />
<authorizationEntry queue="USERS.>" read="users" write="users" admin="users" />
<authorizationEntry queue="GUEST.>" read="guests" write="guests,users" admin="guests,users" /> <authorizationEntry topic=">" read="admins" write="admins" admin="admins" />
<authorizationEntry topic="USERS.>" read="users" write="users" admin="users" />
<authorizationEntry topic="GUEST.>" read="guests" write="guests,users" admin="guests,users" /> <authorizationEntry topic="ActiveMQ.Advisory.>" read="guests,users" write="guests,users" admin="guests,users"/>
</authorizationEntries>
</authorizationMap>
</map>
</authorizationPlugin>
</plugins>

添加完以上配置部分,重启avtivemq服务端,就会按照上面配置的用户进行读写的权限配置。

从上面看JAAS插件的权限分配要比简单插件的权限更加细致,不同的用户可以分别配置读写的权限,admin用户拥有创建topic或是queue的特权等等这样细致的划分,不同的用户各司其职,减少了误操作,或是刻意破换的可能性。

消息中间件-activemq安全机制的更多相关文章

  1. 消息中间件-activemq消息机制和持久化介绍(三)

    前面一节简单学习了activemq的使用,我们知道activemq的使用方式非常简单有如下几个步骤: 创建连接工厂 创建连接 创建会话 创建目的地 创建生产者或消费者 生产或消费消息 关闭生产或消费者 ...

  2. 消息中间件ActiveMQ使用详解

    消息中间件ActiveMQ使用详解 一.消息中间件的介绍 介绍 ​ 消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于 数据通信 来进行分布式系统的集成. 特点(作用) ...

  3. 深入浅出 JMS(三) - ActiveMQ 安全机制

    深入浅出 JMS(三) - ActiveMQ 安全机制 一.认证 认证(Authentication):验证某个实体或者用户是否有权限访问受保护资源. MQ 提供两种插件用于权限认证: (一).Sim ...

  4. ActiveMQ持久化机制和JMS可靠消息

    1.ActiveMQ持久化机制 1.1 JDBC将数据持久化到数据库 1.2 AMQ生成日志文件 1.3 KahaDB:本次磁盘生成数据文件(默认) 1.4 LevelDB:谷歌K/V数据库 1.5 ...

  5. 消息中间件-ActiveMQ高可用集群和持久化机制

    1.修改active.mq的xml文件 2.延时.调度消息 package com.study.mq.b1_message; import org.apache.activemq.ActiveMQCo ...

  6. 消息中间件ActiveMQ及Spring整合JMS的介绍

    一 .消息中间件的基本介绍 1.1 消息中间件 1.1.1 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排 ...

  7. 消息中间件ActiveMQ及Spring整合JMS

    一 .消息中间件的基本介绍 1.1 消息中间件 1.1.1 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排 ...

  8. 品优购商城项目(五)消息中间件 ActiveMQ

    消息中间件用于降低各个项目模块的耦合,适用于不需要等待返回消息才能进入下一个业务环节的模块,以及实时要求性不高的业务模块. 一.JMS JMS(Java Messaging Service)是Java ...

  9. 关于消息中间件ActiveMQ的企业级应用

    几个月前看到项目中配置了activeMq,于是想通透的掌握activeMq,便去网上学习搜寻资料,找到这一篇博客挺不错的,解释的比较清楚,包括原理使用和配置,特此把它分享给大家. 众所周知,消息中间件 ...

随机推荐

  1. C++中 =default,=delete用法

    =default: 用于显式要求编译器提供合成版本的四大函数(构造.拷贝.析构.赋值) 例如: class A{ public: A() = default; A(const A& a) = ...

  2. java基础第十八篇之单元测试、注解和动态代理

    1:单元测试 1)JUnit是一个Java语言的单元测试框架,这里的单元指的就是方法 2)单元测试用来替换以前的main方法 1.1 Junit测试的步骤 1:在方法的上面加上 @Test 2:将ju ...

  3. SqlCommand的Parameters的用法

    SqlCommand的Parameters的用法 可以用的SqlCommand的Parameters的方法SqlCommand cmd=new ("insert into notice(ly ...

  4. c++字符数组

    题目描述 题目描述 输入一个英文句子(长度不会超过100),和他的长度,统计每个字母出现的个数. 输入 第一行包括一个整数,表示句子的长度,长度不会超过100.数字后可能会有多余的无效字符 请gets ...

  5. MYSQL5.7---ONLY_FULL_GROUP_BY 异常处理

    异常介绍: ONLY_FULL_GROUP_BY 指的是你查询的语句使用到了group by 例如  select name,age from person group by sex; 此时你grou ...

  6. ZIP:ZipEntry

    ZipEntry: /* 此类用于表示 ZIP 文件条目. */ ZipEntry(String name) :使用指定名称创建新的 ZIP 条目. ZipEntry(ZipEntry e) :使用从 ...

  7. SSAS Tabular 数据表关系与join的映射

    才想起来总结这两天发现的一个有趣的现象: 在SSAS Tabular 模型中建立了关系之后,在excel中分析发现: 产品库龄作为量值:Aging Stock:=sum([DISTRIBUTOR_ST ...

  8. 作为前端程序员的她凭什么成为Judy团队第一位助教?

    Judy团队第一位助教-俊英子:正直,阳光,向上,自律,优秀的女孩,当然这些词语还是无法描述出她的优秀 英子,我们第一次的时候,2月25号,下午16:26分,她突然发了一段长的文字我. 她说她一直在读 ...

  9. c语言进阶11-经典算法代码

    重要算法一览 #include "stdio.h" #include "stdio.h" void main() { int a,b,c,i,n; int x, ...

  10. vijos p1304 回文数

    N进制下的加法 2/10/16进制下,char到int的转换 #include<iostream>#include<string>using namespace std;str ...