User即用戶,他們代表可以通過keystone進行訪問的人或程序。Users通過認證信息(credentials,如密碼、API Keys等)進行驗證。
TenantTenant即租戶,它是各個服務中的一些可以訪問的資源集合。例如,在Nova中一個tenant可以是一些機器,在Swift和Glance中一個tenant可以是一些鏡像存儲,在Quantum中一個tenant可以是一些網絡資源。Users默認的總是綁定到某些tenant上。
RoleRole即角色,Roles代表一組用戶可以訪問的資源權限,例如Nova中的虛擬機、Glance中的鏡像。Users可以被添加到任意一個全局的 或 租戶內的角色中。在全局的role中,用戶的role權限作用于所有的租戶,即可以對所有的租戶執行role規定的權限;在租戶內的role中,用戶僅能在當前租戶內執行role規定的權限。
ServiceService即服務,如Nova、Glance、Swift。根據前三個概念(User,Tenant和Role)一個服務可以確認當前用戶是否具有訪問其資源的權限。但是當一個user嘗試著訪問其租戶內的service時,他必須知道這個service是否存在以及如何訪問這個service,這里通常使用一些不同的名稱表示不同的服務。在上文中談到的Role,實際上也是可以綁定到某個service的。例如,當swift需要一個管理員權限的訪問進行對象創建時,對于相同的role我們并不一定也需要對nova進行管理員權限的訪問。為了實現這個目標,我們應該創建兩個獨立的管理員role,一個綁定到swift,另一個綁定到nova,從而實現對swift進行管理員權限訪問不會影響到Nova或其他服務。
EndpointEndpoint,翻譯為“端點”,我們可以理解它是一個服務暴露出來的訪問點,如果需要訪問一個服務,則必須知道他的endpoint。因此,在keystone中包含一個endpoint模板(endpoint template,在安裝keystone的時候我們可以在conf文件夾下看到這個文件),這個模板提供了所有存在的服務endpoints信息。一個endpoint template包含一個URLs列表,列表中的每個URL都對應一個服務實例的訪問地址,并且具有public、private和admin這三種權限。public url可以被全局訪問(如http://compute.example.com),private url只能被局域網訪問(如http://compute.example.local),admin url被從常規的訪問中分離。
二、keystone 的訪問流程通俗的講,token 是用戶的一種憑證,需拿正確的用戶名/密碼向 Keystone 申請才能得到。如果用戶每次都采用用戶名/密碼訪問 OpenStack API,容易泄露用戶信息,帶來安全隱患。所以 OpenStack 要求用戶訪問其 API 前,必須先獲取 token,然后用 token 作為用戶憑據訪問 OpenStack API。
以創建一個虛擬機(server)為例,結合上圖簡述下keystone在openstack的訪問流程。
* 用戶Alice通過自己的戶名和密碼向keystone申請token,keystone認證用戶名和密碼后,返回token1
* Alice通過token1發送keystone查詢他所擁有的租戶,keystone驗證token1成功后,返回Alice的所有Tenant
* Alice選擇一個租戶,通過用戶名和密碼申請token,keystone認證用戶名、密碼、tenant后,返回token2。(其實1、2步僅僅是為了查詢tenant,如果已經知道tenant,可以忽略1、2步)
* Alice通過token2發送創建server的請求,keystone驗證token2(包括該token是否有效,是否有權限創建虛擬機等)成功后,然后再把請求下發到nova,最終創建虛擬機。
我們知道要創建虛擬機,一定是某一租戶下的用戶來創建的,因此在創建之前用戶要獲取自己所能訪問到的租戶 (一個用戶可以屬于多個租戶),要想獲取用戶能訪問的所有租戶需要從keystone獲取一個不與任何租戶相關聯的臨時Token. 我們可以使用keystone的標準REST API獲取某一用戶能訪問的所有租戶,注意這里不要在請求體中設置租戶名。
示例請求: