Access Control (Authentication, Authorisation) in RabbitMQ
認證和授權這兩個概念經常容易被混淆,甚至被互換使用。在RabbitMQ中這是錯的,它們是兩個獨立的概念。可以簡單的這樣理解,認證就是“識別這個使用者是誰”,而授權就是“決定哪些使用者不能這麼做”。
Default Virtual Host and User
當伺服器第一次啟動執行的時候,並且檢測到它的資料庫沒有被初始化或者已經被刪除了,那麼它將用下面這樣的資源配置初始化一個新的資料庫:
- 一個虛擬主機,名字叫/
- 一個名字叫guest的使用者,並且密碼也是guest,它可以訪問/下面的所有資源
我們建議刪除guest使用者,或者修改它的密碼,尤其是當你的MQ是公共訪問的時候。
"guest" user can only connect via localhost
預設情況下,guest使用者被禁止通過遠端連線到RabbitMQ,它只能用localhost連線。你自己建立的其它的使用者不會受限於這一條。
這個配置是通過配置檔案中的loopback_users來設定的。
如果你希望guest使用者從遠端主機連線上來,你應該設定loopback_users為none。一個完整的配置應該是這樣的:
或者在rabbitmq.config中這樣配置:
How Permissions Work
當一個RabbitMQ客戶端和伺服器建立一個連線的時候,它指定一個它打算操作的虛擬主機。第一個級別的訪問控制就在這個這裡,這個時候伺服器會檢查這個使用者是否有許可權訪問該虛擬主機。
資源,比如:交換機和佇列,它們是在一個特定的虛擬主機下被命名的實體。相同名字在不同的虛擬主句中表示不同的資源。第二級別的訪問控制就是強制檢查對資源的某個確定的操作是否被允許執行。
RabbitMQ對一個資源有configure(配置)、read(讀)、write(寫)操作。(PS:簡單的理解就是讀、寫、執行這三種操作,俗稱rwx)
- configure操作指的是建立或者銷燬資源
- write操作指的是注入一個訊息到資源中
- read操作指的是從資源中檢索一個訊息
小結:
第一級別的訪問控制是在客戶端與伺服器建立連線的時候檢查使用者對虛擬主機是否有訪問許可權
第二級別的訪問控制是在執行操作的時候檢查使用者是否對資源有相應的訪問許可權
為了在資源上執行操作,使用者必須被授權相應的許可權。下面這個表顯示的是在執行AMQP命令的時候需要哪些許可權:
許可權用正在表示式來表示
參考 http://www.rabbitmq.com/access-control.html