注:本文内容均來自網絡,我隻是在此做了一些摘抄和整理的工作,來源均有注明。
0、簡介及架構
簡介: Keystone(OpenStack Identity Service)是OpenStack架構中,負責身份驗證、服務規則和服務令牌的功能, 它實作了OpenStack的Identity API。Keystone類似一個服務總線, 或者說是整個Openstack架構的系統資料庫, 其他服務通過keystone來注冊其服務的Endpoint(服務通路的URL),任何服務之間互相的調用, 需要經過Keystone的身份驗證, 來獲得目标服務的Endpoint來找到目标服務。
功能: 使用者資訊管理:user/tenant基本資訊管理;認證服務:登陸認證,各個元件API的權限控制;
架構:
既然keystone為各個子產品提供認證服務,是以各個子產品與keystone都有所互動。其中登入認證展現在使用者通路各個元件的API時,調用了WSGI架構的authtoken filter,該filter最調用keystoneclient ,最終通過keystone驗證token,完成對使用者的登入認證。如果認證失敗,使用者将不能通路該API。
以nova為例,authtoken filter在/etc/paste.ini目錄中(如果不熟悉WSGI架構,暫且忽略之)

keystone在openstack的位置如下:
1、基本概念
1. User
User即使用者,他們代表可以通過keystone進行通路的人或程式。Users通過認證資訊(credentials,如密碼、API Keys等)進行驗證。
2. Tenant
Tenant即租戶,早期版本又稱為project,它是各個服務中的一些可以通路的資源集合。例如,在Nova中一個tenant可以是一些機器,在Swift和Glance中一個tenant可以是一些鏡像存儲,在Quantum中一個tenant可以是一些網絡資源。Users預設的總是綁定到某些tenant上,使用者通路租戶的資源前,必須與該租戶關聯,并且指定該使用者在該租戶下的角色。
3. Role
Role即角色,Roles代表一組使用者可以通路的資源權限,例如Nova中的虛拟機、Glance中的鏡像。Users可以被添加到任意一個全局的 或 租戶内的角色中。在全局的role中,使用者的role權限作用于所有的租戶,即可以對所有的租戶執行role規定的權限;在租戶内的role中,使用者僅能在目前租戶内執行role規定的權限。
4. Service
Service即服務,如Nova、Glance、Swift。根據前三個概念(User,Tenant和Role)一個服務可以确認目前使用者是否具有通路其資源的權限。但是當一個user嘗試着通路其租戶内的service時,他必須知道這個service是否存在以及如何通路這個service,這裡通常使用一些不同的名稱表示不同的服務。在上文中談到的Role,實際上也是可以綁定到某個service的。例如,當swift需要一個管理者權限的通路進行對象建立時,對于相同的role我們并不一定也需要對nova進行管理者權限的通路。為了實作這個目标,我們應該建立兩個獨立的管理者role,一個綁定到swift,另一個綁定到nova,進而實作對swift進行管理者權限通路不會影響到Nova或其他服務。
5. Endpoint
Endpoint,翻譯為“端點”,我們可以了解它是一個服務暴露出來的通路點,如果需要通路一個服務,則必須知道他的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被從正常的通路中分離。
6. Token
Token即是信物、令牌,使用者通過使用者名和密碼擷取在某個租戶下的token,通過token,可以實作單點登入。
7. Credentials
與user關聯的認證憑據。一個user可能有一個或多個credential,一個credential與某一個project關聯。該術語可以簡單的了解為使用者和密碼。
8. Domains 表示一組tenants和users的集合。每一個 tenants或user隻能屬于一個domain,但user可以屬于多個tenants。domain有命名空間的概念,即在一個命名空間内的名稱是否是全局唯一。 ( The intent of domain is to define the administrative boundaries for management of Keystone entities. A domain can represent an individual, company, or operator owned space. )
對象之間的關系(舊版本未更新):
下面舉例進行了解:
keystone 裡面的概念很多,有:User,Credentials,Authentication,Token,Tenant,Service,Endpoint,Role。在這麼多概念中,其實最主要的就是 User 和 Tenant 。由于一些安全,服務問題,才引發了其它的概念。
那什麼叫做 User ,Tenant 呢?這裡我舉個比較好了解的例子。我們去飯店住的時候,
如果把飯店比作為Tenant,住宿的人就是User ,而飯店就是 Tenant,飯店可以提供多種諸如住宿、娛樂、飲食等多種服務(Service),具體來說,住宿是一種具體的服務(Endpoint)。就住宿而言,有普通間和總統套房,如果你的VIP等級(Role)高,你可以享受到豪華的總統套房。入住前,我們需要拿身份證開房(Credential),認證身份證不是冒牌貨後(Authenticaiton),會給你一個房卡(Token),然後你拿着房卡,就可以進入房間和享受各種服務。
User | 住飯店的人 |
Credentials | 身份證 |
Authentication | (認證身份證)飯店為了拒絕不必要的人進出飯店,專門設定的機制,隻有擁有鑰匙的人才能進出 |
Token | 房卡 |
Tenant | 飯店 |
Service | 飯店可以提供的服務類别,比如,飲食類,娛樂類 |
Endpoint | 具體的一種服務,比如吃燒烤,打羽毛球 |
Role | VIP 等級,VIP越高,享有越高的權限 |
2、元件
Keystone包含一個指令行接口,可以與Keystone API互動以管理keystone和相關服務。
keystone - 運作keystone-admin和keystone-service
keystone-admin - 操作keystone的管理API
keystone-service - 用于驗證的,面向使用者的API
keystone-manage - 管理keystone的指令行接口
Keystone還包括WSGI中間件以為Nova和Swift提供驗證服務。
Keystone使用一個内置的SQLite資料庫 - 為驗證使用者,将來也可能使用一個外部LDAP服務來代替存儲證書
中間件(Middleware)
Keystone中間件位于OpenStack服務前面,處理進來的請求驗證。中間件的設計遵循如下的規範。
中間件的源代碼位于Keystone/middleware。
中間件支援兩個接口:WSGI和REST/HTTP。
REST & HTTP API
如果進來一個未經認證的調用,中間件将響應一個401 Unautorized錯誤。根據每HTTP的标準,它也會傳回一個WWW-Authenticate標頭以通知調用者支援哪個協定。對于Keystone驗證,響應的文法格式如下:
WWW-Authenticate: Keystone uri="url to Keystone server"The client can then make the necessary calls to the Keystone server, obtain a token, and retry the call with the token.
令牌使用 X-Auth-Toke標頭傳遞。
WSGI API(標頭)
當成功驗證後中間件經為下行的WSGI應用發送如下標頭:
X-Identity-Status
提供請求是否被驗證的資訊。
X-Tenant
提供了租戶ID(在Keystone中以URL的形式出現)。在Keysotne轉為采用ID/Name模式之前,它為租戶提供了對任意遺留實作的支援。
X-Tenant-Id
唯一不變的租戶ID。
X-Tenant-Name
唯一但可變的租戶名字。
X-User
用于登入的使用者名。
X-Roles
配置設定給使用者的角色。
3、通路流程
以建立一個虛拟機(server)為例,結合下圖簡述下keystone在openstack的通路流程。
1)使用者Alice通過自己的戶名和密碼向keystone申請token,keystone認證使用者名和密碼後,傳回token1
2)Alice通過token1發送keystone查詢他所擁有的租戶,keystone驗證token1成功後,傳回Alice的所有Tenant
3) Alice選擇一個租戶,通過使用者名和密碼申請token,keystone認證使用者名、密碼、tenant後,傳回token2。(其實1、2步僅僅是為了查詢tenant,如果已經知道tenant,可以忽略1、2步)
4)Alice通過token2發送建立server的請求,keystone驗證token2(包括該token是否有效,是否有權限建立虛拟機等)成功後,然後再把請求下發到nova,最終建立虛拟機
下面看一個更詳細點的時序圖,是一張老圖,Neutron還叫Quantum:
4、進階
待深入:
[openstack][G版]keystone源碼學習 : http://blog.csdn.net/wangyish201201/article/details/8959104 openstack policy 鑒權過程分析: http://blog.chinaunix.net/uid-20940095-id-4144300.html
參考:
- OpenStack 官方文檔: http://docs.openstack.org/admin-guide-cloud/content/keystone-concepts.html
- OpenStack Identity(Keystone)身份服務-體系結構與中間件: http://my.oschina.net/amoshuang/blog/83694
- openstack keystone整體架構與功能: http://blog.csdn.net/wsfdl/article/details/20492343
- OpenStack Keystone的基本概念了解: http://www.cnblogs.com/yuki-lau/archive/2013/01/04/2843918.html
- 【OpenStack】OpenStack的G版Keystone對象模型: http://blog.csdn.net/lynn_kong/article/details/8564535
- [openstack][G版]keystone源碼學習: http://blog.csdn.net/wangyish201201/article/details/8959104
- openstack policy 鑒權過程分析 : http://blog.chinaunix.net/uid-20940095-id-4144300.html
- 将openstack的Token認證資訊存儲在memcache中: http://lustlost.blog.51cto.com/2600869/1318642