1. 程式人生 > >OpenStack keystone元件詳解

OpenStack keystone元件詳解

1.keystone簡介

 Keystone是 OpenStack中負責管理身份驗證、服務規則和服務令牌功能的模組。使用者訪問資源需要驗證使用者的身份與許可權,服務執行操作也需要進行許可權檢測,這些都需要通過 Keystone來處理。Keystone類似一個服務匯流排,其他服務通過keystone來註冊其服務的Endpoint(服務訪問的URL),任何服務之間相互的呼叫,需要經過Keystone的身份驗證,來獲得目標服務的Endpoint來找到目標服務。

2.keystone基本概念


使用者與認證
管理使用者以及進行 Authentication(認證)和 Authorization(鑑權)
服務目錄


維護 OpenStack Services 的 Endpoint,為每個元件服務提供一個可用的服務目錄和相應的API入口端點。

下圖是一個簡單認證流程:
這裡寫圖片描述
下圖是一個的詳細認證流程:
這裡寫圖片描述

2.1 Authentication認證

 Authentication 是 Keystone 驗證 User 身份的過程,認證User 訪問 OpenStack 時向 Keystone 提交使用者名稱和密碼形式的 Credentials,Keystone 驗證通過後會給 User 簽發一個 Token 作為後續訪問的 Credential。

2.2 Credentials證書、憑證

 Credentials 是 User 用來證明自己身份的資訊。例如,使用者名稱和密碼, 使用者名稱和API key,或Identity服務提供的身份驗證令牌token。credentials示意圖:
這裡寫圖片描述

2.3 Domain域

 Identity Service API v3實體。域是專案和使用者的集合,用於定義管理身份實體的管理邊界。域可以代表個人,公司或運營商擁有的空間。它們直接向系統使用者公開管理活動。可以為使用者授予域的管理員角色。域管理員可以在域中建立專案,使用者和組,並將角色分配給域中的使用者和組。

2.4 Endpoint

 Endpoint 是一個網路上可訪問的地址,通常是一個 URL,Service 通過 Endpoint 暴露自己的 API。
可以使用下面的命令來檢視 Endpoint:

[[email protected] ~]# . admin-openrc 
[[email protected] ~]# openstack catalog list +-----------+-----------+------------------------------------------------------------------------+ | Name | Type | Endpoints | +-----------+-----------+------------------------------------------------------------------------+ | neutron | network | RegionOne | | | | public: http://controller:9696 | | | | RegionOne | | | | admin: http://controller:9696 | | | | RegionOne | | | | internal: http://controller:9696 | | | | | | cinderv2 | volumev2 | RegionOne | | | | admin: http://controller:8776/v2/9a8169bc534e4705816e97bff4d2866b | | | | RegionOne | | | | public: http://controller:8776/v2/9a8169bc534e4705816e97bff4d2866b | | | | RegionOne | | | | internal: http://controller:8776/v2/9a8169bc534e4705816e97bff4d2866b | | | | | | keystone | identity | RegionOne | | | | admin: http://controller:35357/v3/ | | | | RegionOne | | | | public: http://controller:5000/v3/ | | | | RegionOne | | | | internal: http://controller:5000/v3/ | | | | | | placement | placement | RegionOne | | | | internal: http://controller:8778 | | | | RegionOne | | | | admin: http://controller:8778 | | | | RegionOne | | | | public: http://controller:8778 | | | | | | cinderv3 | volumev3 | RegionOne | | | | public: http://controller:8776/v3/9a8169bc534e4705816e97bff4d2866b | | | | RegionOne | | | | admin: http://controller:8776/v3/9a8169bc534e4705816e97bff4d2866b | | | | RegionOne | | | | internal: http://controller:8776/v3/9a8169bc534e4705816e97bff4d2866b | | | | | | nova | compute | RegionOne | | | | internal: http://controller:8774/v2.1 | | | | RegionOne | | | | admin: http://controller:8774/v2.1 | | | | RegionOne | | | | public: http://controller:8774/v2.1 | | | | | | glance | image | RegionOne | | | | public: http://controller:9292 | | | | RegionOne | | | | admin: http://controller:9292 | | | | RegionOne | | | | internal: http://controller:9292 | | | | | +-----------+-----------+------------------------------------------------------------------------+

Service與Endpoint關係:
(1):在openstack中,每一個service中都有三種Endpoint:Admin、Public、Internal(建立完service後需要為其建立API Endpoint)
(2):Admin使用者為管理員,能夠修改User Project(Tenant)
(3):public使用者為客戶端,使用者在外網管理自己雲伺服器
(4):internal使用者為內部元件間相互呼叫
(5):三種Endpoint在網路上開放的許可權也不同,Admin通常只能對內網開放,public通常可以對外網開放,internal只能對有安裝openstack服務的機器開放

2.5 Group組

 Identity Service API v3實體。組是域擁有的使用者的集合。授予域或專案的組角色適用於組中的所有使用者。向組中新增使用者或從組中刪除使用者會將其角色和身份驗證授予或撤消到關聯的域或專案。組的概念為了更好的管理使用者

2.6 OpenStackClient

 多個OpenStack服務的命令列介面,包括Identity API。例如,使用者可以執行 openstack服務create和 openstack端點create命令來在其OpenStack安裝中註冊服務。

