1. 程式人生 > >openstack項目【day23】:openstack-keystone-keystone基礎

openstack項目【day23】:openstack-keystone-keystone基礎

glance服務 使用 定制 個人 部分 filter 結果 保護 gin

本節內容

  • 一 什麽是keystone
  • 二 為何要有keystone
  • 三 keystone的功能
  • 四 keystone概念詳解
  • 五 keystone內包含的組件
  • 六 keystone與openstack其他服務的關系
  • 七 keystone與其他組件協同工作流程
  • 八 keystone工作流程詳解

一 什麽是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 去訪問另一個資源。

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。

openstack項目【day23】:openstack-keystone-keystone基礎