OpenStack之Keystone模塊

1、Keystone介紹

OpenStack Identity(Keystone)服務爲運行OpenStack Compute上的OpenStack雲提供了認證和管理用戶、賬號和角色信息服務,併爲OpenStack Object Storage提供受權服務。html

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。json

用戶(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的權限管理。dom

Authentication

肯定用戶身份的過程url

服務目錄(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管理對象之間的關係

2、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。

3、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
http://www.javashuo.com/article/p-masjixpj-hb.html

相關文章
相關標籤/搜索