天天看點

OpenStack之Keystone子產品

本文介紹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管理對象之間的關系

OpenStack之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 的關系圖

OpenStack之Keystone子產品

如圖所示,在一個 Domain 中包含 3 個 Projects,可以通過 Group1 将 Role Sysadmin直接賦予 Domain,那麼 Group1 中的所有使用者将會對 Domain 中的所有 Projects 都擁有管理者權限。也可以通過 Group2 将 Role Engineer 隻賦予 Project3,這樣 Group2 中的 User 就隻擁有對 Project3 相應的權限,而不會影響其它 Projects。

三、Authentication認證功能的應用過程

OpenStack之Keystone子產品

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的通路流程

OpenStack之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