keystone命令與client接口學習


keystone學習
------------------
Keystone(OpenStack Identity Service)是OpenStack框架中,負責身份驗證、服務規則和服務令牌的功能, 它實現了OpenStack的IdentityAPI。Keystone類似一個服務總線, 或者說是整個Openstack框架的注冊表, 其他服務通過keystone來注冊其服務的Endpoint(服務訪問的URL),任何服務之間相互的調用, 需要經過Keystone的身份驗證, 來獲得目標服務的Endpoint來找到目標服務。

Keystone基本概念介紹
          1. User
  User即用戶,他們代表可以通過keystone進行訪問的人或程序。Users通過認證信息(credentials,如密碼、API Keys等)進行驗證。

  2. Tenant
  Tenant即租戶,它是各個服務中的一些可以訪問的資源集合。例如,在Nova中一個tenant可以是一些機器,在Swift和Glance中一個tenant可以是一些鏡

像存儲,在Quantum中一個tenant可以是一些網絡資源。Users默認的總是綁定到某些tenant上。

  3. Role
  Role即角色,Roles代表一組用戶可以訪問的資源權限,例如Nova中的虛擬機、Glance中的鏡像。Users可以被添加到任意一個全局的 或 租戶內的角色中。

在全局的role中,用戶的role權限作用於所有的租戶,即可以對所有的租戶執行role規定的權限;在租戶內的role中,用戶僅能在當前租戶內執行role規定的權限。

  4. Service
  Service即服務,如Nova、Glance、Swift。根據前三個概念(User,Tenant和Role)一個服務可以確認當前用戶是否具有訪問其資源的權限。但是當一個user嘗試着訪問其租戶內的service時,他必須知道這個service是否存在以及如何訪問這個service,這里通常使用一些不同的名稱表示不同的服務。在上文中談到的Role,實際上也是可以綁定到某個service的。例如,當swift需要一個管理員權限的訪問進行對象創建時,對於相同的role我們並不一定也需要對nova進行管理員權限的訪問。為了實現這個目標,我們應該創建兩個獨立的管理員role,一個綁定到swift,另一個綁定到nova,從而實現對swift進行管理員權限訪問不會影響到Nova或其他服務。

  5. Endpoint
  Endpoint,翻譯為“端點”,我們可以理解它是一個服務暴露出來的訪問點,如果需要訪問一個服務,則必須知道他的endpoint。因此,在keystone中包含一個endpoint模板(endpoint template,在安裝keystone的時候我們可以在conf文件夾下看到這個文件),這個模板提供了所有存在的服務endpoints信息。一個endpoint template包含一個URLs列表,列表中的每個URL都對應一個服務實例的訪問地址,並且具有public、private和admin這三種權限。public url可以被全局訪問(如http://compute.example.com),private url只能被局域網訪問(如http://compute.example.local),admin url被從常規的訪問中分離。

WSGI API(包頭)
當成功驗證后中間件經為下行的WSGI應用發送如下包頭:
X-Identity-Status
提供請求是否被驗證的信息。
X-Tenant
提供了租戶ID(在Keystone中以URL的形式出現)。在Keysotne轉為采用ID/Name模式之前,它為租戶提供了對任意遺留實現的支持。
X-Tenant-Id
唯一不變的租戶ID。
X-Tenant-Name
唯一但可變的租戶名字。
X-User
用於登錄的用戶名。
X-Roles
分配給用戶的角色。



命令流程
--------------------
1. 獲取token(一個unscoped token,沒有 和tenant綁定)  
 首先,需要確認你將訪問那個tenant,必須使用keystone來獲取一個unscoped token(意味着這個token沒有和特定的tenant綁定),這個unscoped token能夠用來深入查詢keystone service,確定你能訪問哪些tenants。獲取一個unscoped token,使用典型的REST API,在request的body中不指定tenantName。

2. 獲取tenants  
接下來的一步是,使用unscoped token來獲取能訪問的tenants,其中租期已經由你分配的角色決定了,對於每個tenant,都有一個確定的角色。所有在service endpoint上執行的操作都需要一個scoped token。獲取能訪問的tenants,使用 GET /tenants keystone API,其中將unscoped token寫入X-Auth-Token。得到一個tenants數組,包含了能夠訪問的tenants。

3. 獲取scoped tokens  
獲取了能夠訪問的tenants之后,決定訪問某個tenants,就開始需要獲取一個scoped token,這個scoped token與某個特定的tenant綁定,能夠提供這個tenant的metadata和在tenant中的角色。獲取scoped token需要使用POST /tokens keystone API,像第一步一樣,這有兩種形式的API。  
更重要的是,其中包含了一組service endpoints。這些endpoints 確定了獲取的token能夠訪問的服務,Keystone service manage都是基於service/endpoing catalog的.通過這些endpoings,決定訪問其中的service。

4. 使用scoped tokens  
現在已經獲取了scoped tokens,並且知道了endpoint API的url,下一步就是調用這些service endpoint。在這一步,使用keystone來確證token的有效性。存在兩種類型的token,一種基於UUID的,一種基於PKI(Public Key Infrastructure)。

5. 驗證role metadata  
Endpoint service 使用token的metadata來驗證用戶能夠訪問請求的服務。這一般都涉及到Role Base Access Control(RBAC)。基於服務的policy.json文件,使用rule engine來決定用戶的token包含適當的角色訪問。  

6. 請求服務  
到此,user就能夠去通過api訪問有權限訪問的資源。

一個unscoped tokens例子:

一個scoped tokens例子:
client SDK使用
------------------
1. 使用
>>> from keystoneclient.v2_0 import client
>>> keystone = client.Client(...)
>>> keystone.tenants.list() # List tenants

2. 獲得權限
>>> from keystoneclient.v2_0 import client
>>> username='adminUser'
>>> password='secreetword'
>>> tenant_name='openstackDemo'
>>> auth_url='http://192.168.206.130:5000/v2.0'
>>> keystone = client.Client(username=username, password=password,
...                          tenant_name=tenant_name, auth_url=auth_url)

3. 建立租戶  
>>> from keystoneclient.v2_0 import client
>>> keystone = client.Client(...)
>>> keystone.tenants.create(tenant_name="openstackDemo",
...                         description="Default Tenant", enabled=True)

4. 建立用戶 
>>> from keystoneclient.v2_0 import client
>>> keystone = client.Client(...)
>>> tenants = keystone.tenants.list()
>>> my_tenant = [x for x in tenants if x.name=='openstackDemo'][0]
>>> my_user = keystone.users.create(name="adminUser",
...                                 password="secretword",
...                                 tenant_id=my_tenant.id)

5. 建立角色和增加用戶
>>> from keystoneclient.v2_0 import client
>>> keystone = client.Client(...)
>>> role = keystone.roles.create('admin')
>>> my_tenant = ...
>>> my_user = ...
>>> keystone.roles.add_user_role(my_user, role, my_tenant)

6. 建立服務和endpoints
>>> from keystoneclient.v2_0 import client
>>> keystone = client.Client(...)
>>> service = keystone.services.create(name="nova", service_type="compute",
...                                    description="Nova Compute Service")
>>> keystone.endpoints.create(
...     region="RegionOne", service_id=service.id,
...     publicurl="http://192.168.206.130:8774/v2/%(tenant_id)s",
...     adminurl="http://192.168.206.130:8774/v2/%(tenant_id)s",


參考
----------------
2. openstack keystone流程分析: http://www.cnblogs.com/liuan/p/3194499.html 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM