OpenStack Keystone 認證服務完整學習指南
OpenStack管理摘要本文全面介紹了OpenStack認證管理服務Keystone的核心概念與實踐操作。首先詳細解析了Keystone的八大基本概念Domain、User、Group、Project、Role、Service、Endpoint、Token、Credential及其相互關系然后通過命令行實操演示了域管理、用戶管理、組管理、項目創建與配額設置等關鍵操作。接著深入剖析了Keystone的三大核心功能用戶權限管理、服務端點維護、認證與鑒權并詳細解釋了User、Credentials、Authentication、Token、Project、Service、Endpoint、Role等核心概念的工作機制。最后通過查詢可用image的實際操作示例完整展示了OpenStack內部認證流程包括登錄驗證、Token獲取、服務端點訪問和權限驗證等關鍵步驟幫助讀者建立對Keystone認證體系的系統性理解。OpenStack認證管理-KeystoneKeystone基本概念Domain域Keystone中一個虛擬概念一個域是一組User Group或Project的容器User用戶是可以通過Keystone訪問OpenStack服務的個人、系統或某個服務Group用戶組是一組User的容器可以向Group中添加用戶并直接給Group分配角色Project項目是各個服務中一些可以訪問的資源集合項目只需在某個域下唯一即可Role角色具有一組定義的用戶權限和特權以執行一組特定操作角色不同被賦予的權限不同Service服務一種OpenStack服務服務會對外暴露一個或多個端點用戶可以通過這些端點訪問資源并執行操作Endpoint端點是指一個可以用來訪問某個具體服務的網絡地址Token令牌是允許訪問特定資源的憑證Credential憑證確認用戶身份的數據如用戶的用戶名和密碼?Domain一個域可以對應一個大的機構、一個數據中心并且必須全局唯一。云的終端用戶可以在自己的Domain中創建多個Project、User、Group和Role。具備對多個Project進行統一管理的能力。?UserKeystone會通過認證信息Credential如密碼等驗證用戶請求的合法性通過驗證的用戶將會分配到一個特定的令牌該令牌可以被當作后續資源訪問的一個通行證并非全局唯一只需要在域內唯一即可。?Group用戶組是一組User的容器可以向Group中添加用戶并直接給Group分配角色在這個Group中的所有用戶就擁有了Group所擁有的角色權限。通過引入Group的概念Keystone實現了對用戶組的管理達到了同時管理一組用戶權限的目的。?Project項目是各個服務中的一些可以訪問的資源集合。我們需要在創建虛擬機時指定某個項目在Cinder創建卷時也需要指定具體的項目。用戶總是被默認綁定到某些項目上在用戶訪問項目的資源前必須具有對該項目的訪問權限或者說在特定項目下被賦予了特定的角色。項目不必全局唯一只需要在某個域下唯一即可。在OpenStack的界面和文檔中Tenant/Project/Account這幾個術語是通用的但長期看會傾向使用Project公有云叫租戶?Role一個用戶所具有的角色角色不同意味著被賦予的權限不同只有知道用戶被賦予的角色才能知道該用戶是否有權限訪問某資源。用戶可以被賦予一個域或項目內的角色。一個用戶被賦予域的角色意味著他對域內所有的項目都具有相同的角色而特定項目的角色只具有對特定項目的訪問權限。角色可以被繼承在一個項目樹下擁有父項目的訪問權限也意味著同時擁有對子項目的訪問權限。角色必須全局唯一。查看domain[rootcontroller ~]# source keystonerc_admin[rootcontroller ~(keystone_admin)]# openstack domain list------------------------------------------------------------------------|ID|Name|Enabled|Description|------------------------------------------------------------------------|2c99588e109d427abb530cbb9aada74a|heat|True|||default|Default|True|The default domain|------------------------------------------------------------------------創建domain:# 創建新的domain叫domain-test[rootcontroller ~(keystone_admin)]# openstack domain create domain-test-----------------------------------------------|Field|Value|-----------------------------------------------|description|||enabled|True||id|c70009318d0141c7a84b26ff427ff9d6||name|domain-test||options|{}||tags|[]|-----------------------------------------------#再次驗證確實多了一個domain-test[rootcontroller ~(keystone_admin)]# openstack domain list----------------------------------------------------------------------------|ID|Name|Enabled|Description|----------------------------------------------------------------------------|2c99588e109d427abb530cbb9aada74a|heat|True|||c70009318d0141c7a84b26ff427ff9d6|domain-test|True|||default|Default|True|The default domain|----------------------------------------------------------------------------[rootcontroller ~(keystone_admin)]#刪除domain:[rootcontroller ~(keystone_admin)]# openstack domain set --disable domain-test #設置domain禁用[rootcontroller ~(keystone_admin)]# openstack domain delete domain-test[rootcontroller ~(keystone_admin)]# openstack domain list------------------------------------------------------------------------|ID|Name|Enabled|Description|------------------------------------------------------------------------|2c99588e109d427abb530cbb9aada74a|heat|True|||default|Default|True|The default domain|------------------------------------------------------------------------開啟多域登錄界面[rootcontroller ~(keystone_admin)]# cd /etc/openstack-dashboard/[rootcontroller openstack-dashboard(keystone_admin)]# lscinder_policy.json glance_policy.json keystone_policy.json local_settings local_settings.d neutron_policy.json nova_policy.d nova_policy.json[rootcontroller openstack-dashboard(keystone_admin)]# vim local_settings#修改配置文件83行如下開啟keystone支持多域83OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORTTrue[rootcontroller openstack-dashboard(keystone_admin)]# systemctl restart httpd測試多域登錄效果列出所有用戶[rootcontroller ~(keystone_admin)]# openstack user list----------------------------------------------|ID|Name|----------------------------------------------|7ef9147a8abe485889ece90dce340ab1|admin||8624a4e61d6c4b589814c369af26cb5f|heat_admin||8770fb183087426eb29543f3d629b66f|glance||c3eba4bb5577404285b333e4de5c1909|cinder||c286b069d5064a2b8050b3438f31ef7f|nova||66fbd238901143d1a2b9e1e848117aff|placement||7e1d63925490464c897f75275c7364e6|neutron||1dd2bd1d566a4f4091e99441bb1da9b5|swift||9368227a55f44dba85e10bc7c696813c|heat||be5dc0149ba4402db25045a17a3d7a59|heat-cfn||e1ddffa452504776bc845f6f4114cd14|gnocchi||fda949b4ff944336bb3206d6f7e6bc4c|ceilometer||10286ba1e9974e6994fe9908ab0db617|aodh|----------------------------------------------創建新用戶user1#創建用戶user1密碼HUAWEI[rootcontroller ~(keystone_admin)]# openstack user create --password HUAWEI user1-------------------------------------------------------|Field|Value|-------------------------------------------------------|domain_id|default||enabled|True||id|77ae3f5b216749ef8663c3bdb5679d36||name|user1||options|{}||password_expires_at|None|-------------------------------------------------------#查看用戶列表有沒有新創建的用戶user1user1在最下面[rootcontroller ~(keystone_admin)]# openstack user list----------------------------------------------|ID|Name|----------------------------------------------|7ef9147a8abe485889ece90dce340ab1|admin||8624a4e61d6c4b589814c369af26cb5f|heat_admin||8770fb183087426eb29543f3d629b66f|glance||c3eba4bb5577404285b333e4de5c1909|cinder||c286b069d5064a2b8050b3438f31ef7f|nova||66fbd238901143d1a2b9e1e848117aff|placement||7e1d63925490464c897f75275c7364e6|neutron||1dd2bd1d566a4f4091e99441bb1da9b5|swift||9368227a55f44dba85e10bc7c696813c|heat||be5dc0149ba4402db25045a17a3d7a59|heat-cfn||e1ddffa452504776bc845f6f4114cd14|gnocchi||fda949b4ff944336bb3206d6f7e6bc4c|ceilometer||10286ba1e9974e6994fe9908ab0db617|aodh||77ae3f5b216749ef8663c3bdb5679d36|user1|----------------------------------------------#查看user1用戶詳細信息[rootcontroller ~(keystone_admin)]# openstack user show user1-------------------------------------------------------|Field|Value|-------------------------------------------------------|domain_id|default||enabled|True||id|77ae3f5b216749ef8663c3bdb5679d36||name|user1||options|{}||password_expires_at|None|-------------------------------------------------------創建組group1并將user1加入group1#創建組group1[rootcontroller ~(keystone_admin)]# openstack group create group1-----------------------------------------------|Field|Value|-----------------------------------------------|description|||domain_id|default||id|f259902c4c0242d3b392d951494e747f||name|group1|-----------------------------------------------#列出所有的組[rootcontroller ~(keystone_admin)]# openstack group list------------------------------------------|ID|Name|------------------------------------------|f259902c4c0242d3b392d951494e747f|group1|------------------------------------------#查看group1組詳細信息[rootcontroller ~(keystone_admin)]# openstack group show group1-----------------------------------------------|Field|Value|-----------------------------------------------|description|||domain_id|default||id|f259902c4c0242d3b392d951494e747f||name|group1|-----------------------------------------------#將user1加入group1[rootcontroller ~(keystone_admin)]# openstack group add user group1 user1#查看user1是否隸屬于group1[rootcontroller ~(keystone_admin)]# openstack group contains user group1 user1user1ingroup group1查看角色role[rootcontroller ~(keystone_admin)]# openstack role list----------------------------------------------------|ID|Name|----------------------------------------------------|030b4ca553dc41349168eaca4fd43f42|ResellerAdmin||461321ea6a284081b692a469a15d7938|SwiftOperator||4ef39ef24f694c9aa6c1101622da0e92|admin||8b24d8bef4004573a8f3cb1f5a1517a8|_member_||973e0706bc66471a90d09f177bfb6a1d|member||a3af83fe8bf84014b01feae786f83b8b|heat_stack_owner||ce4a3e671d9040359d6f6f55555bf429|reader||e9cd36ba1b8744878cc15a05709ab1fd|heat_stack_user|----------------------------------------------------給group1賦予角色admin[rootcontroller ~(keystone_admin)]# openstack role add --project admin --group group1 admin驗證group1角色[rootcontroller ~(keystone_admin)]# openstack role assignment list --names --group group1-----------------------------------------------------------------------|Role|User|Group|Project|Domain|System|Inherited|-----------------------------------------------------------------------|admin||group1Default|adminDefault|||False|-----------------------------------------------------------------------創建ProjectA:#創建項目ProjectA[rootcontroller ~(keystone_admin)]# openstack project create ProjectA-----------------------------------------------|Field|Value|-----------------------------------------------|description|||domain_id|default||enabled|True||id|a6aa11ee311a46889ac34e49b8da47d1||is_domain|False||name|ProjectA||options|{}||parent_id|default||tags|[]|-----------------------------------------------#查看驗證命令[rootcontroller ~(keystone_admin)]# openstack project list[rootcontroller ~(keystone_admin)]# openstack project show projectA#ProjeectA分配給用戶user1[rootcontroller ~(keystone_admin)]# openstack user set --project ProjectA user1#給項目ProjectA里的用戶user1賦予角色admin[rootcontroller ~(keystone_admin)]# openstack role add --user user1 --project ProjectA admin查看ProjectA現象思考同樣的 方式創建一個項目ProjectB,分配給用戶user2角色admin創建一個用戶user3,在項目ProjectA中的角色為member修改ProjectA配額#將Project配額設置為實例3vcpu 5,內存5000MB[rootcontroller ~(keystone_admin)]# openstack quota set --instance 3 --cores 5 --ram 5000 ProjectA修改配額實驗現象使用user1登錄切換到ProjectA查看OpenStack有哪些服務:[rootcontroller ~(keystone_admin)]# openstack service list--------------------------------------------------------------|ID|Name|Type|--------------------------------------------------------------|006d8f9e6a054e238a1093fe5af715bf|swift|object-store||1abf3641147f40368f8d1c7e8b5677e1|heat|orchestration||2e6919aa53eb48cb99bc992b506a0e3e|glance|image||5dfb29073cf140199cc78b2d84fac299|keystone|identity||5ed901220a18430f8d423f9a95d43477|ceilometer|metering||8ec4ba00f67448ad8acedc744dce2d87|heat-cfn|cloudformation||9a6c3edee4ba431db7d1cac840b91dcb|neutron|network||a747c0c45e544fa9b20538474ac579d1|nova|compute||c4e445f741a943ff897eb494cca6df6e|cinderv2|volumev2||d06744c3ad6343988bb0ab60b291ffeb|placement|placement||db9e425f65ac4808ab62dc1659f58916|cinderv3|volumev3||e11ec9b570254141bdac2ff3ec75179d|aodh|alarming||e3a0ba8fe0f844249bfa3a90ec6a6fea|gnocchi|metric|--------------------------------------------------------------查看OpenStack endpoint:三個入口admin\public\internal查看catalog:理解Keystone核心概念作為 OpenStack 的基礎支持服務Keystone 做下面這幾件事情管理用戶及其權限維護 OpenStack Services 的 EndpointAuthentication認證和 Authorization鑒權學習 Keystone得理解下面這些概念UserUser 指代任何使用 OpenStack 的實體可以是真正的用戶其他系統或者服務。當 User 請求訪問 OpenStack 時Keystone 會對其進行驗證。Horizon 在身份管理用戶 管理 User除了 adminOpenStack 也為 nova、cinder、glance、neutron 服務創建了相應的 User。 admin 也可以管理這些 User。CredentialsCredentials 是 User 用來證明自己身份的信息可以是用戶名/密碼TokenAPI Key其他高級方式AuthenticationAuthentication 是 Keystone 驗證 User 身份的過程。User 訪問 OpenStack 時向 Keystone 提交用戶名和密碼形式的 CredentialsKeystone 驗證通過后會給 User 簽發一個 Token 作為后續訪問的 Credential。TokenToken 是由數字和字母組成的字符串User 成功 Authentication 后 Keystone 生成 Token 并分配給 User。Token 用做訪問 Service 的 CredentialService 會通過 Keystone 驗證 Token 的有效性Token 的有效期默認是 24 小時ProjectProject 用于將 OpenStack 的資源計算、存儲和網絡進行分組和隔離。根據 OpenStack 服務的對象不同Project 可以是一個客戶公有云也叫租戶、部門或者項目組私有云。這里請注意資源的所有權是屬于 Project 的而不是 User。在 OpenStack 的界面和文檔中Tenant / Project / Account 這幾個術語是通用的但長期看會傾向使用 Project每個 User包括 admin必須掛在 Project 里才能訪問該 Project 的資源。 一個User可以屬于多個 Project。admin 相當于 root 用戶具有最高權限Horizon 在 身份管理項目 中管理 Project通過 管理成員將 User 添加到 ProjectServiceOpenStack 的 Service 包括 Compute (Nova)、Block Storage (Cinder)、Object Storage (Swift)、Image Service (Glance) 、Networking Service (Neutron) 等。每個 Service 都會提供若干個 EndpointUser 通過 Endpoint 訪問資源和執行操作。EndpointEndpoint 是一個網絡上可訪問的地址通常是一個 URL。Service 通過 Endpoint 暴露自己的 API。 Keystone 負責管理和維護每個 Service 的 Endpoint。可以使用下面的命令來查看 Endpoint。[rootcontroller ~(keystone_admin)]# openstack endpoint list[rootcontroller ~(keystone_admin)]# openstack catalog listRole安全包含兩部分Authentication認證和 Authorization鑒權Authentication 解決的是“你是誰”的問題Authorization 解決的是“你能干什么”的問題Keystone 借助 Role 實現 AuthorizationKeystone定義Role可以為 User 分配一個或多個 RoleHorizon 的菜單為 Identity-Project-Manage MembersService 決定每個 Role 能做什么事情 Service 通過各自的 policy.json 文件對 Role 進行訪問控制。 下面是 Nova 服務 /etc/nova/policy.json 中的示例訪問策略規則以JSON格式指定文件名為policy.json策略文件的路徑是/etc/SERVICE_NAME/policy.json例如/etc/keystone/policy.jsonpackstack安裝策略文件路徑是/etc/openstack-dashboard/SERVICE_NAME_policy.jsonOpenStack 默認配置只區分 admin 和非 admin Role。 如果需要對特定的 Role 進行授權可以修改 policy.json(一般不要改)。下一節我們將通過例子加深對這些概念的理解。通過例子學習keystone上一節介紹了 Keystone 的核心概念。本節我們通過“查詢可用 image”這個實際操作讓大家對這些概念建立更加感性的認識。User admin 要查看 Project 中的 image第 1 步 登錄當點擊登入時OpenStack 內部發生了哪些事情請看下面Token 中包含了 User 的 Role 信息第 2 步 顯示操作界面請注意頂部顯示 admin 可訪問的 Project 為 “admin” ”。 其實在此之前發生了一些事情同時admin 可以訪問 實例, 鏡像 卷等服務這是因為 admin 已經從 Keystone 拿到了各 Service 的 Endpoints第 3 步 顯示 鏡像 列表點擊 “鏡像”會顯示鏡像列表背后發生了這些事首先 admin 將請求發送到 Glance 的 EndpointGlance 向 Keystone 詢問 admin 身份是否有效接下來 Glance 會查看 /etc/glance/policy.json 判斷 admin 是否有查看 image 的權限權限判定通過Glance 將 image 列表發給 admin。TroubleshootOpenStack 排查問題的方法主要是通過日志。每個 Service 都有自己的日志文件。Keystone 主要有一個日志 keystone.log 保存在 /var/log/keystone/ 目錄里。[rootcontroller nova(keystone_admin)]# cd /var/log/keystone/[rootcontroller keystone(keystone_admin)]# lskeystone.log如果需要得到最詳細的日志信息可以在 /etc/keystone/keystone.conf 中打開 debug 選項[rootcontroller keystone(keystone_admin)]# cd /etc/keystone/[rootcontroller keystone(keystone_admin)]# lsdefault_catalog.templates fernet-keys keystone.conf logging.conf policy.d policy.json puppet.conf sso_callback_template.html[rootcontroller keystone(keystone_admin)]# vim keystone.conf# 修改配置文件第94行94debugTrue?我們以創建VM為例站在整個OpenStack角度來看一下整個認證流程是怎樣的。?首先用戶需要使用OpenStack第一步就要向Keystone提供用戶名密碼來獲取Token。當用戶獲取Token后需要向Nova發送創建虛擬機請求Nova負責調用計算資源并管理虛擬機的生命周期所以這個創建請求要發送到Nova。請求的Head中會攜帶Token當Nova-api接收到請求后會將Token傳遞到Keystone進行驗證是否有效合法。當驗證成功后返回信息給NovaNova才開始進行創建VM操作。這邊不具體介紹Nova如何操作但是我們知道創建一臺虛擬機不僅需要準備CPU、內存等計算資源還要有相應的網絡、存儲等資源這里以網絡資源為例Nova-api將token透傳給Nova-computeNova-compute會向Neutron-server發送與網絡相關操作請求請求Head中也攜帶TokenNeutron收到請求后也會將Token傳遞到Keystone驗證驗證成功才執行相應操作。?這個流程中我們可以看到不同服務間的調用也要攜帶Token并且Keystone只校驗了Token的有效性那么每個服務的操作權限控制是怎么實現的呢?首先用戶發送基本信息給Keystone一般是用戶名和密碼。Keystone經過驗證后會返回一個Token給用戶用戶向Nova發送創建虛擬機請求并攜帶Token信息nova接收到請求后會拿著Token去Keystone進行驗證驗證成功后開始執行創建VM操作Nova會向Glance發送申請鏡像信息并攜帶Token會向Neutron發送申請網絡信息也會攜帶TokenGlance和Neutron組件接收到請求后都會向Keystone驗證Token的有效性圖中僅用了一條線表示請注意理解驗證通過即執行相應的操作返回完成信息當VM創建完成后Nova返回創建成功信息給用戶用戶即可使用虛擬機。

