RabbitMQ 用户和权限管理:命令行指南

掌握 `rabbitmqctl` 命令,实现 RabbitMQ 中健壮的用户和权限管理。本全面指南提供分步说明,涵盖创建新用户、使用标签分配管理员或应用角色、设置细粒度的虚拟主机权限(读取/写入/配置),以及安全撤销访问权限,确保通过命令行进行受控管理。

45 浏览量

管理 RabbitMQ 用户和权限:命令行指南

管理用户和定义访问权限是确保任何消息代理基础设施安全性的基本方面。RabbitMQ 作为一个功能强大的消息代理,提供了强大的用户身份验证和授权机制,主要通过 rabbitmqctl 命令行工具进行管理。本指南专门介绍如何使用 rabbitmqctl 精通用户管理,涵盖从创建、角色分配到跨虚拟主机(vhosts)的详细权限设置等所有内容。

正确配置的权限可确保应用程序和管理员仅在必要时才与代理进行交互,从而最大限度地减少安全风险和操作混乱。通过利用这些命令行工具,您可以高效地编写脚本和自动化复杂的安全设置。

先决条件

在继续之前,请确保具备以下条件:

  1. RabbitMQ 服务器已安装: 消息代理必须正在运行。
  2. rabbitmqctl 访问权限: 您必须拥有必要的权限(通常是管理员权限)才能对正在运行的 RabbitMQ 实例执行命令。命令通常在托管 RabbitMQ 服务器的机器上执行。

使用 rabbitmqctl 管理用户

rabbitmqctl 工具使用 user_* 系列命令进行所有用户相关操作。至关重要的是要理解 RabbitMQ 用户与操作系统用户是不同的。

1. 列出现有用户

要查看当前哪些用户可以访问代理,请使用 list_users 命令:

rabbitmqctl list_users

示例输出:

Listing users ...
user: guest   tags: [administrator]
user: app_prod tags: [policymaker]

2. 创建新用户

设置新的服务账户或管理员时,您必须创建该用户并分配初始密码。

要创建一个名为 api_user,密码为 securepass 的用户:

rabbitmqctl add_user api_user securepass

3. 修改用户标签(角色)

用户标签定义了预设的角色,这些角色授予特定的管理能力。最常见的标签是 administrator(管理员)、policymaker(策略制定者)和 management(管理)。

  • administrator:可以修改用户、权限、vhost,并设置集群参数。
  • policymaker:可以设置策略(例如,用于高可用性或消息 TTL)。
  • management:可以使用管理插件界面(如果已安装)。

查看当前标签

使用 list_user_tags 查看当前角色:

rabbitmqctl list_user_tags api_user

设置或覆盖标签

要为 api_user 分配 management 标签:

rabbitmqctl set_user_tags api_user management

要在现有标签的基础上添加 policymaker 标签,请使用 set_user_tags 命令:

rabbitmqctl set_user_tags api_user administrator policymaker

移除标签

要移除特定标签:

rabbitmqctl clear_user_tags api_user policymaker

4. 更改用户密码

如果需要轮换凭证,请使用 change_password 命令:

rabbitmqctl change_password api_user newsecurepass123

5. 删除用户

要彻底删除用户并撤销所有相关访问权限:

rabbitmqctl delete_user api_user

警告: 出于安全原因,在生产环境中通常建议删除 guest 用户,但这要求您首先创建一个新的管理用户。

管理虚拟主机权限

RabbitMQ 中的权限是基于每个虚拟主机(Virtual Host,简称 vhost)定义的。vhost 充当队列、交换机和绑定(bindings)的命名空间。默认情况下,RabbitMQ 有一个名为 / 的根 vhost。

1. 列出 Vhosts

首先,确定可用的 vhost:

rabbitmqctl list_vhosts

2. 设置用户在 VHost 上的权限

set_permissions 命令对于应用程序安全性至关重要。它授予用户在特定 vhost 内配置、读取或写入资源的权限。

语法: set_permissions <vhost> <user> <conf> <read> <write>

权限值是正则表达式(.* 表示所有资源)。

示例:授予对特定 VHost 的完全访问权限

如果我们希望 app_prod 仅拥有对 /prod_vhost 的完整 CRUD(配置、读取、写入)访问权限:

rabbitmqctl set_permissions -p /prod_vhost app_prod "^.*" "^.*" "^.*" 
权限 含义(正则表达式) 描述
配置 (conf) .* 可以创建/删除交换机、队列、绑定,并设置 vhost 参数。
读取 (read) .* 可以消费消息并获取队列/交换机状态。
写入 (write) .* 可以发布消息并创建绑定。

示例:限制用户只能发布消息

对于“水管”生产者(firehose producers)来说,一种常见的模式是将其限制为仅写入权限:

# 用户 'publisher' 可以写入,但不能配置或读取 /analytics_vhost 中的消息
rabbitmqctl set_permissions -p /analytics_vhost publisher "^$" "^$" "^.*$"

3. 清除权限

要彻底移除用户在特定 vhost 上的所有权限,请使用 clear_permissions

rabbitmqctl clear_permissions -p /prod_vhost app_prod

4. 列出用户权限

要验证授予特定用户在 vhost 上的权限:

rabbitmqctl list_permissions -p /prod_vhost app_prod

用户管理最佳实践

  • 最小权限原则 (PoLP): 始终授予应用程序或用户运行所需的最低权限。除非绝对必要,否则应避免使用 administrator 标签。
  • 专用 Vhosts: 为不同的环境(例如 devstagingprod)使用不同的虚拟主机,并严格控制它们之间的访问权限。
  • 避免使用 Guest 用户: 为了安全起见,默认的 guest 用户应该被禁用或限制(它默认仅拥有对 localhost 的访问权限)。
  • 脚本化: 由于所有这些命令都是幂等的且基于命令行,因此可以将用户设置和清除例程脚本化,以实现一致的部署。

通过掌握这些 rabbitmqctl 命令,您可以对谁可以访问您的消息代理资源获得精细、可脚本化的控制,从而实现更安全、更易于管理的 RabbitMQ 部署。