引: 什麼是keystone
爲何要有keystone
keystone的功能
keystone概念詳解
keystone與openstack其他組件關係
keystone與其他組件協同工作流程
keystone工作流程詳解
一、什麼是keystone
keystone是 OpenStack Identity Service 的項目名稱,是一個負責身份管理與授權的組件。
主要功能:實現用戶的身份認證,基於角色的權限管理,及openstack其他組件的訪問地址和安全策略管理。
二 、爲何要有keystone
Keystone項目的主要目的是給整個openstack的各個組件(nova,cinder,glance...)提供一個統一的驗證方式:
openstack是由衆多組件構成的一套系統,該系統的功能是對外提供服務,因而我們可以將其定義爲一個‘龐大的軟件’,沒有軟件不考慮安全因素,Keystone對於通常的應用場景所不同的是他要解決分佈式環境下的統一認證。
三、keystone的功能
openstack是一個SOA(面向服務的體系結構,是一個組件模型,它將應用程序的不同功能單元(稱爲服務)通過這些服務之間定義良好的接口和契約聯繫起來)架構,理論上各子項目獨立提供相關服務,互不依賴。如nova提供計算服務,glance提供鏡像服務等。
實際上所有的組件都依賴keystone,它有兩個功能:
(1)用戶管理:驗證用戶身份的合法性。
(2)服務目錄管理:提供服務目錄(ServiceCatalog:包括service和endpoint)服務,類似於UDDI服務的概念,用戶(無論是Dashboard, APIClient)都需要訪問Keystone獲取服務列表,以及每個服務的地址(Openstack中稱爲Endpoint)
四、 keystone概念詳解
User:
使用 OpenStack Service 的的對象被稱爲用戶,這裏的用戶可以是人、服務、系統。
Credentials:
用於確認用戶身份的憑證,
具體可以是:
1、用戶名和密碼
2、用戶名和API key
3、一個 Keystone 分配的身份token
Authentication:
確定用戶身份的過程。
1、是驗證用戶身份的過程。Keystone 服務通過檢查用戶的 Credential 來確定用戶的身份。
2、最開始,使用用戶名/密碼或者用戶名/API key作爲credential。當用戶的credential被驗證後,Kestone 會給用戶分配一個 authentication token 供該用戶後續的請求使用。
3、Keystone中通過Policy(訪問規則)來做到基於用戶角色(Role)的訪問控制。
Token:
1、令牌,使用一個字符串表示。
2、Token一般被用戶持有,Token包含了在指定範圍和有效時間內可以被訪問的資源。在Nova中一個tenant可以是一些虛擬機,在Swift和Glance中一個tenant可以是一些鏡像存儲,在Network中一個tenant可以是一些網絡資源。
Role:
1、本質就是一堆ACL的集合,用於劃分權限
2、可以通過給User指定Role,使User獲得Role對應的操作權限。
3、Keystone返回給User的Token包含了Role列表,被訪問的Services會判斷訪問它的User和User提供的Token中所包含的Role,及每個role訪問資源或者進行操作的權限。
4、系統默認使用管理Role admin和成員Role _member_ 。
5、user驗證時必須帶有Project(Tenant)
Policy:
1、對於Keystone service來說,Policy就是一個JSON文件,默認是/etc/keystone/policy.json。通過配置這個文件,Keystone實現了對User基於Role的權限管理。
2、OpenStack對User的驗證除了OpenStack的身份驗證以外,還需要鑑別User對某個Service是否有訪問權限。Policy機制就是用來控制User對Project(Tenant)中資源的操作權限。
Service:
指Openstack中運行的組件服務。
Endpoint:
1、是一個可以通過網絡來訪問和定位某個Openstack service的地址,通常是一個URL
2、不同的region有不同的endpoint(我們可以通過endpoint的region屬性去定義多個region)。
3、當Nova需要訪問Glance服務去獲取image 時,Nova通過訪問Keystone拿到Glance的endpoint,然後通過訪問該endpoint去獲取Glance服務。
4、Endpoint 分爲三類:
admin url –> 給admin用戶使用,Port:35357
internal url –> OpenStack內部服務使用來跟別的服務通信,Port:5000
public url –> 其它用戶可以訪問的地址,Port:5000
V3新增的概念:
Tenant 重命名爲 Project
添加了 Domain 的概念
添加了 Group 的概念
keystone管理和保存了user信息,管理user相關的tenant,role,group和domain等;用戶credential的存放,驗證,token管理,下圖是各部分關係
User | 住賓館的人 |
Credentials | 開啓房間的鑰匙 |
Authentication | 賓館爲了拒絕不必要的人進出賓館,專門設置的機制,只有擁有鑰匙的人才能進出 |
Token | 口令 |
Tenant(project) | 賓館 |
Service | 賓館可以提供的服務類別,比如,飲食類,娛樂類 |
Endpoint | 具體的一種服務 |
Role | VIP 等級,VIP越高,享有越高的權限 |
五、keystone與openstack其他組件關係
當用戶從keystone獲取token後,用該token訪問其他服務時,該service會再一次用該token去訪問keystone來驗證token的正確性。
六、keystone與其他組件協同工作流程
七、 keystone工作流程詳解
(1) User從Keystone獲取令牌以及服務列表;
(2) User訪問服務時,亮出自己的令牌。
(3)相關的服務向Keystone求證令牌的合法性。
1、用戶登錄keystone系統(password或者token的方式),獲取一個臨時的token和catalog服務目錄(v3版本登錄時,如果沒有指定scope,project或者domain,獲取的臨時token沒有任何權限,不能查詢project或者catalog)。
2、用戶通過臨時token獲取自己的所有的project列表。
3、用戶選定一個project,然後指定project重新登錄,獲取一個正式的token,同時獲得服務列表的endpoint,用戶選定一個endpoint,在HTTP消息頭中攜帶token,然後發送請求(如果用戶知道project name或者project id可以直接第3步登錄)。
4、消息到達endpoint之後,由服務端(nova)的keystone中間件(pipeline中的filter:authtoken)向keystone發送一個驗證token的請求。(token類型:uuid需要在keystone驗證token,pki類型的token本身是包含用戶詳細信息的加密串,可以在服務端完成驗證)
5、keystone驗證token成功之後,將token對應用戶的詳細信息,例如:role,username,userid等,返回給服務端(nova)。
6、服務端(nova)完成請求,例如:創建虛擬機。
7、服務端返回請求結果給用戶。