一 什麼是keystone
keystone是OpenStack的身份服務,暫且可以理解為一個'與許可權有關'的元件。
二 為何要有keystone
Keystone專案的主要目的是為訪問openstack的各個元件(nova,cinder,glance...)提供一個統一的驗證方式,具體的:
openstack是由眾多元件構成的一套系統,該系統的功能是對外提供服務,因而我們可以將其定義為一個‘龐大的軟體’,沒有軟體不考慮安全因素,Keystone對於通常的應用場景所不同的是他要解決分散式環境下的統一認證。
三 keystone的功能
openstack是一個SOA架構,理論上各子專案獨立提供相關服務,互不依賴,且是分散式的。如nova提供計算服務,glance提供映象服務等。
實際上所有的元件都依賴keystone(單點的),它整合了三個功能:
(1)管理身份驗證(managing authentication):驗證使用者身份
(2) 授權(authorization):基於角色role的許可權管理
(3)服務目錄(catalog of services):提服務目錄(ServiceCatalog:包括service和endpoint)服務,類似於UDDI服務的概念,使用者(無論是Dashboard, APIClient)都需要訪問Keystone獲取服務列表,以及每個服務的地址(Openstack中稱為Endpoint)
四 keystone概念詳解
第一部分
User:使用Openstack元件的客戶端可以是人、服務、系統,任何的客戶端來訪問openstack元件,都需要有一個使用者名稱。
Credentials:是用於確認使用者身份的憑證,說白了就是‘信物’,具體可以是:
- 使用者名稱和密碼
- 使用者名稱和API key
- 一個 Keystone 分配的身份token
Authentication:
- 是驗證使用者身份的過程。Keystone 服務通過檢查使用者的 Credential 來確定使用者的身份。
- 最開始,使用使用者名稱/密碼或者使用者名稱/API key作為credential。當使用者的credential被驗證後,Kestone 會給使用者分配一個 authentication token 供該使用者後續的請求使用。
- Keystone中通過Policy(訪問規則)來做到基於使用者角色(Role)的訪問控制。
Token:
- 是一個數字字串,訪問資源時需要"亮出"你的令牌。在keystone中主要是引入令牌機制來保護使用者對於資源的訪問,同時引入PKI(公鑰基礎實施)對令牌加以保護。
- Token包含了在指定範圍和有效時間內可以被訪問的資源。EG. 在Nova中一個tenant可以是一些虛擬機器,在Swift和Glance中一個tenant可以是一些映象儲存,在Network中一個tenant可以是一些網路資源。
Role:
- 本質就是一堆ACL的集合,用於劃分許可權
- 可以通過給User指定Role,使User獲得Role對應的操作許可權。
- Keystone返回給User的Token包含了Role列表,被訪問的Services會判斷訪問它的User和User提供的Token中所包含的Role,及每個role訪問資源或者進行操作的許可權。
- 系統預設使用管理Role admin和成員Role user(過去的普通使用者角色是:_member_) 。
- user驗證時必須帶有Project(Tenant)
Policy:
- 對於Keystone service來說,Policy就是一個JSON檔案,預設是
/etc/keystone/policy.json
。通過配置這個檔案,Keystone實現了對User基於Role的許可權管理。 - OpenStack對User的驗證除了OpenStack的身份驗證以外,還需要鑑別User對某個Service是否有訪問許可權。Policy機制就是用來控制User對Project(Tenant)中資源的操作許可權。
Project(Tenant):
- 是一個人、或服務所擁有的資源集合。不同的Project之間資源是隔離的,資源可以設定配額。
- 在一個Project(Tenant)中可以包含多個User,每一個User都會根據許可權的劃分來使用Project(Tenant)中的資源。比如通過Nova建立虛擬機器時要指定到某個Project中,在Cinder建立卷也要指定到某個Project中。
- User訪問Project的資源前,必須要與該Project關聯,並且指定User在Project下的Role,一個assignment(關聯)即:Project-User-Role
Service:即Openstack中執行的各個元件服務。
Endpoint:
- 是一個可以通過網路來訪問和定位某個Openstack service的地址,通常是一個URL
- 不同的region有不同的endpoint(我們可以通過endpoint的region屬性去定義多個region)。
- 當Nova需要訪問Glance服務去獲取image 時,Nova通過訪問Keystone拿到Glance的endpoint,然後通過訪問該endpoint去獲取Glance服務。
- Endpoint 分為三類:
-
- admin url –> 給admin使用者使用,Port:35357
- internal url –> OpenStack內部服務使用來跟別的服務通訊,Port:5000
- public url –> 網際網路使用者可以訪問的地址,Port:5000
Catalog:
使用者和服務可以使用使用keystone管理的catalog,定位到其他的服務,catalog一個openstack部署的相關服務的集合,每個服務都有一個或者多個endpoint(即可以訪問的url地址),即catalog=services+endpoint。每個endpoint可以分為三種型別:
admin,internal,public,在生產環境中,不同endpoint型別位於不同的網路來為不同的使用者使用(提高安全性),比如:
public API:對整個網際網路可見,這樣客戶就可以方便的管理自己的雲了。
admin API:應該嚴格限定只有管理雲基礎設施的組織內的運營商,才能使用該API
internel API:應該被限定只有那些安裝有OpenStack服務的主機,才能使用該API
Service與Endpoint關係介紹:
- 在openstack中,每一個service都有三種endpoint. Admin, public, internal(建立完service後需要為其建立API EndPoint. )
- Admin是用作管理用途的,如它能夠修改user/tenant(project)。
- public 是讓客戶呼叫的,比如可以部署在外網上讓客戶可以管理自己的雲。
- internal是openstack內部呼叫的。
- 三種endpoints 在網路上開放的許可權一般也不同。Admin通常只能對內網開放,public通常可以對外網開放,internal通常只能對安裝有openstack對服務的機器開放。
我們使用keystone為服務5d533c68-d234-11e6-a0d7-0088653ea1ec定製endpoint: $ keystone endpoint-create \ --region RegionOne \ --service-id=5d533c68-d234-11e6-a0d7-0088653ea1ec \ --publicurl='https://public-ip:8776/v1/%(tenant_id)s' \ --internalurl='https://management-ip:8776/v1/%(tenant_id)s' \ --adminurl='https://management-ip:8776/v1/%(tenant_id)s' 然後你可以配置 OpenStack service 使用另一個 service 的 endpoint 的 internalurl 去訪問另一個資源。
Regions:
openstack支援多個可擴充套件的regions,OpenStack的支援可擴充套件的多個區域。為簡單起見,一般使用管理網路ip地址作為所有endpoint型別(三種api)的ip,且所有的endpoint型別(三種api)都使用一個區域,即regionone區。
每個你部署的openstack服務都需要繫結endpoint(儲存在keystone中)來提供服一個服務的入口,因而我們第一需要部署的元件就是keystone。
V3新增的概念:
- Tenant 重新命名為 Project
- 新增了 Domain 的概念
- 新增了 Group 的概念
第二部分
keystone管理和儲存了user資訊,管理user相關的tenant,role,group和domain等;使用者credential的存放,驗證,token管理,下圖是各部分關係
第三部分
- User: has account credentials, is associated with one or more projects or domains
- Group: a collection of users, is associated with one or more projects or domains
- Project: unit of ownership in OpenStack, contains one or more users
- Domain: unit of ownership in OpenStack, contains users, groups and projects
- Role: a first-class piece of metadata associated with many user-project pairs.
- Token: identifying credential associated with a user or user and project
- Extras: bucket of key-value metadata associated with a user-project pair.
- Rule: describes a set of requirements for performing an action.
注意:user2,user3,user4的關係同user1一樣,也可以屬於一個或者多個group,此處為了圖示簡潔,省去了它們的連線
五 keystone內包含的元件
keystone包含三類元件:
1 Server
使用RESTful介面(三種api)提供認證和授權服務的集中式server
2 Drivers
指的是被整合到server內的驅動或者服務後端,它們被用來在openstack元件之外的庫中訪問身份資訊(言外之意:mysql並不屬於openstack的元件/服務),並可能已經存在於openstack部署的架構中(比如, SQL databases or LDAP servers).
3 Modules
中介軟體執行在正在使用認證服務的openstack元件的地址空間,這些模組(中介軟體)攔截服務請求,提取使用者的credentials,並且把它們傳送給server去認證授權,在openstack中介軟體與openstack元件直接的整合操作使用Python Web Server Gateway Interface,即wsgi,詳見http://www.cnblogs.com/linhaifeng/p/6268615.html
六 keystone與openstack其他服務的關係
七 keystone與其他元件協同工作流程
keystone是使用者與雲平臺互動的第一個服務,一旦認證通過,使用者就會使用自己的身份來訪問其他的opnestack服務,同樣,被訪問的openstack服務會去跟keystone再次確認使用者(不能只能使用者的片面之詞)並且通過keystone可以發現其他服務(catalog的原因),keystone的還可以整合其他的使用者管理系統,比如LDAP
八 keystone工作流程詳解
(1) User從Keystone獲取令牌以及服務列表;
(2) User訪問服務時,亮出自己的令牌。
(3)相關的服務向Keystone求證令牌的合法性。
-
使用者alice登入keystone系統(password或者token的方式),獲取一個臨時的token和catalog服務目錄(v3版本登入時,如果沒有指定scope,project或者domain,獲取的臨時token沒有任何許可權,不能查詢project或者catalog)。
-
alice通過臨時token獲取自己的所有的project列表。
-
alice選定一個project,然後指定project重新登入,獲取一個正式的token,同時獲得服務列表的endpoint,使用者選定一個endpoint,在HTTP訊息頭中攜帶token,然後傳送請求(如果使用者知道project name或者project id可以直接第3步登入)。
-
訊息到達endpoint之後,由服務端(nova)的keystone中介軟體(pipeline中的filter:authtoken)向keystone傳送一個驗證token的請求。(token型別:uuid需要在keystone驗證token,pki型別的token本身是包含使用者詳細資訊的加密串,可以在服務端完成驗證)
-
keystone驗證token成功之後,將token對應使用者的詳細資訊,例如:role,username,userid等,返回給服務端(nova)。
-
服務端(nova)完成請求,例如:建立虛擬機器。
-
服務端返回請求結果給alice。