如何在多租户系统中的 RabbitMQ 中使队列私有/安全?

2024-04-09

我已阅读开始使用 http://www.rabbitmq.com/getstarted.htmlRabbitMQ 提供的指南,甚至还贡献了第六个示例暴风雨-amqp https://github.com/paolo-losi/stormed-amqp/tree/master/examples/tutorial6,这样我就对AMQP有了一点了解了。

然而,该指南并不全面,并且避免了身份验证和授权等内容。

我们正在设计一个多租户系统,该系统将在 RPC 类型的情况下使用 RabbitMQ。这种 RPC 实现的不同之处可能在于远程过程实际上是系统上的其他租户程序。

基本上,我想隔离数据总线,其中包括以下断言:

  1. 我们的服务器will not将数据传递给错误的租户程序(这很容易处理并且相关但不会受到质疑)。
  2. 租户程序无法从不属于自己的队列中读取数据。
  3. 租户程序无法写入不属于他们的队列。

这个问题严格来说是关于 RabbitMQ 安全性的。我知道 RabbitMQ 支持 SSL,它提供端到端加密,并且我知道 RabbitMQ 支持用户名/密码身份验证。我不知道这些事情是否适用于私有化队列使用(又名 ACL),即连接可能被加密,并且用户可能被验证,但用户可以从所有队列读取/写入。

有人可以启发我这个更高级的主题吗?我相信 RabbitMQ 可以支持这种系统,但并不完全肯定。我知道 RabbitMQ 中有一些我不知道的东西,例如什么是虚拟主机?它们在这种情况下会有所帮助吗?在我目前的知识范围内,我只是没有看到解决方案仅限于路由键、队列名称和交换。


TLDR:相关信息可以在这里找到:https://www.rabbitmq.com/access-control.html https://www.rabbitmq.com/access-control.html。然而,由于rabbitmq文档非常冗长,下面我将描述似乎是锁定资源访问的唯一解决方案。

Summary

虚拟主机

