TLDR: 相关信息可以在这里找到:
https://www.rabbitmq.com/access-control.html。然而,由于rabbitmq文档非常冗长,下面我将描述似乎是锁定资源访问的唯一解决方案。
总结
虚拟主机
正如Michael Dillon所提到的,您应该从内部使所有事情发生在vhosts(
virtual hosts)中,并完全阻止通用vhost。通用vhost简单地称为“/”,并且在启动rabbitmq服务器时默认是唯一的vhost。
给定的资源(即队列或交换机)必须存在于一个vhost中,且仅存在于一个vhost中。rabbitmq连接还必须明确连接到单个vhost(可以通过将vhost名称附加到rabbitmq URL后来指定)。因此,rabbitmq连接只能访问存在于其连接到的vhost中的队列和交换机。
只需创建与应用程序中逻辑分组数量相同的vhost即可。请记住,一个vhost中的资源不知道并且不能与另一个vhost中的资源通信。通过执行以下操作来创建vhost:
rabbitmqctl add_vhost vhost-name
用户
下一步是创建用户并删除默认的guest
用户。每个用户都应该有自己的用户名和密码,只能由他们自己使用。不用说,只有实际的管理员才应该拥有管理员权限。这使他们能够管理其他用户、vhosts
和他们的权限。通过执行以下操作来创建用户:
rabbitmqctl add_user "username"
用户可以使用其凭据创建一个RabbitMQ连接,从而连接到vhost
。但是,只有当这是用户有权限访问的vhost
时,才会批准连接。只有管理员才能授予和修改用户对vhost
的访问权限。用户可以被授予对多个vhost
的访问权限,并使用他们的凭据同时连接到多个vhost
(但不能在同一连接中连接到不同的vhost
)。
然而,用户对vhost
的访问并不仅仅是二进制的。
RabbitMQ区分对资源的配置、写入和读取操作。 配置操作创建或销毁资源,或更改它们的行为。 写入操作将消息注入资源中。 而读取操作从资源中检索消息。
文档中链接部分有一个漂亮的表格,指示哪些命令属于哪种操作类型,例如queue.bind
是一个write
操作,而queue.get
是一个read
操作。 但是,复杂性并不止于此,权限实际上是基于管理员选择的自定义正则表达式(regex)授予每种操作类型的。
例如,正则表达式'.*' '.*' '.*'
允许用户在该vhost
中对任何资源进行配置、写入和读取。这将被授予如下所示:
rabbitmqctl set_permissions -p "vhost-name" "username" ".*" ".*" ".*"
正则表达式'^$' '^(hello).*$' '^(hello|world).*$'
不会给用户任何配置权限,但允许他们写入以hello
开头的任何资源并从以hello
或world
开头的任何资源读取。
要点
大量使用vhosts
将资源分组,并整体设置这些资源的权限。
资源的命名非常重要,因为这是在给定vhost
中配置对该资源访问的唯一方式。
在OP的问题中,每个用户都应该被授权仅基于队列的唯一名称读取和写入其自己的队列。这不一定需要跨多个vhosts
,但如果有意义,也可以这样做。
exclusive
指令是否足够安全,但我会进行实验以查看它是否足够安全。谢谢。 - Brian