1. 程式人生 > >RabbitMQ許可權控制原理

RabbitMQ許可權控制原理

我們在使用MQ搭建系統的時候,經常要開放佇列給外接系統訪問。外接系統的穩定性是不可控的。為了防止外接系統不穩定導致誤操作破壞了MQ的配置或資料,需要對MQ做比較精細的許可權控制。

我的需求是這樣的:

我有一個數據查詢服務,並且通過MQ推送資料變動訊息。對接MQ的每個系統都會有自己一個獨立的佇列來讀取訊息。所有訊息通過一個扇形交換機廣播到所有佇列。我需要這個交換機和所有佇列都由管理員統一建立好。而其他系統使用的使用者,均沒有建立交換機和佇列的許可權。資料查詢服務只擁有推送訊息的許可權,其他對接MQ的系統只擁有從自己佇列讀取訊息的許可權。

我們使用的MQ是RabbitMQ。我在網上搜了一下,大部分講的是使用者角色配置。對於MQ的資源授權管理講的比較少。以下內容將主要講解RabbitMQ許可權控制的基本概念和模型

。理解了這些基本概念後,應該可以愉快地使用RabbitMQ管理介面進行授權操作。如果你們只有命令列可用,也能很輕鬆地找到相應的命令。

RabbitMQ初始化

RabbitMQ初次啟動時,初始建立這兩個東西:

  • 一個名稱為/的virtual host
  • guest使用者,擁有/的全部許可權,只能localhost訪問

RabbitMQ授權模型

第一級控權單位是virtual host,virtual host下面第二級的控權單位是resource(包含exchange和queue)。兩個相同名稱的resource如果分屬不同的virtual host,則算是不同的resource。

什麼是virtual host:

RabbitMQ is multi-tenant system: connections, exchanges, queues, bindings, user permissions, policies and some other things belong to virtual hosts, logical groups of entities.

就是說RabbitMQ是多租戶系統,簡單理解就是把多virtual host當做多個MQ系統來用就好了……

當用戶訪問MQ時,首先觸發第一級控權,判斷使用者是否有訪問該virtual host的許可權

若可訪問,則進行第二級控權,判斷使用者是否具有操作(operation)所請求的資源的許可權

RabbitMQ定義了操作(operation)有這麼三種:

  • configure:主要對應建立exchange和queue操作;
  • write:write主要對應繫結和推送訊息操作;
  • read:read主要對應讀取訊息操作。

後面有個表格列出了具體的對應關係。

當管理員對一個使用者進行授權時,要配置兩個元素:

  1. 允許什麼操作,即configure、write、read三種operation;
  2. 操作什麼resource。使用者是否擁有某資源的許可權,通過對該資源的名稱與授權時配置的正則進行匹配來判斷。

下面這張表詳細描述了operation、resource和使用者可執行的操作的關係:

例子:

  • 如果要給使用者授權可以往exchange foo推訊息,則我們找到basic.publish這行,格子不是空的只有write這列,所以我們需要給使用者授權一個write許可權,其正則可以匹配字串foo(比如說^foo$,或者.*等)。
  • 如果要給使用者授權只能從queue bar讀取訊息,則需要給使用者授權一個read許可權,其正則可以匹配字串bar

進一步瞭解

本文內容基本來自官網手冊,如果需要更詳細的說明——比如說topic的授權,可以直接看手冊。很多時候,當你剛接觸一個新工具時,比起在網際網路上瞎逛,直接閱讀官方手冊效率會高很多。雖然手冊比較冗長,而且大部分只有純英文,但畢竟最遠的路,就是最快的捷徑。