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
轉載于:https://www.cnblogs.com/tongxiaoda/p/8707235.html
總結
以上是生活随笔為你收集整理的OpenStack之Keystone模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springmvc 文件上传和拦截器
- 下一篇: P1282 多米诺骨牌 (差值DP+背包