2.7 Project專案

 Project 用於將 OpenStack 的資源(計算、儲存和網路)進行分組和隔離。 根據 OpenStack 服務的物件不同,Project 可以是一個客戶(公有云,也叫租戶)、部門或者專案組(私有云)。
這裡請注意:
1. 資源的所有權是屬於 Project 的,而不是 User。
2. 在 OpenStack 的介面和文件中,Tenant / Project / Account 這幾個術語是通用的,但長期看會傾向使用 Project
3. 每個 User(包括 admin)必須掛在 Project 裡才能訪問該 Project 的資源。 一個User可以屬於多個 Project。
4. admin 相當於 root 使用者,具有最高許可權
openstack介面專案如下圖:
這裡寫圖片描述
通過管理成員將 User 新增到 Project中:
這裡寫圖片描述

2.8 Region區域

 Identity Service API v3實體。表示OpenStack部署中的一般部門。您可以將零個或多個子區域與區域相關聯,以形成樹狀結構化層次結構。雖然區域沒有地理內涵,但部署可以使用區域的地理名稱,例如us-east。
region異地機房認證流程如下圖:
這裡寫圖片描述

2.9 Role角色

 具有一組已定義的使用者許可權和特權的個性,用於執行特定的操作集。Identity服務向用戶發出包含角色列表的令牌。當用戶呼叫服務時,該服務解釋使用者角色集,並確定每個角色授予訪問許可權的操作或資源。
 安全包含兩部分:Authentication(認證)和 Authorization(鑑權) Authentication 解決的是“你是誰?”的問題 Authorization 解決的是“你能幹什麼?”的問題
Keystone 是藉助 Role 來實現 Authorization 的,檢視Keystone中定義Role:

[[email protected] ~]# openstack role list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 5dadd0205e644ed8b99c0842ba8f02b4 | admin |
| 8e50219ae4a44daea5fba43dc3a3bdbc | user  |
+----------------------------------+-------+

可以為 User 分配一個或多個 Role ,Horizon 的選單檢視角色:
這裡寫圖片描述
 Service 決定每個 Role 能做什麼事情 Service 通過各自的 policy.json 檔案對 Role 進行訪問控制,通過配置這個檔案,keystone實現了對User基於Role的許可權管理,下面是 Nova 服務/etc/nova/policy.json 中的示例:
這裡寫圖片描述
 上面配置的含義是:對於 create、attach_network 和 attach_volume 操作,任何Role的 User 都可以執行; 但只有 admin 這個 Role 的 User 才能執行 forced_host 操作。
OpenStack 預設配置只區分 admin 和非 admin Role。 如果需要對特定的 Role 進行授權,可以修改 policy.json。Policy就是用來控制User對Project(tenant)中資源的操作許可權

2.10 Service服務

 OpenStack 的 Service 包括 Compute (Nova)、Block Storage (Cinder)、Object Storage (Swift)、Image Service (Glance) 、Networking Service (Neutron) 等,每個 Service 都會提供若干個 Endpoint,User 通過 Endpoint 訪問資源和執行操作。

2.11 Token令牌

 一個由字母和數字組成的字串,可以訪問OpenStack API和資源。令牌可以在任何時間被撤銷,並且在有限的持續時間內有效,User 成功 Authentication 後由 Keystone 分配給 User。
1. Token 用做訪問 Service 的 Credential
2. Service 會通過 Keystone 驗證 Token 的有效性
3. Token 的有效期預設是 24 小時
token獲取大致流程:
這裡寫圖片描述

2.12 User使用者

 使用OpenStack雲服務的個人,系統或服務的數字表示。身份服務驗證傳入請求是由聲稱正在進行呼叫的使用者做出的。使用者具有登入名,可以使用分配的令牌訪問資源。使用者可以直接分配到特定專案,其行為就像它們包含在該專案中一樣。
這裡寫圖片描述
 當 User 請求訪問 OpenStack 時,Keystone 會對其進行驗證,openstack介面使用者如下:
這裡寫圖片描述
 除了 admin 和 demo,OpenStack 也為 nova、cinder、glance、neutron 服務建立了相應的 User,admin 也可以管理這些 User。

3. 例項建立過程分析

 以建立一個VM為例分析認證流程:
這裡寫圖片描述
1.使用者/API 想建立一個例項,首先會將自己的credentials發給keystone。認證成功後,keystone會頒給使用者/API一個臨時的令牌(Token)和一個訪問服務的Endpoint。 PS:Token沒有永久的
2.使用者/API 把臨時Token提交給keystone,keystone並返回一個Tenant(Project)
3.使用者/API 向keystone傳送帶有特定租戶的憑證,告訴keystone使用者/API在哪個專案中,keystone收到請求後,會發送一個專案的token到使用者/API PS:第一個Token是來驗證使用者/API是否有許可權與keystone通訊,第二個Token是來驗證使用者/API是否有許可權訪問我keystone的其它服務。使用者/API 拿著token和Endpoint找到可訪問服務
4.服務向keystone進行認證,Token是否合法,它允許訪問使用該服務(判斷使用者/API中role許可權)?
5.keystone向服務提供額外的資訊。使用者/API是允許方法服務,這個Token匹配請求,這個Token是使用者/API的
6.服務執行使用者/API發起的請求,建立例項
7.服務會將狀態報告給使用者/API。最後返回結果,例項已經建立

參考:
https://www.cnblogs.com/charles1ee/p/6293387.html
http://www.cnblogs.com/CloudMan6/p/5365474.html