0%

RabbitMQ 权限控制原理和示例

详细介绍如何权限 RabbitMQ 的原理和一些应用示例

权限控制原理

两级控权

RabbitMQ 授权模型分两级:
第一级控权单位是 virtual host
第二级控权单位是 resource(包含exchangequeue),两个相同名称的 resource如果分属不同的 virtual host,则算是不同的 resource

当用户访问 RabbitMQ 时,首先触发第一级控权,判断用户是否有访问该 virtual host 的权限;
若可访问,则进行第二级控权,判断用户是否具有操作所请求 resource 的权限。

操作定义

RabbitMQ 定义的操作有三种:
configure 主要是创建、删除 exchangequeue 操作;
write 主要对应绑定和推送消息操作;
read 主要对应读取消息操作。

具体对应如下表:

AMQP 0-9-1 Operation configure write read
exchange.declare (passive=false) exchange
exchange.declare (passive=true)
exchange.declare (with AE) exchange exchange (AE) exchange
exchange.delete exchange
queue.declare (passive=false) queue
queue.declare (passive=true)
queue.declare (with DLX) queue exchange (DLX) queue
queue.delete queue
exchange.bind exchange (destination) exchange (source)
exchange.unbind exchange (destination) exchange (source)
queue.bind queue exchange
queue.unbind queue exchange
basic.publish exchange
basic.get queue
basic.consume queue
queue.purge queue

授权元素

当管理员对一个用户进行授权时,要配置两个元素:

  1. 允许什么操作,即 configurewriteread三种 operation ;
  2. 操作什么 resource,即用户是否拥有某资源的权限,通过对该资源的名称与授权时配置的正则进行匹配来判断,如果能匹配上则允许对应的操作

如何设置

命令行

这里只讲添加,如何删除,请参考其它文档或者通过rabbitmqctl help查看帮助

添加 virtual host

命令格式

1
rabbitmqctl [--node <node>] [--longnames] [--quiet] add_vhost <vhost> [--description <description> --tags "<tag1>,<tag2>,<...>"]

示例:添加一个名字叫 segon.cnvirtual host

1
rabbitmqctl add_vhost segon.cn

添加用户

1
rabbitmqctl [--node <node>] [--longnames] [--quiet] add_user <username> <password>

示例:添加一个名字叫 segon 密码为 123456 的用户

1
rabbitmqctl add_user segon 123456

设置权限

1
rabbitmqctl [--node <node>] [--longnames] [--quiet] set_permissions [--vhost <vhost>] <username> <conf> <write> <read>

示例:允许用户 segon 访问 segon.cn 这个 virtual host

1
rabbitmqctl set_permissions -p segon.cn segon ".*" ".*" ".*"

web 管理页面

添加 virtual host

user detail

添加用户

user detail

设置权限

进入用户详情界面
user detail
添加权限
user detail

示例

web 管理页面参考

下图是segon用户的详情,在Current permissions 字段可以看到对 segon.cn 这个 virtual host 具有所有的操作权限,因为 .* 匹配所有字符串

user detail

不允许配置 ExchangeQueue

1
rabbitmqctl set_permissions -p segon.cn segon "^$" ".*" ".*"

注意 conf 字段设置的是 ^$,这个是匹配一个空行,所以不会匹配到任何 exchangequeue ,所以没法对 segon.cn 下面的任何 exchangequeue 进行创建、删除操作

只允许用户消费以”star”开头的队列

1
rabbitmqctl set_permissions -p segon.cn segon "^$" ".*" "^star.*"

注意 read 字段设置的是 ^star.*,如果某个 queue 不是以 “star” 开头,那么用户 segon 则不能获取、消费队列中的消息

参考文档

https://www.rabbitmq.com/vhosts.html
https://www.rabbitmq.com/access-control.html
https://www.rabbitmq.com/rabbitmqctl.8.html#Access_control