使用 RabbitMQ Exchange Federation 时上游用户的最小访问权限是什么

What are the minimal access rights for the upstream user when using RabbitMQ Exchange Federation

我想确保我的 RabbitMQ 集群上的所有用户仅拥有实现其预期目的所需的权限。

我在 2 个 RabbitMQ 集群之间使用 Exchange Federation,我想限制用户在上游集群上的权限,以便它只能联合来自一个 Exchange 的消息。这是为了确保下游集群使用的用户无法 publish/subscribe/configure 超出其预期目的(或至少尽可能多)的任何事情。

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

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

Configure regexp Write regexp Read regexp
.* .* .*

当用户具有这些设置时,联盟工作正常,但这是一个非常强大的用户,我对此感到不舒服。如果我尝试将其重新配置为更具体的内容,则会出现如下错误:

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

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

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

解决方案

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

动态创建的exchange和queue的名称沿用原来的exchange名称,均以federation: 为前缀,->为后缀以及下游集群名称。动态创建的交易所也以额外的字母作为后缀。

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

Configure regexp Write regexp Read regexp
^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

权限因此可以设置为:

Configure regexp Write regexp Read regexp
^federation: my\.exchange -> MY_DOWNSTREAM_CLUSTER ^federation: my\.exchange -> MY_DOWNSTREAM_CLUSTER ^my\.exchange$|^federation: my\.exchange -> MY_DOWNSTREAM_CLUSTER

联合队列呢?

显然跑题了,但无论如何都值得在这里回答,因为相比之下相对简单。

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

Configure regexp Write regexp Read regexp
^my\.queue$ ^$ ^my\.queue$