管理用户、虚拟主机和权限

使用 RabbitMQ 用户、虚拟主机和权限来隔离应用程序,并降低凭据泄露带来的影响。生产工作负载不应与应用程序客户端共享平台生成的管理员账户。

本指南说明如何创建虚拟主机、创建应用程序用户,以及授予最小权限。

前提条件

在管理用户和权限之前,请确保满足以下条件:

  1. 你拥有 RabbitMQ Pod 的管理端点或 kubectl exec 访问权限。
  2. 你拥有管理员凭据。有关平台生成的默认账户,请参见 User Management
  3. 你了解应用程序所需的虚拟主机名称、应用程序用户名,以及交换机或队列命名模式。

权限模型

RabbitMQ 权限的作用域限定在虚拟主机级别,并包含三个正则表达式:

权限控制内容
configure用户可以声明、删除或修改哪些资源。
write用户可以向哪些交换机发布消息。
read用户可以从哪些队列消费,以及可以从哪些交换机进行绑定。

为应用程序用户使用更窄的正则表达式。仅将 administrator 标签授予需要跨实例具备管理权限的运维用户。

操作步骤

1. 创建虚拟主机

为该应用程序创建一个虚拟主机:

rabbitmqadmin \
  --host <management-host> \
  --port 15672 \
  --username <admin-user> \
  --password <admin-password> \
  declare vhost name=payments

对于在 RabbitMQ Pod 内执行的命令,你也可以使用 rabbitmqctl

kubectl -n <namespace> exec <instance-name>-server-0 -- \
  rabbitmqctl add_vhost payments

2. 创建应用程序用户

为该应用程序创建一个用户。不要将该用户重复用于管理。

rabbitmqadmin \
  --host <management-host> \
  --port 15672 \
  --username <admin-user> \
  --password <admin-password> \
  declare user name=payments-app password='<strong-password>' tags=

如果你使用 rabbitmqctl,请运行:

kubectl -n <namespace> exec <instance-name>-server-0 -- \
  rabbitmqctl add_user payments-app '<strong-password>'

将应用程序密码存储在 Kubernetes Secret 中,或存储在你批准的密钥管理器中。不要将其以明文形式存储在应用程序清单中。

3. 授予应用程序权限

以下示例允许 payments-app 用户在 payments 虚拟主机中配置、发布到以及消费以 payments. 开头的资源:

rabbitmqadmin \
  --host <management-host> \
  --port 15672 \
  --username <admin-user> \
  --password <admin-password> \
  declare permission \
  vhost=payments \
  user=payments-app \
  configure='^payments\.' \
  write='^payments\.' \
  read='^payments\.'

等效的 rabbitmqctl 命令为:

kubectl -n <namespace> exec <instance-name>-server-0 -- \
  rabbitmqctl set_permissions -p payments payments-app \
  '^payments\.' '^payments\.' '^payments\.'

4. 在需要时授予 topic 权限

如果应用程序使用 topic 授权,请将 topic 权限与资源权限分开定义:

kubectl -n <namespace> exec <instance-name>-server-0 -- \
  rabbitmqctl set_topic_permissions -p payments payments-app amq.topic \
  '^payments\.' '^payments\.'

仅当你的授权模型需要时才配置 topic 权限。

5. 验证访问

列出虚拟主机、用户和权限:

rabbitmqadmin \
  --host <management-host> \
  --port 15672 \
  --username <admin-user> \
  --password <admin-password> \
  list vhosts name

rabbitmqadmin \
  --host <management-host> \
  --port 15672 \
  --username <admin-user> \
  --password <admin-password> \
  list users name tags

rabbitmqadmin \
  --host <management-host> \
  --port 15672 \
  --username <admin-user> \
  --password <admin-password> \
  list permissions user vhost configure write read

使用应用程序用户验证应用程序连接性,不要使用管理员账户。

推荐实践

  • 为每个应用程序或租户边界创建专用虚拟主机。
  • 为每个应用程序运行时身份创建一个 RabbitMQ 用户。
  • 对应用程序用户使用更窄的权限正则表达式,而不是 .*
  • 将管理员用户与生产者和消费者用户分开。
  • 通过 Kubernetes Secret 更新或你批准的密钥管理器轮换应用程序密码。
  • 在应用程序下线时移除用户和权限。

相关信息