本文介绍了 RabbitMQ 中的身份验证和授权功能,它们共同帮助操作员控制系统的访问。不同的用户只能被授予访问特定虚拟主机的权限,并且还可以限制他们在每个虚拟主机中的权限。RabbitMQ 支持两种主要的身份验证机制以及多种身份验证和授权后端。
当客户端连接到 RabbitMQ 时,它们会指定一组凭证:用户名/密码对、JWT 令牌或 x.509 证书。每个连接都关联一个经过身份验证的用户。它还会指向一个虚拟主机,用户必须拥有该虚拟主机的特定权限。
用户凭证、目标虚拟主机和(可选)客户端证书在连接启动时指定。有一对默认的凭证,称为默认用户。默认情况下,此用户只能用于主机本地连接,使用默认用户的远程连接将被拒绝。生产环境不应使用默认用户,请使用生成的凭据创建新的用户账户。
应用程序连接到 RabbitMQ 后,在执行操作之前,必须进行身份验证,即提供并证明其身份。凭借该身份,RabbitMQ 节点可以查找其权限并授权访问虚拟主机、队列、交换器等资源。
客户端身份验证的两种主要方式是用户名/密码对和 X.509 证书。
- 用户名/密码对可以与各种用于验证凭据的身份验证后端一起使用。身份验证失败的连接将被关闭,并在服务器日志中记录一条错误消息。
- 要使用 X.509 证书对客户端连接进行身份验证,必须启用内置插件 rabbitmq-auth-mechanism-ssl,并将客户端配置为使用 EXTERNAL 机制。使用此机制,任何客户端提供的密码都将被忽略。
请通过以下方式添加一个用于读写的管理员账号以及一个用于运维管理的管理员账号,数据读写和运维管理使用两个独立的管理员账号,避免权限扩大和混用。
- 通过开源 RabbitMQ 控制台添加账号,详细操作请参见开源 RabbitMQ 产品文档。
- 通过火山引擎 RabbitMQ版控制台添加账号,详细操作请参见创建实例的步骤 7。
说明
请不要在开源 RabbitMQ 控制台修改火山引擎 RabbitMQ版控制台添加的管理员账号和密码,如果需要,请直接在火山引擎 RabbitMQ版控制台修改。
当 RabbitMQ 客户端与服务器建立连接并进行身份验证时,它会指定一个虚拟主机,用于其运行。此时会强制执行第一级访问控制,服务器会检查用户是否具有访问虚拟主机的权限,否则拒绝连接尝试。
资源(例如交换器和队列)是特定虚拟主机内的命名实体;相同的名称在每个虚拟主机中表示不同的资源。当对资源执行某些操作时,会强制执行第二级访问控制。
RabbitMQ 区分资源上的configure、 write和read操作。
- configure操作:用于创建或销毁资源,或更改其行为。
为了对资源执行操作,用户必须被授予适当的权限。
下表显示了所有执行权限检查的 AMQP 0-9-1 命令需要对哪种类型的资源具有什么权限。
MQTT 协议没有交换器、队列和绑定的概念。我们的 MQTT 插件基于 AMQP 协议构建,并使用相同的权限系统。您可以在 MQTT Plugin 中了解更多信息。 下表显示了所有执行权限检查的 MQTT 命令需要对哪种类型的资源具有什么权限。
PUBLISH 操作也需要通过主题授权。
权限以三元正则表达式表示,每个虚拟主机的权限分别对应配置、写入和读取。用户被授予对所有名称与正则表达式匹配的资源的操作权限。例如,上表表明queue.bind协议操作需要对目标队列具有写入权限,并且需要对目标交换机具有读取权限。
换句话说,为了允许用户将名为 queueA 的队列绑定到名为 exchangeB 的交换机,用户将需要写入权限正则表达式(对于正确的虚拟主机)来匹配 queueA,以及读取权限正则表达式来匹配 exchangeB。为了方便起见,RabbitMQ 在执行权限检查时将 AMQP 0-9-1 默认交换的空白名称映射到“amq.default”。
正则表达式'^$'(即只匹配空字符串)涵盖所有资源,并有效阻止用户执行任何操作。内置 AMQP 0-9-1 资源名称以amq.为前缀,服务器生成的名称以amq.gen为前缀。例如,'^(amq\.gen.*|amq\.default)$' 允许用户访问服务器生成的名称和默认交换。空字符串''与'^$'同义,以完全相同的方式限制权限。
RabbitMQ 可能会根据每个连接或每个通道缓存访问控制检查的结果。因此,用户权限的更改可能仅在用户重新连接时生效。有关如何设置访问控制的详细信息,请参阅管理用户和权限部分以及 rabbitmqctl 文档。