本文介紹OpenStack的認證服務子產品Keystone
一、Keystone介紹
OpenStack Identity(Keystone)服務為運作OpenStack Compute上的OpenStack雲提供了認證和管理使用者、帳号和角色資訊服務,并為OpenStack Object Storage提供授權服務。
OpenStack的身份服務提供了內建的管理身份驗證,授權和服務目錄服務的單點,其他的OpenStack服務使用的身份服務作為一個通用統一的API,此外,提供有關使用者的資訊,但該服務不包括開棧(如LDAP服務)可以被內建到一個預先存在的基礎設施,為了從身份服務中受益,其他的OpenStack服務需要與它合作。當一個開棧服務從使用者接收請求時,它檢查與使用者是否被授權作出該請求的辨別服務。
1.Keystone的元件
- 伺服器:中央伺服器提供了一種使用RESTful接口驗證和授權服務。
- 驅動程式:驅動程式或服務後端被內建到中央伺服器。它們被用于在庫外的OpenStack通路身份資訊,并且可以在開棧中部署(例如,SQL資料庫或LDAP伺服器)的基礎設施已經存在。
-
子產品:中間件子產品中正在使用該辨別服務的開棧元件的位址空間中運作。這些子產品攔截服務請求,提取使用者憑據,并将它們發送到中央伺服器進行授權。中間件子產品和OpenStack的元件之間的內建使用Python的Web伺服器網關接口。
當安裝OpenStack的身份服務,您必須在您的OpenStack安裝注冊的每個服務。然後身份服務可以跟蹤安裝哪些開棧的服務,并且它們的位置在網絡上。
OpenStack的身份服務提供了內建的管理身份驗證,授權和服務目錄服務的單點。
- 使用者與認證:使用者權限與使用者登入密碼認證等。。
- 服務目錄:提供一個服務目錄,記錄所有服務對應的IP位址資訊。
2.Keystone的管理對象
項目(V3版Project(早期版本Tenant))
可以了解為一個人、或服務所擁有的 資源集合 。在一個Project(Tenant)中可以包含多個User,每一個User都會根據權限的劃分來使用Project(Tenant)中的資源。比如通過Nova建立虛拟機時要指定到某個Project中,在Cinder建立卷也要指定到某個Project中。User通路Project的資源前,必須要與該Project關聯,并且指定User在Project下的Role。
使用者(User)
代表一個個體,OpenStack以使用者的形式來授權服務給它們。使用者擁有證書(credentials),且可能配置設定給一個或多個租戶。經過驗證後,會為每個單獨的租戶提供一個特定的令牌。
證書(credentials)
為了給使用者提供一個令牌,需要用證書來唯一辨別一個Keystone使用者的密碼或其它資訊
令牌(token)
是一個字元串表示,作為通路資源的令牌。Token包含了在 指定範圍和有效時間内 可以被通路的資源。EG. 在Nova中一個tenant可以是一些虛拟機,在Swift和Glance中一個tenant可以是一些鏡像存儲,在Network中一個tenant可以是一些網絡資源。Token一般被User持有。
角色(Role)
用于劃分權限。可以通過給User指定Role,使User獲得Role對應的操作權限。Keystone傳回給User的Token包含了Role清單,被通路的Services會判斷通路它的User和User提供的Token中所包含的Role。系統預設使用管理Role admin和成員Role member 。
Policy
OpenStack對User的驗證除了OpenStack的身份驗證以外,還需要鑒别User對某個Service是否有通路權限。Policy機制就是用來控制User對Tenant中資源(包括Services)的操作權限。對于Keystone service來說,Policy就是一個JSON檔案,預設是/etc/keystone/policy.json。通過配置這個檔案,Keystone Service實作了對User基于Role的權限管理。
Authentication
确定使用者身份的過程
服務目錄(Service Catalog)
Keystone為OpenStack安裝提供了一個REST API端點清單并以此作為決策參考。
Service
Openstack service,即Openstack中運作的元件服務。
Endpoint
一個可以通過網絡來通路和定位某個Openstack service的位址,通常是一個URL。比如,當Nova需要通路Glance服務去擷取image 時,Nova通過通路Keystone拿到Glance的endpoint,然後通過通路該endpoint去擷取Glance服務。我們可以通過Endpoint的region屬性去定義多個region。Endpoint 該使用對象分為三類:
- admin url –> 給admin使用者使用,Post:35357
- internal url –> OpenStack内部服務使用來跟别的服務通信,Port:5000
- public url –> 其它使用者可以通路的位址,Post:5000
public url可以被全局通路,private url隻能被區域網路通路,admin url被從正常的通路中分離。
3.Keystone管理對象之間的關系

