引言
OpenStack是一個開源的云計算管理平臺,其中的Keystone組件承擔了身份認證和授權的關鍵任務。Keystone的主要功能包括管理用戶及其權限、維護OpenStack Services的Endpoint,以及實現認證(Authentication)和鑒權(Authorization)。本文將詳細介紹Keystone的概念、架構和工作原理,幫助讀者全面了解這一重要組件。
概念
在深入了解Keystone之前,我們需要掌握以下幾個關鍵概念:User、Role、Credentials、Authentication、Endpoint、Service、Project、Token。
User
User指代任何使用OpenStack的實體,可以是真正的用戶、其他系統或服務。
User請求訪問OpenStack時,Keystone會對其進行驗證。Horizon在Identity → Users管理User。
除了admin和demo,OpenStack也為nova、cinder、glance、neutron服務創建了相應的User。admin也可以管理這些User。
Credentials
Credentials是User用來證明自己身份的信息,可以是:我們常用的是用戶名密碼,服務間調用更多使用API
- 用戶名/密碼
- Token
- API Key
- 其他高級方式
Authentication
Authentication是Keystone驗證User身份的過程。User訪問OpenStack時向Keystone提交用戶名和密碼形式的Credentials,Keystone驗證通過后會給User簽發一個Token作為后續訪問的Credential。
Token
Token是由數字和字母組成的字符串,User成功Authentication后,它由Keystone分配給User。Token有以下幾個特點:
[root@controller ~]# openstack token issue
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires | 2024-05-26T19:37:46+0000 |
| id | gAAAAABmU4F6q8oI_cs0MAjRbW0gfBx7EO8de0yJgLmFhDkJopZ3PfYQt1GqvwHR3JYJ6E8aMRG_RSPOtsV62n9jYhMgSrBEjumV0RxsP13bWNgTUL_EGl9i80SeWDuFxOIyJH20D6iLSnyAkK6oPwarL9TMUq8AT1RK5ALH1uifRhR1CPio3oc |
| project_id | d59c27d7429043b2946f0a6dad3e8b23 |
| user_id | 786f7f88b8f54e3d8b1803302874e088 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
- 用作訪問Service的Credential。
- Service會通過Keystone驗證Token的有效性。
- Token的有效期默認是24小時。
Project
Project用于將OpenStack的資源(計算、存儲和網絡)進行分組和隔離。根據OpenStack服務的對象不同,Project可以是一個客戶(公有云,也叫租戶)、部門或者項目組(私有云)。需要注意的是:
- 資源的所有權是屬于Project的,而不是User。
- 在OpenStack的界面和文檔中,Tenant/Project/Account這幾個術語是通用的,但長期看會傾向使用Project。
- 每個User(包括admin)必須掛在Project里才能訪問該Project的資源。一個User可以屬于多個Project。
- admin相當于root用戶,具有最高權限。
Horizon在Identity → Projects中管理Project。
Service
OpenStack的Service包括Compute(Nova)、Block Storage(Cinder)、Object Storage(Swift)、Image Service(Glance)、Networking Service(Neutron)等。每個Service都會提供若干個Endpoint,User通過Endpoint訪問資源和執行操作。
[root@controller ~]# openstack service list
+----------------------------------+-----------+-----------+
| ID | Name | Type |
+----------------------------------+-----------+-----------+
| 592b6fb33ba145b08d82ebf1a78722e3 | cinderv3 | volumev3 |
| 6bba92daaec84045bda8a6e9bfd1482e | neutron | network |
| a5d11ea72ef64e0d930dbcec6f613451 | placement | placement |
| badd1fad979245248bc283c6323eeeab | nova | compute |
| dbae1267347b41ada92ca5124be265f0 | glance | image |
| e4a3642cd7e744628cb7f02e1db943ea | keystone | identity |
| e92dafa002b4415d9748b136a7f1dd5d | cinderv2 | volumev2 |
+----------------------------------+-----------+-----------+
Endpoint
Endpoint是一個網絡上可訪問的地址,通常是一個URL。Service通過Endpoint暴露自己的API。Keystone負責管理和維護每個Service的Endpoint。
[root@controller ~]# openstack endpoint list
+----------------------------------+-----------+--------------+--------------+---------+-----------+------------------------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+---------+-----------+------------------------------------------+
| 10a3e2c5e08646c8b9f2053954876a5d | RegionOne | cinderv3 | volumev3 | True | public | http://controller:8776/v3/%(project_id)s |
| 14eca16dcf1b489db8868f1cf6f28742 | RegionOne | glance | image | True | internal | http://controller:9292 |
| 21a4e9e8e8e04ea0b385e80784ed85b8 | RegionOne | cinderv2 | volumev2 | True | public | http://controller:8776/v2/%(project_id)s |
| 3db45f1cb48b49d5abf11fd595c5a6dc | RegionOne | placement | placement | True | admin | http://controller:8778 |
| 4a691d2ce3e84bce974239ea143d43c7 | RegionOne | cinderv3 | volumev3 | True | admin | http://controller:8776/v3/%(project_id)s |
| 4f9d7cccbda8497f82f8530a005f8c9c | RegionOne | neutron | network | True | internal | http://controller:9696 |
| 5a234f89aa4749cf838f1154bec0ea41 | RegionOne | cinderv2 | volumev2 | True | admin | http://controller:8776/v2/%(project_id)s |
| 61658e610e0b4b4992069a71b519843e | RegionOne | nova | compute | True | public | http://controller:8774/v2.1 |
| 78e6b70e82b94e2c8c72aadc10e724b8 | RegionOne | placement | placement | True | internal | http://controller:8778 |
| 7e8082a9938c45ea9de9942bed04a568 | RegionOne | keystone | identity | True | public | http://controller:5000/v3/ |
| 8c7727d7148d45638fd051693ea79451 | RegionOne | glance | image | True | public | http://controller:9292 |
| 95bdf028d3214870a57f585cbc68ed4d | RegionOne | cinderv3 | volumev3 | True | internal | http://controller:8776/v3/%(project_id)s |
| a0e44e1b9cfe4bf4a759b02fa15abaf3 | RegionOne | nova | compute | True | admin | http://controller:8774/v2.1 |
| ab72f38a87f94795a14795e41fbff203 | RegionOne | nova | compute | True | internal | http://controller:8774/v2.1 |
| b4dce728b130414d8049c8aef40db89d | RegionOne | keystone | identity | True | internal | http://controller:5000/v3/ |
| c11199e4d46146138ed8487299fd9875 | RegionOne | placement | placement | True | public | http://controller:8778 |
| d13674a3786941738e92fdfe1895bed0 | RegionOne | glance | image | True | admin | http://controller:9292 |
| d2962bdeb1b14aaba5019bf658939636 | RegionOne | keystone | identity | True | admin | http://controller:5000/v3/ |
| d4fc12ffc0314077ba23e55115d310bb | RegionOne | neutron | network | True | admin | http://controller:9696 |
| d8bc5226848848d48ee4ac5d1f48a148 | RegionOne | cinderv2 | volumev2 | True | internal | http://controller:8776/v2/%(project_id)s |
| f9181eebb7b149e6af095e9b2849495c | RegionOne | neutron | network | True | public | http://controller:9696 |
+----------------------------------+-----------+--------------+--------------+---------+-----------+------------------------------------------+
[root@controller ~]#
Authorization
安全包含兩部分:Authentication(認證)和Authorization(鑒權)。
- Authentication解決的是“你是誰?”的問題。
- Authorization解決的是“你能干什么?”的問題。
Keystone是借助Role來實現Authorization的,Keystone定義Role,可以為User分配一個或多個Role。Horizon的菜單為Identity → Project → Manage Members。
Service決定每個Role能做什么事情。Service通過各自的policy.json文件對Role進行訪問控制。例如,Nova服務的policy.json中,對于create、attach network和attach volume操作,任何Role的User都可以執行,但只有admin這個Role的User才能執行forced host操作。OpenStack默認配置只區分admin和非admin Role。如果需要對特定的Role進行授權,可以修改policy.json。
Keystone常見概念
Keystone的架構設計靈活,支持多種后端存儲和認證機制。其整體架構可以分為以下幾個主要部分:
- 身份管理(Identity):管理用戶、組和憑據。支持多種身份后端,如SQL數據庫、LDAP等。
- 服務目錄(Catalog):管理和提供OpenStack各服務的API端點信息。
- 認證(Authentication):負責驗證用戶和服務的身份。支持多種認證機制,如用戶名/密碼、令牌、證書等。
- 授權(Authorization):基于角色和策略對用戶和服務進行授權。
- 策略管理(Policy):管理用于授權的策略規則。
- 多租戶管理(Multitenancy):支持項目(Project)和域(Domain)的隔離和管理。
- 令牌管理(Token):生成、驗證和撤銷令牌,用于身份認證。
Keystone概念詳解
身份管理(Identity)
身份管理是Keystone的核心功能之一,負責管理用戶、組和憑據信息。身份管理支持多種后端存儲,包括SQL數據庫和LDAP目錄服務。通過身份管理,管理員可以創建、更新、刪除用戶和組,并管理用戶的憑據,如密碼和API密鑰。
在通常情況下,用戶和用戶組數據由Keystone的Identity服務進行管理,這使得它能夠處理與這些數據相關的所有創建、讀取、更新和刪除(CRUD)操作。
然而,在更復雜的情況下,用戶和用戶組數據可能由權威的后端服務進行管理。例如,Identity服務可以充當LDAP(輕量級目錄訪問協議)的前端,而LDAP服務器則是權威的信息來源。在這種情況下,Identity服務會準確地中繼LDAP服務器上的信息
服務目錄(Catalog)
服務目錄是一個包含所有OpenStack服務API端點的數據庫。每個服務在注冊時,會將其API端點信息存儲在服務目錄中。用戶或其他服務在訪問OpenStack API時,可以通過查詢服務目錄獲取對應服務的端點信息,從而進行服務調用。
[root@controller ~]# openstack catalog list +-----------+-----------+------------------------------------------------------------------------+ | Name | Type | Endpoints | +-----------+-----------+------------------------------------------------------------------------+ | cinderv3 | volumev3 | RegionOne | | | | public: http://controller:8776/v3/d59c27d7429043b2946f0a6dad3e8b23 | | | | RegionOne | | | | admin: http://controller:8776/v3/d59c27d7429043b2946f0a6dad3e8b23 | | | | RegionOne | | | | internal: http://controller:8776/v3/d59c27d7429043b2946f0a6dad3e8b23 | | | | | | neutron | network | RegionOne | | | | internal: http://controller:9696 | | | | RegionOne | | | | admin: http://controller:9696 | | | | RegionOne | | | | public: http://controller:9696 | | | | | | placement | placement | RegionOne | | | | admin: http://controller:8778 | | | | RegionOne | | | | internal: http://controller:8778 | | | | RegionOne | | | | public: http://controller:8778 | | | | | | nova | compute | RegionOne | | | | public: http://controller:8774/v2.1 | | | | RegionOne | | | | admin: http://controller:8774/v2.1 | | | | RegionOne | | | | internal: http://controller:8774/v2.1 | | | | | | glance | image | RegionOne | | | | internal: http://controller:9292 | | | | RegionOne | | | | public: http://controller:9292 | | | | RegionOne | | | | admin: http://controller:9292 | | | | | | keystone | identity | RegionOne | | | | public: http://controller:5000/v3/ | | | | RegionOne | | | | internal: http://controller:5000/v3/ | | | | RegionOne | | | | admin: http://controller:5000/v3/ | | | | | | cinderv2 | volumev2 | RegionOne | | | | public: http://controller:8776/v2/d59c27d7429043b2946f0a6dad3e8b23 | | | | RegionOne | | | | admin: http://controller:8776/v2/d59c27d7429043b2946f0a6dad3e8b23 | | | | RegionOne | | | | internal: http://controller:8776/v2/d59c27d7429043b2946f0a6dad3e8b23 | | | | | +-----------+-----------+------------------------------------------------------------------------+
其次Keystone本身是在一個或多個端點(Endpoint)上公開的一組內部服務(Service)。這些內部服務涵蓋了Identity、Resource、Assignment、Token、Catalog等多個方面,并且許多內部服務往往以組合的方式被使用。例如,在進行身份驗證時,會使用到認證服務(Identity)來驗證用戶或項目的憑據,并在驗證成功后創建并返回一個帶有令牌服務(Token)的令牌。
除了提供內部服務外,Keystone還負責與OpenStack的其他服務(如計算、存儲或鏡像服務)進行交互。它提供一個或多個端點,用戶可以通過這些端點訪問資源并執行相關操作。
認證(Authentication)
認證模塊負責驗證用戶和服務的身份。Keystone支持多種認證機制,包括:
- 用戶名/密碼認證:最常見的認證方式,用戶通過提供用戶名和密碼進行身份驗證。
- 令牌認證:用戶在成功認證后,Keystone會生成一個令牌,用戶可以使用該令牌進行后續的API調用,無需每次都提供用戶名和密碼。
- 證書認證:基于SSL/TLS證書進行身份驗證。
- 多因素認證(MFA):結合多種認證機制,提供更高的安全性。
授權(Authorization)
授權模塊基于角色和策略對用戶和服務進行授權。Keystone使用角色(Role)和策略(Policy)來控制對資源的訪問權限。每個用戶可以被授予一個或多個角色,而角色對應的策略定義了該角色的權限范圍。
策略管理(Policy)
策略管理模塊負責管理用于授權的策略規則。策略規則通常采用JSON格式定義,并基于角色和資源類型來描述權限控制邏輯。管理員可以通過配置文件或API接口管理策略規則。
多租戶管理(Multitenancy)
Keystone支持多租戶環境,允許多個項目和域共存。項目(Project)和域(Domain)用于隔離和管理不同的租戶和資源。每個項目和域都有獨立的用戶、組和資源,確保不同租戶之間的隔離性和安全性。
令牌管理(Token)
令牌管理模塊負責生成、驗證和撤銷令牌。令牌是用戶在成功認證后由Keystone生成的,用于后續的API調用。令牌通常有一定的有效期,過期后需要重新認證以獲取新的令牌。
Keystone的組件架構圖
架構圖如下:
Keystone Middleware是Keystone提供的對令牌合法性進行驗證的中間件。
比如,在客戶端訪問Keystone提供的資源時提供了PKI類型的令牌,為了不必每次都通過Keystone服務的直接介入來驗證令牌的合法性,通常可以在中間件上進行驗證,前提是中間件上已經緩存了相關的證書與密鑰以對令牌進行簽名認證。
如果不是PKI類型的令牌,則需要通過keystoneauth獲得一個與Keystone服務連接的session,并通過調用Keystone服務提供的API來驗證令牌的合法性。
對于Keystone項目本身,除了后臺的數據庫,主要包括一個處理RESTful請求的API服務進程。這些API涵蓋了Identity、Token、Catalog和Policy等Keystone提供的各種服務,這些不同服務所能提供的功能則分別由相應的后端Driver(Backend Driver)實現。
Keystone的工作原理
了解Keystone的工作原理對于掌握其功能和使用方法至關重要。下面介紹Keystone的幾個關鍵工作流程。
用戶認證流程
- 用戶請求令牌:用戶向Keystone提交認證請求,通常包括用戶名和密碼。
- Keystone驗證憑據:Keystone驗證用戶提交的憑據是否有效。
- 生成令牌:驗證通過后,Keystone生成一個令牌并返回給用戶。
- 用戶使用令牌訪問服務:用戶在后續的API調用中使用該令牌進行身份驗證。
服務注冊和發現流程
- 服務注冊:每個OpenStack服務在啟動時,會向Keystone注冊其API端點信息。
- 用戶查詢服務目錄:用戶通過Keystone的服務目錄API查詢所有可用服務的端點信息。
- 調用服務API:用戶根據服務目錄提供的端點信息調用對應的服務API。
授權流程
- 用戶請求訪問資源:用戶向某個OpenStack服務提交API請求。
- 服務驗證令牌:該服務向Keystone驗證用戶提供的令牌是否有效。
- Keystone返回驗證結果:Keystone驗證令牌并返回驗證結果。
- 服務根據策略進行授權:服務根據其策略規則決定是否允許用戶執行該操作。