当前位置:   article > 正文

MQ——RabbitMQ权限管理_rabbitmq 权限控制

rabbitmq 权限控制

摘要

本博文主要围绕RabbitMQ管理这个主题展开,包括多租户、权限、用户、应用和集群管理、服务端状态等方面,并且从侧面讲述rabbitmqctl 工具和rabbitmq_management 插件的使用。

多租户与权限管理

每一个RabbitMQ 服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(virtual host) ,简称为vhost。每一个vhost本质上是一个独立的小型RabbitMQ 服务器,拥有自己独立的队列、交换器及绑定关系等,井且它拥有自己独立的权限。vhost 就像是虚拟机与物理服务器一样,它们在各个实例间提供逻辑上的分离,为不同程序安全保密地运行数据,它既能将同一个RabbitMQ 中的众多客户区分开,又可以避免队列和交换器等命名冲突。vhost 之间是绝对隔离的,无法将vhostl 中的交换器与vhost2 中的队列进行绑定,这样既保证了安全性,又可以确保可移植性。如果在使用RabbitMQ 达到一定规模的时候,建议用户对业务功能、场景进行归类区分,并为之分配独立的vhost。

vhost 是AMQP 概念的基础,客户端在连接的时候必须制定一个vhost. RabbitMQ 默认创建的vhost 为"/" , 如果不需要多个vhost 或者对vhost 的概念不是很理解,那么用这个默认的vhost 也是非常合理的,使用默认的用户名guest 和密码guest 就可以访问它。但是为了安全和方便,建议重新建立一个新的用户来访问它。

  1. 可以使用rabbitmqctl add vhost {vhost} 命令创建一个新的vhost,大括号里的参数表示vhost 的名称。
  2. 示例如下:
  3. [root@nodel -]# rabbitmqctl add vhost vhostl
  4. Creating vhost "vhostl"
  5. 可以使用rabbitmqctl list vhosts [vhostinfoitem...) 来罗列当前vhost 的相关信息。目前vhostinfoitem 的取值有2 个。
  6. name: 表示vhost 的名称。
  7. tracing: 表示是否使用了RabbitMQ 的trace 功能。
  8. 对应的删除vhost 的命令是: rabbitmqctl delete_vhost {vhost) ,其中大括号里面的参数表示vhost 的名称。删除一个vhost 同时也会删除其下所有的队列、交换器、绑定关系、用户权限、参数和策略等信息。
  9. [root@nodel -]# rabbitmqctl delete_vhost vhostl
  10. Deleting vhost "vhostl "
  11. [root@nodel -]# rabbitmqctl list vhosts
  12. Listing vhosts

AMQP 协议中并没有指定权限在vhost 级别还是在服务器级别实现,由具体的应用自定义。在RabbitMQ 中,权限控制则是以vhost 为单位的。当创建一个用户时,用户通常会被指派给至少一个vhost,并且只能访问被指派的vhost 内的队列、交换器和绑定关系等。因此, RabbitMQ中的授予权限是指在vhost 级别对用户而言的权限授予。

  1. 相关的授予权限命令为: rabbitmqctl set permissions [-p vhost] {user)
  2. {conf) {write) {read) 。其中各个参数的含义如下所述。
  3. vhost:授予用户访问权限的vhost名称,可以设置为默认值,即 vhost 为 "/"
  4. user:可以访问指定vhost 的用户名。
  5. conf:一个用于匹配用户在哪些资源上拥有可配置权限的正则表达式。
  6. write:一个用于匹配用户在哪些资源上拥有可写权限的正则表达式。
  7. read:一个用于匹配用户在哪些资源上拥有可读权限的正则表达式。

注:可配直指的是队列和交换器的创建及删除之类的操作;可写指的是发布消息;可读指与消息有关的操作,包括读取消息及清空整个队列等。

用户管理

在RabbitMQ 中,用户是访问控制( Access Contro l)的基本单元,且单个用户可以跨越多个vhost 进行授权。针对一至多个vhost,用户可以被赋予不同级别的访问权限,并使用标准的用户名和密码来认证用户。

创建用户的命令为rabbitmqctl add user {username} {password} 。其中username 表示要创建的用户名称; password 表示创建用户登录的密码。可以通过rabbitmqctl chan ge_password {username} {newpassword} 命令来更改指定用户的密码, 其中username 表示要变更密码的用户名称,newpassword 表示要变更的新的密码。

  1. 具体创建一个用户名为root 、密码为root1 23 的用户:
  2. [root@nodel -] # rabbitmqctl add_user root root123
  3. Creating user "root "
  4. 举例,将root 用户的密码变更为root3 21 :
  5. [root@nodel -] # rabbitmqctl change_password root root321
  6. Changing password for user " root "

同样可以清除密码,这样用户就不能使用密码登录了,对应的操作命令为rabbitmqctl clear password {username} ,其中user口ame 表示要清除密码的用户名称。使用rabbitmqctl  authentiçate_user {userηame} {password} 可以通过密码来验证用户,其中user口ame 表示需要被验证的用户名称, password 表示密码。

