跳到主要内容

你是谁?RabbitMQ 2.3.1 中的身份验证和授权

·阅读时间:4 分钟
Simon MacMullen

RabbitMQ 2.3.1 引入了几个新的插件机制,允许您更有效地控制用户如何验证其身份以及如何确定用户的授权操作。这里有三个需要关注的问题

  1. 客户端如何证明其身份?
  2. 用户和身份验证信息(例如,密码哈希值)存储在哪里?
  3. 权限信息存储在哪里?

对于 AMQP 中的第一个问题,答案是 SASL - 一个简单协议,用于可插拔的身份验证机制,嵌入在 AMQP(以及各种其他协议)中。SASL 允许客户端和服务器协商并使用身份验证机制,而“外部”协议无需了解身份验证的任何细节。

SASL 提供了许多“机制”。从一开始,RabbitMQ 就支持 PLAIN 机制,该机制基本上是在网络上以明文形式发送用户名和密码(当然,整个连接可能受 SSL 保护)。它还支持变体 AMQPLAIN 机制(在概念上与 PLAIN 相同,但如果您有 AMQP 编解码器,则更容易实现)。RabbitMQ 2.3.1 添加了一个插件系统,允许您添加或配置更多机制,我们编写了一个示例插件,它实现了 SASL EXTERNAL 机制。

SASL EXTERNAL 机制基本上表示“通过协议上下文之外的某些机制确定用户的身份”。在 rabbitmq-auth-mechanism-ssl 中,我们认为这应该是 SSL。安装此插件并 启用 后,如果客户端使用 SSL 连接并提供服务器 CA 信任的客户端证书,则它们可以在没有用户名和密码的情况下连接。在这种情况下,我们将用户名视为所呈现证书的公用名。只要该用户名存在,就会被允许登录。

但该用户名是否存在?针对该用户名记录了哪些权限?这里我们就要面对第二个问题(即身份验证)和第三个问题(即授权)。

同样,从一开始,RabbitMQ 就包含一个内部用户和权限数据库,可以通过 rabbitmqctl 和最近的 管理插件 进行管理。同样,RabbitMQ 2.3.1 添加了一个插件系统,允许您增强或替换此数据库。

同样,我们编写了一个插件来做一些有趣的事情。 rabbitmq-auth-backend-ldap 允许您对用户进行身份验证并检查针对 LDAP 数据库的授权。这可以完全替换内置数据库,也可以只增强它。 配置此插件以进行身份验证 相对容易,只要您有一个 LDAP 服务器在运行;您需要提供所有用户的模板区分名称(例如,以“guest”身份登录的用户可能具有 DN“cn=guest,ou=People,dc=example,dc=com”,并且插件将尝试绑定到 LDAP 服务器以检查他们是否可以登录。很简单!

但是,配置插件以进行授权很困难。好吧,很复杂。问题是 LDAP 没有关于 AMQP 代理中权限应该如何工作的想法(这是一个可怕的疏忽!),因此我们需要自己决定一些规则。 README-authorisation 文档详细介绍了其工作原理,简而言之,它提供了一个简单的分层查询机制,使您可以构建针对 LDAP 数据库的查询。例如

{vhost_access_query, {exists, "ou=${vhost},ou=vhosts,dc=example,dc=com"}}

是一个简单的查询,它根据 LDAP 中是否存在相应的组织单位来确定 LDAP 用户是否可以查看虚拟主机,而

{resource_access_query,
{for, [{resource, exchange,
{for, [{permission, configure,
{ in_group, "cn=wheel,ou=groups,dc=example,dc=com" } },
{permission, write, {constant, true}},
{permission, read, {constant, true}}
]}},
{resource, queue, {constant, true}} ]}}

是一个更复杂的查询,它允许“wheel”组的成员声明和删除交换机,并允许所有用户执行其他所有操作。

那么,你觉得怎么样?这对你有用吗?如何改进?

© 2024 RabbitMQ. All rights reserved.