keystone系列五:keystone原始碼分析

linhaifeng發表於2017-01-09

六 keystone架構

 

6.1 Keystone API 

Keystone API與Openstack其他服務的API類似,也是基於ReSTFul HTTP實現的。

Keystone API劃分為Admin API和Public API:

  • Public API不僅實現獲取版本以及相應擴充套件資訊的操作,同時包括獲取Token以及Token租戶資訊的操作;
  • Admin API主要提供服務開發者使用,不僅可以完成Public API的操作,同時對User、Tenant、Role和Service Endpoint進行管理操作。

6.2 Router
Keystone Router主要實現上層API和底層服務的對映和轉換功能,包括四種Router型別。 
(1) AdminRouter 
  負責將Admin API請求對映為相應的行為操作並轉發至底層相應的服務執行; 
(2) PublicRouter 
  與AdminRouter類似; 
(3) PublicVersionRouter 
  對系統版本的請求API進行對映操作; 
(4) AdminVersionRouter 
  與PublicVersionRouter類似。 
6.3 Services
Keystone Service接收上層不同Router發來的操作請求,並根據不同後端驅動完成相應操作,主要包括四種型別; 
(1) Identity Service 

Identity Service提供關於使用者和使用者組的授權認證及相關資料。

Keystone-10.0.0支援ldap.core.Identity,Sql.Identity兩種後端驅動,系統預設的是Sql.Identity;

Users:
使用者這一概念在openstack中實際上是用來標識一個使用者(an individual API consumer)

一個使用者必須被一個具體的domain擁有

所有的使用者名稱不是全域性唯一的,在同一個domain中使用者名稱才唯一

Groups:

使用者組是一個包含了一系列使用者的容器,一個group必須被一個具體的domain擁有

所有的組名不是全域性唯一的,在同一domain種組名才唯一
users和groups

 

 (2) Resource Service

Resouse服務提供關於projects和domains的資料 

projects
Projects(在v2.0中稱之為Tenants)
在openstack中project代表資源的結合
一個project必須被一個具體的domain所擁有
所有的project都不是全域性唯一的,僅僅在一個domain中project唯一
新建一個project沒有指定domain,它將被新增到預設的domain中即default


Domains
Domains是一個更高階別的包含n個projects-users-groups的容器。
預設的Domains名為Default
projects和domains

 

Domain名,在所有的domains中全域性唯一
Role名.在所有的domains中全域性唯一
User名,僅僅在它自己所在的domain中唯一
Project名,僅僅在它自己所在的domain中唯一
Group名,僅僅在它自己所在的domain中唯一



基於這些容器結構,domains代表了openstack資源的管理方式,只要某一assignment(project-user-role)被授予許可權,一個domain中的使用者就可以訪問另外一個domain中的資源。
在v3版本中的唯一性概念

 

(3) Assignment Service 

Assignment Service提供role及role assignments的資料

Roles
role角色標識了一個使用者可以獲得的許可權級別
可以在domain或project級別授予role。
可以分配給單個使用者或組級別role。
role名稱是全域性唯一的。


Role Assignments

A 3-tuple that has a Role, a Resource and an Identity.


Resource指的是project
Identity指的是user
Role指的是role
即project-user-role
roles和role assignments

 

(4) Token Service 
Token Service提供認證和管理令牌token的功能,使用者的credentials認證通過後就得到token

Keystone-10.0.0對於Token Service 
支援Kvs.Token,Memcache.Token,Memcache_pool.Token,Sql.Token四種後端驅動,系統預設的是kvs.Token
(5) Catalog Service 
Catalog Service提供service和Endpoint相關的管理操作(service即openstack所有服務,endpont即訪問每個服務的url)

keystone-10.0.0對Catalog Service支援兩種後端驅動:Sql.Catalog、Templated.Catalog兩種後端驅動,系統預設的是templated.Catalog; 

(6) Policy Service 
Policy Service提供一個基於規則的授權驅動和規則管理

keystone-10.0.0對Policy Service支援兩種後端驅動:rules.Policy,sql.Policy,預設使用sql.Policy
6.4 Backend Driver

Backend Driver具有多種型別,不同的Service選擇不同的Backend Driver。

官方http://docs.openstack.org/developer/keystone/architecture.html#groups

七 keystone管理這些概念的方法

元件名稱 管理物件 生成方法 儲存方式 配置項
identity user,以及 user group - sql, ldap.core

[identity]

driver = keystone.identity.backends.[sql|ldap.core].Identity

token 使用者的臨時 token pki,pkiz,uuid sql, kvs,memcached

[token]

driver = keystone.token.persistence.backends.[sql|kvs|memcache|memcache_pool].Token

provider=keystone.token.providers.[pkiz|pki|uuid].Provider
credential EC2 credential   sql

[credential]

driver = keystone.credential.backends.sql.Credential

provider=keystone.token.providers.[core|fernet].Provider

catalog region,service,endpoint   sql|templated

[catalog]

driver = keystone.catalog.backends.[sql|templated].Catalog

assignment tenant,domain,role 以及它們與 user 之間的關係 external, password, token sql

[assignment]

methods = external, password, token

password = keystone.auth.plugins.password.Password

trust trust  sql  

[trust]

driver = keystone.trust.backends.[sql].Trust

policy Keystone service 的使用者鑑權策略    ruels|sql

[default]

policy_file = policy.json

[policy]