相關新聞

樹莓派4英寸LCD觸摸屏驅動配置與嵌入式顯示應用實戰

樹莓派4英寸LCD觸摸屏驅動配置與嵌入式顯示應用實戰

1. 項目概述:4英寸樹莓派LCD觸摸屏的定位與價值 最近在搗鼓一個樹莓派的小項目,想給它配個便攜的屏幕,找來找去,最終鎖定了一款“4inch RPi LCD (A)”。這玩意兒在樹莓派玩家圈子里挺常見的,說白了就是一塊專門為樹莓派…

2026/8/2 2:44:37 閱讀更多
ESP32-S3驅動LED點陣屏:從硬件連接到DMA圖形顯示實戰

ESP32-S3驅動LED點陣屏:從硬件連接到DMA圖形顯示實戰

1. 項目概述:當ESP32-S3遇上點陣屏,一場硬件創意的化學反應如果你玩過ESP32,那你一定知道它作為一款高性價比、功能強大的Wi-Fi/藍牙雙模MCU,在物聯網和智能硬件圈子里有多火。但今天我們要聊的,是它的“升級版”——E…

2026/8/2 2:44:37 閱讀更多
C++跨平臺打開網頁:ShellExecute與system函數實戰指南

C++跨平臺打開網頁:ShellExecute與system函數實戰指南