正如迈克尔·狄龙(Michael Dillon)提到的,你应该从让一切在内部发生开始vhosts (虚拟主机 https://www.rabbitmq.com/vhosts.html)并阻止泛型vhost完全。通用虚拟主机简称为/并且默认是唯一的vhost当你启动rabbitmq服务器时。

给定的资源(即队列或交换器)必须存在于一个资源中vhost和一个vhost仅有的。一个rabbitmq连接还必须专门连接到一个vhost(这可以通过附加来指定vhost名称到rabbitmq URL 例如amqp://username:password@myserver:5672/vhost)。因此,rabbitmq 连接只能访问位于以下位置的队列和交换器:vhost它已连接到。

只需创建尽可能多的vhosts因为您的应用程序中有逻辑分组。请记住,资源合二为一vhost不知道并且无法与另一个资源进行通信vhost。创建一个vhost通过做:

rabbitmqctl add_vhost vhost-name

Users

下一步是创建用户并删除默认用户guest用户。每个用户都应该有自己的用户名和密码,并且只能由他们使用。不用说,只有实际管理员才应该拥有管理员权限。这使他们能够管理其他用户,vhosts以及他们的权限。通过执行以下操作创建用户:

rabbitmqctl add_user "username"

用户可以使用他们的凭据创建rabbitmq连接,从而连接到vhost。但是,只有在以下情况下才批准连接:vhost用户有权访问。只有管​​理员可以授予和修改用户的访问权限vhost。一个用户可以被授予访问多个vhosts并使用他们的凭据连接到多个vhosts同时(但不不同)vhosts在同一连接内)。

用户权限 https://www.rabbitmq.com/access-control.html#authorisation

然而,用户访问vhost并不是简单的二进制。

RabbitMQ 的区别配置, write and read操作于 一种资源。这配置操作会创建或破坏资源,或者 改变他们的行为。这write操作将消息注入到 资源。还有read操作从资源中检索消息。

文档的链接部分中有一个很好的表格,它表示什么命令算作什么类型的操作,例如queue.bind is a write操作而queue.get is a read手术。然而复杂性并不止于此,实际上是根据自定义向每个操作类型授予权限。正则表达式 https://stackoverflow.com/questions/4736/learning-regular-expressions(正则表达式)由管理员选择。

例如正则表达式'.*' '.*' '.*'允许用户分别配置、写入和读取该资源中的任何资源vhost。这将被授予like so https://www.rabbitmq.com/rabbitmqctl.8.html#set_permissions:

rabbitmqctl set_permissions -p "vhost-name" "username" ".*" ".*" ".*"

而正则表达式'^$' '^(hello).*$' '^(hello|world).*$'不会授予用户任何配置权限,但允许他们写入名称以hello并从名称以以下任一开头的任何资源中读取hello or world.

要点

Use vhosts自由地将资源分组在一起并对这些资源作为一个整体设置权限。

资源的命名是很重要因为这是在给定范围内配置对该资源的访问的唯一方法vhost.

对于OP的问题,每个用户都应该被授予只能根据队列的唯一名称读取和写入自己的队列的权限。这不一定需要跨越多个vhosts但如果有意义的话就可以。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在多租户系统中的 RabbitMQ 中使队列私有/安全? 的相关文章

  • 使用 global-method-security,访问被拒绝错误将作为 HTTP 500 错误返回

    我尝试使用 Spring Security Annotations 来确保安全 而不是在 XML 中定义规则 它似乎有效 但是当我遇到访问被拒绝错误时 我收到返回的 HTTP 状态代码 500 我在 tomcat 日志文件中没有看到任何异常
  • AMQP 消息的版本控制

    是否有关于在 AMQP 中使用版本化消息的既定最佳实践 假设我正在对消息模式进行语义版本控制 我希望支持消息的当前主要版本以及以前的主要版本 这是一个现实的期望吗 处理版本化消息的不同选项有何优缺点 我已经看到版本化路由密钥和版本消息头作为
  • 授予对视图的 SELECT 权限,但不授予对基础对象的 SELECT 权限

    我经常读到 视图的目的之一是安全性 允许某些用户访问基础表 而其他用户仅访问派生视图 考虑到这一点 我设计了几个向外部用户提供受限数据集的视图 一切都很好 但在实践中这是行不通的 我授予后SELECT对视图的权限 除非我授予 否则用户无法访
  • asp.net 保护图像免受其他用户的静态请求?

    我在一个为每个特定用户生成动态图像的网站上工作 有时这些图像包含非常敏感数据的描述 最近 我们开始看到对属于不同用户的图像的请求 其形式为 http myapp images someuid image1 jpg http myapp im
  • 保护一个保存 MySQL 数据库的简单 Linux 服务器?

    这是一个初学者问题 但我浏览了该网站上的许多问题 但没有找到简单直接的答案 我正在设置一个运行 Ubuntu 的 Linux 服务器来存储 MySQL 数据库 该服务器尽可能安全非常重要 据我所知 我主要担心的是传入的 DoS DDoS 攻
  • AMQP如何克服直接使用TCP的困难?

    AMQP如何克服直接使用TCP发送消息时的困难 或者更具体地说 在发布 订阅场景中 在 AMQP 中 有一个代理 该代理接收消息 然后完成将消息路由到交换器和队列的困难部分 您还可以设置持久队列 即使客户端断开连接 也可以为客户端保存消息
  • “您的安全设置已阻止本地应用程序运行”Java 8

    我正在尝试在 Chrome 窗口中运行一个小小程序 但收到错误消息 我确实看到所有回复都告诉我将安全性更改为中级 但版本 8 中不存在该选项 到目前为止 几个小时的谷歌搜索和向同学寻求帮助没有带来任何进展 有人可以建议一下吗 Medium在
  • 如何重置rabbitmq管理用户

    使用rabbitmq 我们可以安装管理插件 然后我们通过浏览器访问http localhost 55672 使用访客 访客 问题是 我无法再登录 因为我更改了密码并为角色输入了空白 有没有办法重置rabbitmq管理的用户 您可以通过以下方
  • 具有桌面应用程序安全性的 OAuth2

    我有一个 Electron 应用程序 它基本上是一个 Google Drive 客户端 我打算使用 OAuth 2 但是 Google API 要求我在生成 client secret 的地方注册我的应用程序 由于这是一个桌面应用程序 因此
  • .NET 声明式安全性:为什么 SecurityAction.Deny 无法使用?

    我已经搞乱了大约一天半的时间 现在正在筛选 NET Reflector 和 MSDN 文档 但无法弄清楚任何事情 在 NET 框架中 您可以通过标记如下方法来要求当前的委托人属于一个能够执行方法的角色 PrincipalPermission
  • 上传的白名单或黑名单文件扩展名?

    我正在制作一个新闻通讯编辑器 它将允许文件上传 新闻通讯的发件人可以将文件上传到将在电子邮件中链接到的服务器 该站点的设置使得只有 do URI 实际由 servlet 执行 处理 因此不会有太大的安全风险 但有人告诉我将 jsp php
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我
  • openssl_crypt 中初始化向量的使用

    我看了一下this https stackoverflow com questions 1391132 two way encryption in php问题 并想为自己做 当我运行这段代码时 直接取自这个答案 https stackove
  • 用户如何登录定义了读者角色的 couchapp?

    我通过 Couchapp 部署了我的应用程序 这意味着整个应用程序是从数据库中提供服务的 我不希望 Couchdb 数据库中的数据公开可用 因此我指定了用户在向他提供数据之前必须具有的读者角色 然而 当我去申请时 我所能得到的是 error
  • 解码 OAEP 填充时出错

    我的问题已经解决了一半 请帮助 我已使用数字签名的公钥成功加密了文本 但在解密时出现错误 解码 OAEP 填充时出错 我的代码如下 region Test Encryption public void a using var rsa new
  • 用于保护网站安全(使用 SSL)时,数字证书如何工作?

    请帮助我了解整个过程是如何进行的 据我了解 Web 浏览器包含 verisign Entrust Comodo 等证书颁发机构 CA 的根证书 但是当用户访问安全页面时到底会发生什么 Web 浏览器是否向 CA 服务器发送请求来验证证书 还
  • Amazon Web Services:设置 S3 策略以允许 putObject 和 getObject 但拒绝 listBucket

    我在 Amazon S3 上使用 getObject 和 putObject 请求 并在创建访问存储桶的策略时发现 如果我不允许 listBucket 则会收到 访问被拒绝 错误 这样做的问题是 listBucket 意味着用户可以列出存储
  • 如何对 Firebase 中托管的静态网站进行 IP 白名单? / 是否有用于 Firebase 托管的 WAF?

    我有一个在 Firebase 中托管的静态网站 我可以很好地附加一个自定义域 我想将对我的网站的访问限制在特定范围的 IP 范围内 我知道在 GCP 中 Google Cloud Armor 可以做到这一点 但 Cloud Armor 仅适
  • 警告:您的 git 版本是 1.9.3。存在严重的安全漏洞

    我在部署到 Heroku 期间收到有关 git 1 9 3 严重安全漏洞的警告 我尝试通过 homebrew 更新 git 但发现 git 最初并不是通过 homebrew 安装的 然后我通过自制程序安装了它 brew update bre
  • 非加密用途的最快哈希值?

    我本质上是在准备要放入数据库的短语 它们可能格式错误 所以我想存储它们的简短散列 我将简单地比较它们是否存在 所以散列是理想的 我假设 MD5 在处理 100 000 个请求时相当慢 所以我想知道散列短语的最佳方法是什么 也许推出我自己的散

随机推荐

  • 通过同时/并发文件传输加速 rsync?

    我们需要转移15TB尽可能快地将数据从一台服务器传输到另一台服务器 我们目前正在使用rsync但我们只能得到大约的速度150Mb s 当我们的网络能够900 Mb s 测试与iperf 我已经对磁盘 网络等进行了测试 发现 rsync 一次
  • C/找到190! C 编程中的(阶乘)

    我尝试寻找190 in C 我将变量定义为 long double 但我发现它 正确 仅计算为 172 之后 我得到了 INF00000 有什么办法可以做到吗 实际上只需几行代码即可实现足够的 bigint 实现来计算阶乘 下面的代码打印前
  • PushSharp 不识别 APN 生产证书

    我开发了一个 iOS 应用程序 可以接收推送通知 我使用 PushSharp 从 NET 环境发送它们 开发过程中一切都很顺利 推送已成功发送 var push new PushBroker var appleCert File ReadA
  • 在 Python 中打印进度条处理

    我编写了这个简单的函数 processing flush 以便打印一系列点 由索引给出 来测试我的软件是否正在处理我的数据以及最终的速度 我的数据的总大小未知 import sys import time def processing fl
  • Jackson JSON - 解组时出现“无单字符串构造函数/工厂方法”错误

    最简单的情况给我带来了问题 我第一次遇到这种情况 我能够解组稍微复杂一点的 json 但是这个简单的失败了 是什么导致了这种情况 为什么杰克逊只用一根弦就遇到麻烦 一个简单的类 保存用户角色的名称 public class UpdateUs
  • javascript排序数组双重排序

    我有一个数组MyArrayOfItems of Item具有如下所示对象的对象 Item ContainerID i int ContainerName SomeName string ItemID j int ItemName SomeO
  • 程序或函数!!!指定的参数太多

    我正在 SQL Server 2008 中开发我的第一个存储过程 需要有关错误消息的建议 过程或函数 xxx 指定了太多参数 执行存储过程后得到的 dbo M UPDATES 调用另一个名为的存储过程etl M Update Promo 打
  • 减少负载后 Kubernetes HPA 不会缩小规模

    当 pod 负载增加时 Kubernetes HPA 可以正常工作 但负载减少后 部署规模不会改变 这是我的 HPA 文件 apiVersion autoscaling v2beta2 kind HorizontalPodAutoscale
  • React Typescript Material-UI useStyles 不可调用

    由于某种原因 我无法调用 useStyles 因为它会出错 This expression is not callable Type never has no call signatures ts 2349 const useStyles
  • 工具栏后退单击在 Xamarin android 中不起作用

    我创建了带有后退箭头的工具栏 单击不起作用 toolbar FindViewById
  • 是否可以在 Access 2010 中创建视图?

    正如标题所说 能做到吗 我在 MSDN 页面上读到 这不受支持 但我的作业请求如何支持 可以吗 怎样才能做到呢 视图只不过是保存的 SQL SELECT 语句 这就是 Access 中保存的查询 当然 您也可以保存 DML SQL 语句 在
  • session.clear() 在 Hibernate 中如何工作

    我参考了很多文章 但我仍然不清楚什么session clear在休眠状态下执行 据我目前了解到的情况来看 当我们使用批量保存 更新时如下图 Session session SessionFactory openSession Transac
  • 由此可以得出 lambda 表达式吗?

    I know from f in list where f bar someVar select f 可以写成 list Where f gt f bar someVar 是否可以创建类似的表达式 from f in foo from b
  • 对对象列表进行排序的最简单方法

    我有一个 A 类型的对象列表 在第一次迭代中 我为每个对象分配一个双精度值 0 目前 我使用一个包装类来存储对象及其 x 值来制作可比较的列表 Scala 是否提供了一种数据类型 允许我执行以下操作 var result new Sorte
  • 附加到条形码应用程序中多个按钮的侦听器中出现异常

    好的 我正在开发一款内部条形码扫描仪 供我的公司在移动计算机和设备时使用 经过一番尝试和错误后 我目前几乎已经通过 Intent 设置了 Zxing 条码扫描仪 这就是我正在尝试做的事情 旁边三个EditText我有三个领域ImageBut
  • android AsyncTask xml解析

    我尝试在 AsyncTask 中解析一个大的 xml 文档 FeinstaubActivity 启动 但我只看到黑屏 然后返回到 RSSReaderActivity 从我启动另一个 Activity 的地方开始 Log DEBUG Sntp
  • 如何在gradle java构建脚本中访问环境变量

    如何在 gradle java 构建脚本中访问环境变量 用户级别或系统级别 我是 gradle 新手 我正在尝试使用 gradle 构建我的项目 目前我已经硬编码了第三方 jar 的路径 如下面的脚本所示 repositories flat
  • 首先在子级的父级上关闭alertDialog Android removeView()

    我想关闭 关闭警报对话框 但是当我单击按钮时valider我遇到了这个错误 我不知道哪些视图给我带来了问题 即使我的视图中没有方法删除视图 layout or v java lang IllegalStateException The sp
  • Imagick PHP 扩展 -- Montage 有帮助吗?

    我在使用 Imagick PHP 扩展生成图像时遇到了一些问题 一切工作正常 除了我的以下 蒙太奇 有白色背景 因此我不能将其覆盖在其他东西之上 如何生成具有透明背景的蒙太奇 Montage Icons gt montageImage ne
  • 如何在多租户系统中的 RabbitMQ 中使队列私有/安全?

    我已阅读开始使用 http www rabbitmq com getstarted htmlRabbitMQ 提供的指南 甚至还贡献了第六个示例暴风雨 amqp https github com paolo losi stormed amq