0

我想确保我的 RabbitMQ 集群上的所有用户都只拥有他们预期目的所需的权限。

我在 2 个 RabbitMQ 集群之间使用Exchange Federation,我想限制用户在上游集群上的权限,以便它只能联合来自一个 Exchange 的消息。这是为了确保下游集群使用的用户不能发布/订阅/配置超出其预期目的的任何内容(或至少尽可能多)。

我知道权限可能很复杂,因为必须在上游集群上动态创建工作队列和绑定,所以这可能并不简单。

我发现的所有示例都指定将用户的权限设置为:

配置正则表达式 写正则表达式 阅读正则表达式
.* .* .*

当用户具有这些设置时,联合工作正常,但这是一个全能的用户,我对此并不满意。如果我尝试将其重新配置为更具体的内容,则会出现如下错误:

{server_initiated_close,403,
<<"ACCESS_REFUSED - access to exchange 'exchange-a' in vhost 'vhost-a' refused for user 'user-a'">>}

如何限制这些权限以防止联合用户拥有超出其需要的访问权限?

4

1 回答 1

0

我在我的任何书籍或在线资源中都没有找到这个问题的答案,所以这个答案是基于观察和反复试验......

解决方案

Exchange 联合似乎需要一个上游用户,该用户有权从目标上游交换中读取,并且还可以配置、读取和写入动态创建的上游联合交换和队列。

动态创建的exchange和queue的名称使用原来的exchange名称,前缀federation: 和后缀都是->和下游集群名称。动态创建的交换也以字母表的附加字母为后缀。

基于此,我发现这些最小访问权限工作得非常好(更正了交换和下游集群名称):

配置正则表达式 写正则表达式 阅读正则表达式
^federation: exc\.name -> dwn_cluster_name ^federation: exc\.name -> dwn_cluster_name ^exc\.name$|^federation: exc\.name -> dwn_cluster_name

例子

假设我有一个名为my.exchange. 仅从此交换中读取的最小访问权限将是^my\.exchange$.

当在下游设置联合策略时,会在上游集群上创建新的交换和队列。它们的名称如下所示:

  • 交易所名称:(federation: my.exchange -> MY_DOWNSTREAM_CLUSTER A最终字符可能不同)
  • 队列名称:federation: my.exchange -> MY_DOWNSTREAM_CLUSTER

因此,权限可以设置为:

配置正则表达式 写正则表达式 阅读正则表达式
^federation: my\.exchange -> MY_DOWNSTREAM_CLUSTER ^federation: my\.exchange -> MY_DOWNSTREAM_CLUSTER ^my\.exchange$|^federation: my\.exchange -> MY_DOWNSTREAM_CLUSTER

那么联合队列呢?

显然是题外话,但无论如何都值得在这里回答,相比之下相对简单。

这只是需要队列本身的配置和读取权限的简单情况。因此,可以对这些使用非常明确的全行匹配模式,例如^my\.queue$.

配置正则表达式 写正则表达式 阅读正则表达式
^my\.queue$ ^$ ^my\.queue$
于 2022-02-11T16:11:01.927 回答