driver = keystone.policy.backends.[ruels|sql].Policy

 

 

八 keystone-10.0.0程式碼結構展示 

keystone-manage 是個 CLI 工具,它通過和 Keystone service 互動來做一些無法使用 Keystone REST API 來進行的操作,包括:

  • db_sync: Sync the database.
  • db_version: Print the current migration version of the database.
  • mapping_purge: Purge the identity mapping table.
  • pki_setup: Initialize the certificates used to sign tokens.
  • saml_idp_metadata: Generate identity provider metadata.
  • ssl_setup: Generate certificates for SSL.
  • token_flush: Purge expired tokens.

每個Keystone 元件,比如 catalog, token 等都有一個單獨的目錄。
每個元件目錄中:
routes.py 定義了該元件的 routes (routes 見 探索 OpenStack 之(11):cinder-api Service 啟動過程分析 以及 WSGI / Paste deploy / Router 等介紹)。其中identity 和 assignment 分別定義了 admin 和 public 使用的 routes,分別供 admin service 和 public service 使用。 
controller.py 檔案定義了該元件所管理的物件,比如 assignment 的controller.py 檔案定義了 Tenant、Role、Project 等類。
core.py 定了了兩個類 Manager 和 Driver。Manager 類對外提供該元件操作具體物件的方法入口; Driver 類定義了該元件需要其Driver實現類所提供的介面。
backend 目錄下的每個檔案是每個具體driver 的實現

下載keystone-10.0.0演示www.openstack.org

九 keystone服務啟動

Keystone is an HTTP front-end to several services. Like other OpenStack applications, this is done using python WSGI interfaces and applications are configured together using Paste. The application’s HTTP endpoints are made up of pipelines of WSGI middleware。。。

詳見:http://docs.openstack.org/developer/keystone/architecture.html

 

/usr/bin/keystone-all 會啟動 keystone 的兩個service:admin and main,它們分別對應 /etc/keystone/keystone-paste.ini 檔案中的兩個composite:

可見 admin service 提供給administrator 使用;main 提供給 public 使用。它們分別都有 V2.0 和 V3 版本,只是目前的 keystone Cli 只支援 V2.0.比較下 admin 和 public:

名稱 middlewares factory 功能區別
admin 比 public 多 s3_extension keystone.service:public_app_factory

從 factory 函式來看, admin service 比 public service 多了 identity 管理功能, 以及 assignment 的admin/public 區別:

1. admin 多了對 GET /users/{user_id} 的支援,多了 get_all_projects, get_project,get_user_roles 等功能

2. keystone 對 admin service 提供 admin extensions, 比如 OS-KSADM 等;對 public service 提供 public extensions。

簡單總結一下, public service 主要提供了身份驗證和目錄服務功能;admin service 增加了 tenant、user、role、user group 的管理功能。

public

sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body_v2

json_body ec2_extension user_crud_extension

keystone.service:admin_app_factory

 

/usr/bin/keystone-all 會啟動 admin 和 public 兩個 service,分別繫結不同 host 和 埠。預設的話,繫結host 都是 0.0.0.0; admin 的繫結埠是 35357 (admin_port), public 的繫結埠是 5000 (public_port)。因此,給 admin 使用的 OS_AUTH_URL 為 http://controller:35357/v2.0, 給 public 使用的 OS_AUTH_URL=http://controller:5000/v2.0

 

keystone詳細說明

WSGI server的父程式(50511號程式)開啟兩個socket去分別監聽本環境的5000和35357號埠,
其中5000號埠是為main的WSGI server提供的,35357號埠為admin的WSGI server提供的。
即WSGI server的父程式接收到5000號埠的HTTP請求時,則將把該請求轉發給為main開啟的WSGI server去處理,
而WSGI server的父程式接收到35357號埠的HTTP請求時,則將把該請求轉發給為admin開啟的WSGI server去處理。

vim /etc/keystone/keystone-paste.ini

日誌
2016-09-14 11:53:01.037 12698 INFO keystone.common.wsgi [req-07b28d5b-084c-467e-b45a-a4c8a52b7e96
9ff041112e454cca9b54bf117a80ca29 15426931fe4746d08736c5e5c1da6b1c 
- 6e495643fb014e5e8a3992c69d80d234 6e495643fb014e5e8a3992c69d80d234] 
GET http://controller02:35357/v3/auth/tokens


(1) type = composite

這個型別的section會把URL請求分發到對應的Application,use表明具體的分發方式,比如”egg:Paste#urlmap”表示使用Paste包中的urlmap模組,這個section裡的其他形式如”key = value”的行是使用urlmap進行分發時的引數。

(2) type = app

一個app就是一個具體的WSGI Application。

(3) type = filter-app

接收一個請求後,會首先呼叫filter-app中的use所指定的app進行過濾,如果這個請求沒有被過濾,就會轉發到next所指定的app進行下一步的處理。

(4) type = filter

與filter-app型別的區別只是沒有next。

(5) type = pipeline

pipeline由一系列filter組成。這個filter鏈條的末尾是一個app。pipeline型別主要是對filter-app進行了簡化,
否則,如果多個filter,就需要多個filter-app,然後使用next進行連線。OpenStack的paste的deploy的配置檔案主要採用的pipeline的方式。
因為url為http://192.168.118.1:5000/v2.0/tokens,因為基本url的後面接的資訊為/v2.0,所以將到public_api的section作相應操作。

 

相關文章