Rabbitmq - 多租户与权限
Rabbitmq 多租户与权限
虚拟主机vhost
rabbitmq 是一个多租户系统,每个rabbitmq服务器都可以创建多个虚拟的消息服务器,简称为vhost。每个vhost拥有自己的队列、交换器、绑定关系,且每个vhost是隔离的互不影响。类似nginx中的vhost。
客户端在连接的时候必须指定一个vhost,通过授权后,只能在该vhost中进行交换、队列、绑定等操作
rabbitmq中默认创建的vhost的为"/"。
创建虚拟主机
[root@node1 ~]# rabbitmqctl add_vhost v1
Adding vhost "v1" ...
[root@node1 ~]#
创建虚拟主机需要在每个节点都执行一些操作,可能会阻塞整个集群范围的事物
列出当前的虚拟主机
[root@node1 ~]# rabbitmqctl list_vhosts
Listing vhosts ...
name
v1
/
[root@node1 ~]#
删除虚拟主机
[root@node1 ~]# rabbitmqctl delete_vhost v1
Deleting vhost "v1" ...
[root@node1 ~]#
用户管理
在Rabbitmq中,用户是访问控制的基本单元,使用用户名和密码来认证用户,每个用户可以跨越多个vhost授权,互不影响。
创建用户
[root@node1 ~]# rabbitmqctl add_user first_user 123
Adding user "first_user" ...
[root@node1 ~]#
用户名:first_user
密 码: 123
查看用户
[root@node1 ~]# rabbitmqctl list_users
Listing users ...
user tags
first_user []
guest [administrator]
[root@node1 ~]#
user:用户名
tags: 用户角色
删除用户
[root@node1 ~]# rabbitmqctl delete_user first_user
Deleting user "first_user" ...
[root@node1 ~]#
改变用户密码
rabbitmqctl change_password {username} {newpassword} # 格式
[root@node1 ~]# rabbitmqctl change_password first_user 1234
Changing password for user "first_user" ...
[root@node1 ~]#
密码验证
rabbitmqctl authenticate_user {username} {password} # 格式
[root@node1 ~]# rabbitmqctl authenticate_user first_user 1234
Authenticating user "first_user" ...
Success
[root@node1 ~]#
角色
用户的角色分为五种
none: 没有任何角色,新创建的用户角色默认为none
management: 拥有访问web管理页面的权限
policymaker: 包含management的所有权限,并且可以管理策略(Policy)和参数(Parameter)。
monitoring: 包含management的所有权限,并且可以看到连接、信道及节点相关的信息
administrator: 最高权限。包含monitoring的所有权限,并且可以管理用户、虚拟主机、权限、策略、参数等
[root@node1 harbor]# rabbitmqctl set_user_tags first_user administrator
Setting tags for user "first_user" to [administrator] ...
权限
AMQP协议中并没有指定权限控制是在服务器级别还是vhost级别实现,由mq应用自己定义。
在Rabbitmq中,权限控制以vhost为单位
授予权限的命令为
rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}
各个参数的含义:
vhost: 授予用户访问权限的vhost名称,可以设置为默认值,即vhost为“/”
user: 可以访问指定vhost的用户名
conf: 用于匹配用户在哪些资源上拥有可配置权限的正则表达式。
write:用于匹配用户在哪些资源上拥有可写权限的正则表达式。
read: 用于匹配用户在哪些资源上拥有可读权限的正则表达式。
【注】 可配置指的是队列和交换器的创建及删除之类的操作;可写指的是发布消息;可读指与消息有关的操作,包括读取消息及清空整个队列
1. 授予权限
授予first_user用户可以访问虚拟主机v1,并在所有资源上都具备可配置,可写、可读的权限
[root@node1 ~]# rabbitmqctl set_permissions -p v1 first_user ".*" ".*" ".*"
Setting permissions for user "first_user" in vhost "v1" ...
[root@node1 ~]#
2. 授予权限
授予first_user用户可以访问虚拟主机v2,在以“queue”开头的资源上具有可配置权限,并在所有资源上拥有可写、可配置权限
[root@node1 ~]# rabbitmqctl set_permissions -p v2 first_user "^queue.*" ".*" ".*"
Setting permissions for user "first_user" in vhost "v2" ...
[root@node1 ~]#
3. 清除权限
清除权限也是在vhost级别对用户而言
rabbitmqctl clear_permissions [-p vhost] {username}
默认vhost为“/”
[root@node1 ~]# rabbitmqctl clear_permissions -p v2 first_user
Clearing permissions for user "first_user" in vhost "v2" ...
[root@node1 ~]#
4. 查看权限
- 从虚拟主机角度看,哪些用户对此虚拟主机拥有权限
[root@node1 ~]# rabbitmqctl list_permissions -p v1
Listing permissions for vhost "v1" ...
user configure write read
first_user .* .* .*
[root@node1 ~]#
- 从用户角度看,此用户对哪些虚拟主机有权限
[root@node1 ~]# rabbitmqctl list_user_permissions first_user
Listing permissions for user "first_user" ...
vhost configure write read
v1 .* .* .*
[root@node1 ~]#
参考
《RabbitMQ 实战指南》
RabbitMQ官网 https://www.rabbitmq.com/documentation.html