1. 項目概述:從命令行到瀏覽器窗口 “C怎樣打開網頁?” 這個問題乍一看很簡單,但背后其實涉及了從系統調用到進程間通信,再到現代軟件開發中命令行工具與圖形界面交互的多個層面。它絕不僅僅是調用一個函數那么簡單。對于C開發者…

2026/8/2 13:06:09 閱讀更多
Spark Streaming微批次架構解析與實時計算實踐指南

Spark Streaming微批次架構解析與實時計算實踐指南

1. 項目概述:為什么Spark Streaming依然是實時計算的基石 最近和幾個做數據平臺的朋友聊天,發現一個挺有意思的現象:盡管現在實時計算領域新框架層出不窮,比如Flink風頭正勁,但在很多公司的生產環境里,Spar…

2026/8/2 13:06:09 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費下載鏈接】GetQzonehistory 獲取QQ空間發布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費下載鏈接】GetQzonehistory 獲取QQ空間發布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應用材料(Applied Materials)公司生產的一款用于半導體設備的I/O信號分配電路板。該型號(0100-02186)的核心特點如下:專用于Endura等半導體工藝腔室。集成信號路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機是日本日清(Nissei)品牌的一款工業用三相異步電機,適用于自動化設備及通用機械驅動。該型號(FFMN-32L-10-T0 40AX)的核心特點如下:三相交流異步電動機。額定…

2026/8/2 2:52:49 閱讀更多