what is virtual_host
vhost是rabbitmq分配權限的最小細粒度。比如我們可以為一個用戶分配一個可以訪問哪個或者哪一些vhost的權限。
但是不能為用戶分配一個可以訪問哪一些exchange,或者queue的權限,因為rabbitmq的權限細粒度沒有細化到交換器和隊列,他的最小細粒度是vhost(vhost中包含許多的exchanges,queues,bingdings)。
所以如果exchangeA 和queueA 只能讓用戶A訪問,exchangeB 和queueB 只能讓用戶B訪問,要達到這種需求,只能為exchangeA 和queueA創建一個vhostA,為exchangeB 和queueB 創建vhostB,這樣就隔離開來了。
補充:一個broker可以開設多個vhost,用於不同用戶的權限分離
virtual host只是起到一個命名空間的作用,所以可以多個user共同使用一個virtual host,文章開頭寫的vritual_host = '/',這個是系統默認的,
就是說當我們創建一個到rabbitmq的connection時候,它的命名空間是'/',需要注意的是不同的命名空間之間的資源是不能訪問的,比如 exchang,queue ,bingding等
How does it work
查看rabbitmqctl工具相關命令
rabbitmqctl
查看所有虛擬主機
rabbitmqctl list_vhosts
添加vhost
rabbitmqctl add_vhost test_vhost
rabbitmqctl list_vhosts
可以看到有兩個,一個是系統默認的 '/', 還有一個就是我們新建的 test_host
add_user 添加用戶
rabbitmqctl add_user test1 123456
rabbitmqctl add_user test2 123456
rabbitmqctl list_users
用戶的管理命令
add_user <username> <password>
delete_user <username>
change_password <username> <newpassword>
clear_password <username>
authenticate_user <username> <password>
set_user_tags <username> <tag> ...
list_users
set_permissions 分配訪問權限
set_permissions [-p <vhost>] <user> <conf> <write> <read>
其中,權限控制(配置,讀,寫)
需要注意的是RabbitMQ會緩存每個connection或channel的權限驗證結果、因此權限發生變化后需要重連才能生效。
rabbitmqctl set_permissions -p test_host test1 ".*" ".*" ".*"
rabbitmqctl set_permissions -p test_host test2 ".*" ".*" ".*"
角色
Comma-separated list of tags to apply to the user. Currently supported by the management plugin:
management
User can access the management plugin
policymaker
User can access the management plugin and manage policies and parameters for the vhosts they have access to.
monitoring
User can access the management plugin and see all connections and channels as well as node-related information.
administrator
User can do everything monitoring can do, manage users, vhosts and permissions, close other user's connections, and manage policies and parameters for all vhosts.
Note that you can set any tag here; the links for the above four tags are just for convenience.
RabbitMQ的用戶角色分類:
none、management、policymaker、monitoring、administrator
RabbitMQ各類角色描述:
none
不能訪問 management plugin
management
用戶可以通過AMQP做的任何事外加:
列出自己可以通過AMQP登入的virtual hosts
查看自己的virtual hosts中的queues, exchanges 和 bindings
查看和關閉自己的channels 和 connections
查看有關自己的virtual hosts的“全局”的統計信息,包含其他用戶在這些virtual hosts中的活動。
policymaker
management可以做的任何事外加:
查看、創建和刪除自己的virtual hosts所屬的policies和parameters
monitoring
management可以做的任何事外加:
列出所有virtual hosts,包括他們不能登錄的virtual hosts
查看其他用戶的connections和channels
查看節點級別的數據如clustering和memory使用情況
查看真正的關於所有virtual hosts的全局的統計信息
administrator
policymaker和monitoring可以做的任何事外加:
創建和刪除virtual hosts
查看、創建和刪除users
查看創建和刪除permissions
關閉其他用戶的connections
創建用戶並設置角色:
可以創建管理員用戶,負責整個MQ的運維,例如:
rabbitmqctl add_user user_admin passwd_admin
賦予其administrator角色:
rabbitmqctl set_user_tags user_admin administrator
可以創建RabbitMQ監控用戶,負責整個MQ的監控,例如:
rabbitmqctl add_user user_monitoring passwd_monitor
賦予其monitoring角色:
rabbitmqctl set_user_tags user_monitoring monitoring
可以創建某個項目的專用用戶,只能訪問項目自己的virtual hosts
rabbitmqctl add_user user_proj passwd_proj
賦予其monitoring角色:
rabbitmqctl set_user_tags user_proj management
創建和賦角色完成后查看並確認:
rabbitmqctl list_users
參考資料
參考資料