2016年3月1日星期二

ActiveMQ_019:Broker 的认证与授权

环境:OS X EI Capitan 10.11.3 + ActiveMQ 5.13

1. 认证
(1)默认的认证方式
Broker 默认使用 JAAS 作为认证的 Provider。

可以设置环境变量:java.security.auth.login.config,指向JAAS的配置文件。
在启动脚本中,修改变量 ACTIVEMQ_OPTS,增加-Djava.security.auth.login.config=... 
如果没有设置该变量,Activemq 会在 classpath 中找名为 login.config 的文件。       
conf/login.config 文件内容如下:
activemq {
    org.apache.activemq.jaas.PropertiesLoginModule required
        org.apache.activemq.jaas.properties.user="users.properties"
        org.apache.activemq.jaas.properties.group="groups.properties";
        reload=true;
};
其中 reload=true; 表示 Activemq 会自动加载修改后的 users.properties 和 groups.properties 文件。

conf/users.properties 文件内容如下:
admin=admin

conf/groups.properties 文件内容如下:
admins=admin

(2)使用 Simple Authentication Plugin 认证方式
注意,这种方式一般用于测试环境,不用于生产环境,其好处是搭建简单快捷。
在 conf/activemq.xml 中 broker 的配置的开头增加如下内容:
<plugins>
   <simpleAuthenticationPlugin anonymousAccessAllowed="true">
       <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>
</plugins>
其中,anonymousAccessAllowed="true" 表示允许匿名访问 broker。
默认的匿名用户是 anonymous,匿名组是 anonymous
你可以通过设置属性 anonymousUser 和 anonymousGroup,修改默认的匿名用户和组。
这里定义的用户和组,可以用于 broker 的授权定义。

2. 授权
Activemq 提供的权限操作有三个:
(1)read 浏览并消费 destination 中的消息
(2)write 发送消息到 destination
(3)admin 动态创建或者延迟创建 destination

3. JAAS 认证 + 授权的例子
(1)在 conf/activemq.xml 中 broker 的配置的开头增加如下内容:
<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 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>

        <!-- let's assign roles to temporary destinations. comment this entry if we don't want any roles assigned to temp destinations  -->
        <tempDestinationAuthorizationEntry>
          <tempDestinationAuthorizationEntry read="tempDestinationAdmins" write="tempDestinationAdmins" admin="tempDestinationAdmins"/>
       </tempDestinationAuthorizationEntry>
      </authorizationMap>
    </map>
  </authorizationPlugin>
</plugins>

其中,组 admins 对所有 queue 和 topic 拥有全部权限:read、write、admin;
组 users 对所有以 USERS. 开头的 queue 和 topic 拥有全部权限:read、write、admin;
组 users 对所有以 GUEST. 开头的 queue 和 topic 拥有 write 和 admin 权限;
组 guests 对所有以 GUEST. 开头的 queue 和 topic 拥有全部权限:read、write、admin;
组 users 和 guests 对所有以 ActiveMQ.Advisory. 开头的 topic 拥有全部权限:read、write、admin,这是因为 Activemq 使用其创建和删除临时的 destination。

(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/users.properties 内容如下:
admin=admin
maping=maping
guo=guo

(4)修改后的 conf/groups.properties 内容如下:
admins=admin
users=maping
guests=guo

参考文献:
1. http://activemq.apache.org/security.html

没有评论: