keystone系列一:keystone基礎

linhaifeng發表於2017-01-04

一 什麼是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:是用於確認使用者身份的憑證,說白了就是‘信物’,具體可以是:

  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. 是一個數字字串,訪問資源時需要"亮出"你的令牌。在keystone中主要是引入令牌機制來保護使用者對於資源的訪問,同時引入PKI(公鑰基礎實施)對令牌加以保護。
  2. Token包含了在指定範圍和有效時間內可以被訪問的資源。EG. 在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 user(過去的普通使用者角色是:_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)中資源的操作許可權。

Project(Tenant)

  1. 是一個人、或服務所擁有的資源集合。不同的Project之間資源是隔離的,資源可以設定配額。
  2. 在一個Project(Tenant)中可以包含多個User,每一個User都會根據許可權的劃分來使用Project(Tenant)中的資源。比如通過Nova建立虛擬機器時要指定到某個Project中,在Cinder建立卷也要指定到某個Project中。
  3. User訪問Project的資源前,必須要與該Project關聯,並且指定User在Project下的Role,一個assignment(關聯)即:Project-User-Role

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

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關係介紹:

  1. 在openstack中,每一個service都有三種endpoint. Admin, public, internal(建立完service後需要為其建立API EndPoint. )
  2. Admin是用作管理用途的,如它能夠修改user/tenant(project)。
  3. public 是讓客戶呼叫的,比如可以部署在外網上讓客戶可以管理自己的雲。
  4. internal是openstack內部呼叫的。
  5. 三種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 去訪問另一個資源。
endpoint舉例

Regions:

openstack支援多個可擴充套件的regions,OpenStack的支援可擴充套件的多個區域。為簡單起見,一般使用管理網路ip地址作為所有endpoint型別(三種api)的ip,且所有的endpoint型別(三種api)都使用一個區域,即regionone區。

每個你部署的openstack服務都需要繫結endpoint(儲存在keystone中)來提供服一個服務的入口,因而我們第一需要部署的元件就是keystone。

V3新增的概念:

  1. Tenant 重新命名為 Project
  2. 新增了 Domain 的概念
  3. 新增了 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求證令牌的合法性。

  1. 使用者alice登入keystone系統(password或者token的方式),獲取一個臨時的token和catalog服務目錄(v3版本登入時,如果沒有指定scope,project或者domain,獲取的臨時token沒有任何許可權,不能查詢project或者catalog)。

  2. alice通過臨時token獲取自己的所有的project列表。

  3. alice選定一個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. 服務端返回請求結果給alice。

相關文章