二、Keystone V3版的改進
- Tenant 重命名為 Project
- 添加了 Domain 的概念
- 添加了 Group 的概念
問題1:在Keystone V2中,資源配置設定是以Tenant為機關的,這不太符合現實世界中的層級關系。如一個公司在 Openstack中擁有兩個不同的項目,他需要管理兩個Tenant來分别對應這兩個項目,并對這兩個Tenant中的使用者分别配置設定角色。由于在Tenant之上并不存在一個更高層的概念,無法對 Tenant 進行統一的管理,是以這給多 Tenant 的使用者帶來了不便。
解決:V3 利用 Domain 的概念實作真正的多租戶(multi-tenancy)架構,Domain 擔任 Project 的高層容器。雲服務的客戶是 Domain 的所有者,他們可以在自己的 Domain 中建立多個 Projects、Users、Groups 和 Roles。通過引入 Domain,雲服務客戶可以對其擁有的多個 Project 進行統一管理,而不必再向過去那樣對每一個 Project 進行單獨管理。
簡而言之,Domain的引入是為了将多個Project進行封裝,成為單一實體再傳遞給相應的一個客戶使用。
問題2:在 Keystone V2中,使用者的權限管理是以每一個使用者為機關,需要對每一個使用者進行角色配置設定,并不存在一種對一組使用者進行統一管理的方案,這給系統管理者帶來了額外的工作和不便。
解決:V3引入了Group的概念,Group 是一組 Users 的容器,可以向 Group 中添加使用者,并直接給 Group 配置設定角色,那麼在這個 Group 中的所有使用者就都擁有了 Group 所擁有的角色權限。通過引入 Group 的概念,Keystone V3 實作了對使用者組的管理,達到了同時管理一組使用者權限的目的。這與 V2 中直接向 User/Project 指定 Role 不同,使得對雲服務進行管理更加便捷。
類比作業系統中的使用者組,是批量便捷操作的展現。
Domain、Group、Project、User 和 Role 的關系圖
如圖所示,在一個 Domain 中包含 3 個 Projects,可以通過 Group1 将 Role Sysadmin直接賦予 Domain,那麼 Group1 中的所有使用者将會對 Domain 中的所有 Projects 都擁有管理者權限。也可以通過 Group2 将 Role Engineer 隻賦予 Project3,這樣 Group2 中的 User 就隻擁有對 Project3 相應的權限,而不會影響其它 Projects。
三、Authentication認證功能的應用過程
Keystone 和其它 OpenStack service之間的互動和協同工作:
- 首先User向Keystone提供自己的Credentials(憑證:用于确認使用者身份的資料,EG. username/password)。
- Keystone會從SQL Database中讀取資料對User提供的Credentials進行驗證,如驗證通過,會向User傳回一個Token,該Token限定了可以在有效時間内被通路的 OpenStack API Endpoint和資源 。
- 此後User所有的Request都會使用該Token進行身份驗證。
- 如使用者向Nova申請虛拟機服務,Nova會将User提供的Token發送給Keystone進行Verify驗證,Keystone會根據Token判斷User是否擁有執行申請虛拟機操作的權限,若驗證通過那麼Nova會向其提供相對應的服務。
- 其它Openstack和Keystone的互動也是如此。
從以上過程可以看出,使用者的角色管理在 Keystone 中是很重要的工作。在Keystone V3之前,使用者的權限管理以每一個使用者為機關,需要對每一個使用者進行角色配置設定,并不存在一種對一組使用者進行統一管理的方案,這給系統管理者帶來了額外的工作和不便。此外,Keystone V3之前的版本中,資源配置設定是以 Tenant 為機關的,這不太符合現實世界中的層級關系。如一個公司在 Openstack 中擁有兩個不同的項目,他需要管理兩個Tenant來分别對應這兩個項目,并對這兩個 Tenant 中的使用者分别配置設定角色。由于在 Tenant 之上并不存在一個更高層的概念,無法對 Tenant 進行統一的管理,是以這給多 Tenant 的使用者帶來了不便。為了解決這些問題,Keystone V3 提出了新的概念Domain和Group。
keystone的通路流程
以建立一個虛拟機(server)為例,結合下圖簡述下keystone在openstack的通路流程。
1.使用者/API 想建立一個執行個體,首先會将自己的credentials發給keystone。認證成功後,keystone會頒給使用者/API一個臨時的令牌(Token)和一個通路服務的Endpoint。 PS:Token沒有永久的
2.使用者/API 把臨時Token送出給keystone,keystone并傳回一個Tenant(Project)
3.使用者/API 向keystone發送帶有特定租戶的憑證,告訴keystone使用者/API在哪個項目中,keystone收到請求後,會發送一個項目的token到使用者/API PS:第一個Token是來驗證使用者/API是否有權限與keystone通信,第二個Token是來驗證使用者/API是否有權限通路我keystone的其它服務。使用者/API 拿着token和Endpoint找到可通路服務
4.服務向keystone進行認證,Token是否合法,它允許通路使用該服務(判斷使用者/API中role權限)?
5.keystone向服務提供額外的資訊。使用者/API是允許方法服務,這個Token比對請求,這個Token是使用者/API的
6.服務執行使用者/API發起的請求,建立執行個體
7.服務會将狀态報告給使用者/API。最後傳回結果,執行個體已經建立
參考文章:
https://blog.csdn.net/Jmilk/article/details/51706583
http://www.360doc.com/content/16/0628/20/33848986_571473820.shtml
https://www.ibm.com/developerworks/cn/cloud/library/1506_yuwz_keystonev3/index.html
https://www.cnblogs.com/charles1ee/p/6293387.html