Keystone(OpenStack Identity Service)是 OpenStack 框架中負責管理身份驗證、服務規則和服務令牌功能的模塊。用戶訪問資源須要驗證用戶的身份與權限,服務執行操做也須要進行權限檢測,這些都須要經過 Keystone 來處理。Keystone相似一個服務總線, 或者說是整個Openstack框架的註冊表, 其餘服務經過keystone來註冊其服務的Endpoint(服務訪問的URL),任何服務之間相互的調用, 須要通過Keystone的身份驗證, 來得到目標服務的Endpoint來找到目標服務。linux
第一部分:json
keystone的功能有哪些?api
openstack是一個SOA架構,各個項目獨立提供先關的服務,且互不依賴,如nova提供計算服務,glance提供鏡像服務等。防止耦合性,且擴展性不高 實際上全部的組件都依賴keystone,
Keystone基本概念介紹服務器
1.user:User即用戶,指的是使用openstack service的用戶,能夠是人,服務,系統,就是說只要是訪問openstack service 的對象均可以稱爲User網絡
2.Credentials:是用於確認用戶身份的憑證。說白了就是「信物」,能夠是:架構
(1):用戶名和密碼框架
(2):用戶名跟API Kye(祕鑰) #(1)(2)用戶第一次確認身份的方法dom
(3):一個keystone分配的身份的token #(3)用戶已經確認身份後的方法 (token是有時間限制的)ide
3.Authentication:ui
(1):用戶身份驗證的過程。keystone服務經過檢查用戶的Credentials來肯定用戶的身份
(2):第一次驗證身份是使用用戶名與密碼或者用戶名與API Key的形式。當用戶的Credentials被驗證後,keystone會給用戶分配一個Authentication token 供該用戶的後續請求操做(返回的token中就包含User的Role列表)
4.Token
(1):是一串數字字符串,當用戶訪問資源時須要使用的東西,在keystone中主要是引入令牌機制來保護用戶對資源的訪問,同時引入PKI、PKIZ、fernet、UUID其中一個隨機加密產生一串數字,對令牌加以保護
(2):token並非長久有效的,是有時效性的,在有效的時間內能夠訪問資源。
5.Role:
(1):自己是一堆ACL集合,主要用於權限的劃分。
(2):能夠給User指定Role,是user得到role對應的操做權限。
(3):系統默認使用管理Role的角色 管理員用戶:admin 普通用戶:member(老版本) user(新版本)
(5):user驗證的時候必須帶有Project。老版本叫(Tenant)
大致流程以下圖:
6.Policy
(1):對於keystone service 來講,Policy就是一個JSON文件,rpm安裝默認是在/etc/keyston/policy.json。經過配置這個文件,keystone實現了對User基於Role的權限管理(User <-- Role(ACL) <--Policy)
(2):Policy就是用來控制User對Project(tenant)中資源的操做權限
7.Project(Tenant)
(1):Project(Tenant)是一我的或服務所擁有的資源集合。不一樣的Project之間資源是隔離的,資源能夠設置配額
(2):Project(Tenant)中能夠有多個User,每個User會根據權限的劃分來使用Project(Tenant)中的資源
(3):User在使用Project(Tenant)的資源前,必需要與這個Project關聯,而且制定User在Project下的Role,一個assignment(關聯) 即:Project-User-Role
8.Service
即服務,如Nova,Glace,等各個組件
9.Endpoint:
(1):用來經過訪問和定位某個openstack service的地址,一般是一個URL
(2):不一樣的region有不一樣的Endpoint(region使用與跨地域的雲服務,好比像阿里雲有華北,華東等等,)
(3):任何服務都訪問openstack service中的資源時,都要訪問keystone
(4):Endpoint分爲三類:
1.admin url —>管理員用戶使用 Port:35357
2.internal url —>openstack內部組件間互相通訊 Port:5000 (組件之間通訊基於Restful api)
3.public url —> 其餘用戶訪問地址 Port:5000
region異地建機房,以下圖
10.Service與Endpoint關係
(1):在openstack中,每個service中都有三種Endpoint:Admin、Public、Internal(建立完service後須要爲其建立API Endpoint)
(2):Admin使用者爲管理員,可以修改User Project(Tenant)
(3):public使用者爲客戶端,使用者在外網管理本身雲服務器
(4):internal使用者爲內部組件間相互調用
(5):三種Endpoint在網絡上開放的權限也不一樣,Admin一般只能對內網開放,public一般能夠對外網開放,internal只能對有安裝openstack服務的機器開放
11.V3版本更新
1.Tenant更改成Project
2.添加了Domain(對系統資源進行限額)
3.添加了Group (組的概念爲了更好的管理用戶,例如linux下對組受權,其組下面的用戶也有了相應的權限)
4.member更改成user
第二部分:
舉個例子
將上面各個部分結合起來。
好比說,某公司年會組織跟團去旅遊(公司至關於一個group,公司的員工至關於User)。到了晚上要住店,首先要先到前臺登記(前臺就至關於Keystone),對前臺(keystone)來講,你要住店要拿出你的證實(對keystone來講就是要證實你是你)。
怎麼辦?拿出身份證,這裏的身份證就至關於Credentials(用戶名和密碼),前臺(keystone)會進行驗證你的身份信息(Authentication),驗證成功後,前臺(Keystone)會給你一個房卡(Token),而且有不一樣的房卡(好比:普通卡,會員卡,白金卡等),不一樣的卡有不一樣的權限(Role),而且拿到房卡後,前臺(keystone)會給你一個導航圖(Endpoint)讓你找到你的房間。而且一個酒店不光會有住宿服務,可能還有別的服務(service),像餐飲,娛樂,按摩等等,好比說要去吃飯,不知道路線怎麼走,看一下導航圖(endpoint)就知道了,到餐飲部門(service)會有三個路線(Endpoint)能夠走。爲何會有三個,領導層通道 --> 走後門(admin),內部員工通道 -->(internal),客人通道 -->(public)。知道如何去,也有了權限(Token/Role)到了餐飲部門,當你點餐的時候,會讓你刷上你的會員卡(這個步驟就是service像keystone確認你有沒有權限),驗證成功後,你就能夠點餐吃飯
圖片理解
第三部分
官方介紹
1.User:has account credentials, is associated with one or more projects or domains
user是帳戶憑證,是與一個或多個項目或相關的域
2.Group: a collection of users, is associated with one or more projects or domains
group就是用戶的一個集合,與一個或多個項目或相關的域
3.Project(Tenant): unit of ownership in OpenStack, contains one or more users
project(tenant)是一個單位,指在openstack中可用的資源,它包含一個或多個用戶
4.Domain:unit of ownership in OpenStack, contains users, groups and projects
domain是一個單位,它包含用戶、組和項目
5.Role:a first-class piece of metadata associated with many user-project pairs
role一個用戶與project相關聯的元素據
6.Token:identifying credential associated with a user or user and project
Token鑑定憑證關聯到用戶或者用戶和項目
7.Extras:bucket of key-value metadata associated with a user-project pair
extras關於用戶-項目的關係,還能夠設置一些其餘的屬性
8.Rule:describes a set of requirements for performing an action
rule描述了一組要求 執行一個動做
第四部分
工做流程(以建立一個VM爲例)
上面的圖主要是講述keystone在各個組件之間的做用,先不要去想別的組件是如何工做的。經過上面那幅圖能夠看出來keystone在各個組件間扮演着一箇中間人的做用,每一個服務於服務間使用或者某個用戶與服務間的使用,都要先到keystone這裏來報道!
第五部分
官方介紹
詳解
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。最後返回結果,實例已經建立