跳到主要内容

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

·4 分钟阅读
Simon MacMullen

RabbitMQ 2.3.1 引入了几个新的插件机制,使您能够更好地控制用户如何针对 Rabbit 进行身份验证,以及我们如何确定他们被授权执行的操作。这里有三个需要关注的问题

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

问题 1 在 AMQP 的情况下由 SASL 回答 - 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 信任的客户端证书,则客户端无需提供用户名和密码即可连接。在这种情况下,我们将用户名视为所提供证书的公用名。只要该用户名存在,他们就可以进入。

但是该用户名是否存在?并且针对它记录了哪些权限?这就是我们面对问题 2(即身份验证)和问题 3(即授权)的地方。

同样,从一开始,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 broker 中工作(可怕的疏忽!),因此我们需要自己决定一些规则。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”组的成员声明和删除交换机,并允许所有用户执行其他所有操作。

那么,您怎么看?这对您 有用 吗?如何改进?

© . All rights reserved.