删除用户的命令是rabbitmqctl delete user {username) ,其中username 表示要删除的用户名称。

  1. 删除root 用户的示例如下:
  2. [root@nodel - ]# rabbitmqctl delete user root
  3. Deleting user " root"
  1. [root@nodel - ]# rabbitmqctl list users
  2. Listing users
  3. guest [administrator]
  4. root []
  5. 用户的角色分为5 种类型。
  6. none: 无任何角色。新创建的用户的角色默认为none
  7. manageme 口t: 可以访问Web 管理页面。Web 管理页面在5.3 节中会有详细介绍。
  8. policymaker: 包含management 的所有权限,并且可以管理策略( Policy) 和参数Parameter
  9. monitoring: 包含management 的所有权限,并且可以看到所有连接、信道及节点相关的信息。
  10. administartor: 包含monitoring 的所有权限,井且可以管理用户、虚拟主机、权限、策略、参数等。administator 代表了最高的权限。

应用与集群管理

应用管理的相关的命令

  1. ​rabbitmqctl stop [pid_file]
  2. 用于停止运行RabbitMQ 的Erlang 虚拟机和RabbitMQ 服务应用。如果指定了pid_file ,还需要等待指定进程的结束。其中pid file 是通过调用rabbitmq-server 命令启动RabbitMQ 服务时创建的,默认情况下存放于Mnesia 目录中,可以通过RABBITMQ PID FILE这个环境变量来改变存放路径。注意,如果使用rabbitmq -ser ver -detach 这个带有-detach 后缀的命令来启动RabbitMQ 服务则不会生成pid file 文件。
  3. rabbitmqctl shutdown
  4. 用于停止运行RabbitMQ 的Erlang 虚拟机和RabbitMQ 服务应用。执行这个命令会阻塞直到Erlang 虚拟机进程退出。如果RabbitMQ 没有成功关闭,则会返回一个非零值。这个命令和rabbitmqctl stop 不同的是,它不需要指定pid file 而可以阻塞等待指定进程的关闭。
  5. rabbitmqctl stop_ app
  6. 停止RabbitMQ 服务应用,但是Erlang 虚拟机还是处于运行状态。此命令的执行优先于其他管理操作(这些管理操作需要先停止RabbitMQ 应用),比如rabbitmqctl reset
  7. rabbitmqctl start_ app
  8. 启动RabbitMQ 应用。此命令典型的用途是在执行了其他管理操作之后,重新启动之前停止的RabbitMQ 应用,比如rabbitmqctl reset
  9. rabbitmqctl wait [pid_file]
  10. 等待RabbitMQ 应用的启动。它会等到pid_file 的创建,然后等待pid_file 中所代表的进程启动。当指定的进程没有启动RabbitMQ 应用而关闭时将会返回失败。
  11. rabbitmqctl reset
  12. 将RabbitMQ 节点重置还原到最初状态。包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如己配置的用户、vhost 等,以及删除所有的持久化消息。执行rabbi tmqctl reset 命令前必须停止RabbitMQ 应用(比如先执行rabbitmqctlstop_app) 。
  13. rabbitmqctl force reset
  14. 强制将RabbitMQ 节点重置还原到最初状态。不同于rabbitmqctl reset 命令,rabbitmqctl force reset 命令不论当前管理数据库的状态和集群配置是什么,都会无条件地重直节点。它只能在数据库或集群配置己损坏的情况下使用。与rabbitmqctl reset命令一样,执行rabbitmqctl force reset 命令前必须先停止RabbitMQ 应用。
  15. rabbitmqctl rotate_logs {suffix}
  16. 指示RabbitMQ 节点轮换日志文件。RabbitMQ 节点会将原来的日志文件中的内容追加到"原始名称+后缀"的日志文件中,然后再将新的日志内容记录到新创建的日志中(与原日志文件同名)。当目标文件不存在时,会重新创建。如果不指定后缀suffix. 则日志文件只是重新打开而不会进行轮换。示例如下所示,原日志文件为rabbit@nodel .log 和rabbit@nodel-sasl.1og. 轮换日志之后,原日志文件中的内容就被迫加到rabbit@nodel .log.l 和rabbit@nodel-sasl.1og.1 日志中,之后重新建立rabbit@nodel .log 和rabbit@nodel-sasl.1og 文件用来接收新的日志。
  17. rabbitmqctl hipe_compile {directory}
  18. 将部分RabbitMQ 代码用HiPE (HiPE 是指High Performance Erlang ,是Erlang 版的且T)编译,井且将编译后的.beam 文件( beam 文件是Erlang 编译器生成的文件格式,可以直接加载到Erlang 虚拟机中运行的文件格式〉保存到指定的文件目录中。如果这个目录不存在则会自行创建。如果这个目录中原本有任何. beam 文件,则会在执行编译前被删除。如果要使用预编译的这些文件,则需要设置RABBITMQ SERVER CODE PATH 这个环境变量来指定hipe_ compile调用的路径。

集群管理的相关命令

  1. rabbitmqctl joio_cluster {cluster_node} [--ram]
  2. 将节点加入指定集群中。在这个命令执行前需要停止RabbitMQ 应用井重置节点。
  3. rabbitmqctl cluster_status
  4. 显示集群的状态
  5. rabbitmqctl change_cluster_node_type {disclram}
  6. 修改集群节点的类型。在这个命令执行前需要停止RabbitMQ 应用
  7. rabbitmqctl forget_cluster_ node [--offiine]
  8. 将节点从集群中删除,允许离线执行
  9. rabbitmqctl update_ cluster_nodes {clusternode}
  10. 在集群中的节点应用启动前咨询clusternode 节点的最新信息, 井更新相应的集群信息。
  11. rabbitmqctl force_boot
  12. 确保节点可以启动,即使它不是最后一个关闭的节点。通常情况下,当关闭整个RabbitMQ集群时,重启的第一个节点应该是最后关闭的节点,因为它可以看到其他节点所看不到的事情。但是有时会有一些异常情况出现,比如整个集群都掉电而所有节点都认为它不是最后一个关闭的。在这种情况下,可以调用rabbitmqctl force_boot 命令,这就告诉节点可以无条件地启动节点。在此节点关闭后,集群的任何变化,它都会丢失。如果最后一个关闭的节点永久丢失了,那么需要优先使用rabbitmqctl forget cluster 一口ode 一offline 命令,因为它可以确保镜像队列的正常运转。
  13. rabbitmqctl sync_queue [-p vhost] {queue}
  14. 指示未同步队列queue 的slave 镜像可以同步master 镜像行的内容。同步期间此队列会被阻塞(所有此队列的生产消费者都会被阻塞),直到同步完成。此条命令执行成功的前提是队列queue 配置了镜像。注意, 未同步队列中的消息被耗尽后, 最终也会变成同步,此命令主要用于未耗尽的队列。
  15. rabbitmqctl cancel_sync_queue [-p vhost] {queue}
  16. 取消队列queue 同步镜像的操作。
  17. rabbitmqctl set_cluster_name {name}
  18. 设置集群名称。集群名称在客户端连接时会通报给客户端。Federation 和Shovel 插件也会有用到集群名称的地方,详细内容可以参考第8 章。集群名称默认是集群中第一个节点的名称,通过这个命令可以重新设置。在Web 管理界面的右上角(可参考图5 -1 )有个"(生且应)"的地方,点击也可以修改集群名称。

服务端状态管理

  1. rabbitmqctllist_queues [-p vhost] [queueinfoitem ...]
  2. 此命令返回队列的详细信息,如果无[-p vhost] 参数,将显示默认的vhost 为" j " 中的队列详情。queueinfoitem 参数用于指示哪些队列的信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。queueinfoitem 可以是下面列表中的任何值。
  3. rabbitmqctllist_exchanges [-p vhost] [exchangeinfoitem ...]
  4. 返回交换器的详细细节,如果无[ - p vhostl 参数,将显示默认的vhost 为U / " 中的交换器详情。exchangeinfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。exchangeinfoitem 可以是下面列表中的任何值。
  5. rabbitmqctllist_bindings [-p vhost] [bindinginfoitem ...]
  6. 返回绑定关系的细节, 如果无[-p vhostl 参数, 将显示默认的vhost 为"/"中的绑定关系详情。bindinginfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。bindinginfoitem 可以是下面列表中的任何值。
  7. rabbìtmqctllìst_connectìons [connectìonìnfoìtem ...]
  8. 返回TCP!IP连接的统计信息。connectioninfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。connectioninfoitem 可以是下面列表中的
  9. 任何值。
  10. rabbitmqctllist_ channels [channelinfoitem ...]
  11. 返回当前所有信道的信息。channelinfoitem 参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。channelinfoitem 可以是下面列表中的任何值。
  12. rabbitmqctllist_consumers [-p vhost]
  13. 列举消费者信息。每行将显示由制表符分隔的己订阅队列的名称、相关信道的进程标识、consumerTag、是否需要消费端确认、prefetch_ count 及参数列表这些信息。
  14. rabbitmqctl status
  15. 显示Broker 的状态, 比如当前Erlang 节点上运行的应用程序、RabbitMQÆrlang 的版本信息、os 的名称、内存及文件描述符等统计信息
  16. rabbitmqctl node_health_check
  17. 对RabbitMQ 节点进行健康检查, 确认应用是否正常运行、list queues 和list channels是否能够正常返回等。
  18. rabbitmqctl environment
  19. 显示每个运行程序环境中每个变量的名称和值。
  20. rabbitmqctl report
  21. 为所有服务器状态生成一个服务器状态报告,井将输出重定向到一个文件
  22. rabbitmqctl eval {expr}
  23. 执行任意Erlang 表达式。相关示例如下(示例命令用于返回rabbitmqctl 连接的节点名称)

HTTPAPI接口管理

 

 

 

 

博文参考

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/512039
推荐阅读
相关标签
  

闽ICP备14008679号