OpenStack之Keystone學習
OpenStack 管理了眾多的軟硬件資源,並且利用這些資源提供雲服務。而任何資源的管理,都會涉及到安全的管理,具體分為:
用戶認證
服務認證
口令認證
無論是私有雲還是共有雲,都會開放許多的接口給眾多的用戶,而Keystone是OpneStone的安全組件,Keystone在對於用戶進行認證的同時,也對用戶的權限進行了限制。Keystone還保證OpenStack的服務可以正常註冊。此外,各個服務組件之間的消息傳遞還需要用口令,當口令過期,則不再使用此口令。
Domain相當於Keystone中的第一行政劃分,比如顯示世界中的國家
通過上圖我們可以看到,Users,,Groups,Projects都是劃分到了Domain中,即一個Domain會有各種各樣的Users,Groups,Projects;但是我們會發現,Roles在不同的Domain中是唯一的,且不屬於Domain.
在Keystone中,Users/Projects/Groups都是按照Domain劃分的。Role是全局的,即一個用戶在Domain A中是admin,那麽在Domain B中會也是admin
Projects/Tenant(這兩個是)是OpenStack中的一組資源打包之後的抽象,比如VMS ,images,Volumes等。意味著,這些資源都是歸這個Project/Tenant所擁有
Projects並不擁有users/users Groups(用戶/用戶組),users和users groups是利用role與Tenant產生聯系的(稱為Grant)
註:Projects和Tenant其實是等價的概念,只是因為歷史原因,名稱不同罷了,現在一般都用Tenant
Roles
users必須依靠某個Tenant才可以進入keystone的世界,而users與Tenant的橋梁就是Roles
如:在家裏,role=(兒子/父親/母親),在學校,roles=(教師/學生/職工)
而一個users要和Tenant取得聯系,就必須被賦予某個角色,如userA 通過Admin角色進入Tenant,userB通過member角色進入到Tenant
問:有時候並不清楚一個user應該被加到那個Tenant中,則此時用戶如何直接與Keystone進行認證?
答:創建與用戶名同名的Tenant,如下圖
在為users綁定一個簡單的角色(role),如Admin,在綁定這個Admin給與users同名的Tenant,這樣用戶便可以直接與keystone進行交互
註:在創建Tenant時,我們可以故意將其創建的和用戶名稱一樣,這是一中取巧的方法
問:Tenant的作用是什麽?
如王二這個users自己肯定是王二組的admin,但王二也有可能被分配到開發組,且在開發組是一個member,這樣王二就可以利用member這個role進入到開發組,從而使用開發組的資源,但是他的權限在開發組中是受到限制的
鄭五既是自己組的Admin有是開發組的Admin,即可以利用Admin這個role進入到開發組,並使用開發組的所有資源,並且擁有所有權限
王二和鄭五的區別就是對於開發組的role不同,則這兩個人對開發組的虛擬機資源的使用權限也就不同
Tenant作用的另一個場景
Keystone會創建一個叫做service的Tenant,然後通過service這個Tenant把OpenStack的所有其他服務都註冊到這個叫service的Tenant上面,如將Neutron,Nova,Galance等service服務全部註冊進入service這個Tenant中,從而對服務進行統一的管理
問:Domain的作用是什麽?
Domain主要是進行域的劃分
如有兩個域,一個為亞太研發區,一個為歐洲研發區
而在亞太研發區中,有2個Tenant,分別為研發組和測試組;三個users,分別為,研發經理,測試經理Peter,且Peter只是研發組和測試組這兩個Tenant的member(role 為member)
通過這種行政劃分,我們便可以把不同的Domain,不同的Tenant,不同的users進行相應的綁定
問:如何區別不同Domain中同名的Tenant或users?
答:通過UUID來區分
在openstack/keystone中都是通過UUID進行區分的,所有的名稱都是給人看的,對Keystone來說,所有的的資源都是通過UUID區分的。
如在亞太研發區和歐洲研發區中都有Peter這個users這個用戶存在,單對openstack來說這是兩個用戶,只是名稱相同罷了,他們的UUID是不同的,同理研發組這個Tenant在兩個域中也是不同的,其UUID也不同
若UUID相等,則說明是指同一個資源,UUID是openstack中的身份證,可以將Keystone比作公安局,現實中的公安局也是通過身份證進行區分人的,而openstack中所有的資源,所有的內部識別都是通過UUID進行的區分
keystone 的認證哲學:
1: 我們都是自己的Admin,所以一般創建Tenant時會創建一個與自己同名的Tenant
2: users進入不同的Tenant時必須標識自己的角色是什麽(Admin,member)
3: 如果不在某個Tenant中,則對這個Tenant中資源是不可見的;因為角色不同,Tenant中的資源權限也不相同
keystone中的認證流程:
即:需要進入keystone中一般要提供:密碼,用戶名,Domain名,Tenant。
問:是不是每次的認證都要提供用戶名和密碼?
答:並不是,第一次認證需要提供用戶名,密碼,Tenant,Domain,然後keystone會返回一個Token給用戶使用,以後每次都依靠keystone發送的Token進行認證
通過這個Token,可以查到這個用戶的密碼/用戶名/權限/屬於哪個Tenant等信息
下面是一個用戶創建虛擬機的流程
1:用戶發送證書就是提供了用戶名/密碼/Tenant/Domain
2:keystone返回一個令牌,令牌就是Token
3:用戶提供創建的請求+Token給Nova組件
4:Nova收到用戶提供的請求和Token後,會詢問keystone,用戶提供的Token是否合法?用戶是否能使用這個服務?若果keystone驗證沒有問題,則進入第五步
5:Nova提交常見鏡像的請求+Token給Glance,Glance收到Nova提供的請求和Token,會繼續詢問Token,這個Token是否合法,用戶是否可以使用此服務?如果keystone驗證通過,則一直往下走
。。。。。。。
。。。。。
可以看到openstack中,後面的所有服務都是采用Token進行認證的,所以用戶不必每次都輸入用戶名/密碼
問:keystone如何知道其他的服務在哪裏?怎麽知道其他的服務請求是否合法?
答:這是就要用到catalog
keystone除了負責用戶的認證之外,還負責Service Endpoint的管理。這個功能類似於現實 中的工商局,市場所有提供的服務都要在工商局進行註冊備案
在返回用戶的Token時,keystone也會返回所有在keystone上祖冊的服務列表
如下圖:
1:用戶提供用戶名,密碼,Domain,Tenant
2:keystone返回Token + 各種已經註冊的服務的地址
3:用戶拿到Token +Nova的服務地址,則向Nova發起請求
4:Nova拿到用戶提供的Token,然後詢問keystone,Token是否合法 +用戶是否有權限使用服務。。。。。。。
Policy
Policy主要用來判斷一個用戶是不是Admin,是不是一個資源的owner等;Policy可以讓Roles這個這個角色正真的產生作用,即真正區分一個users能幹什麽?不能幹什麽?
Policy在當前還是靜態的,如判斷一個人是不是Admin,是通過policy.json裏面的定義進行的,接著通過“role==admin”......等判斷
下圖為policy.json文件
keystone服務和特點:
identify:存儲了用戶,可以提供用戶相應的認證
Assignment:存儲了權限的管理
Resource:存儲了Tenant,Domain等
Token:用來解決用戶後續的認證(保證不必每次認證都需要輸入用戶名和密碼)
Catalog:存儲了所有已經在keystone上註冊過的服務信息和地址
Policy:真正實現Roles的作用,區分一個Users的權限
註:本文不涉及Keystone的安裝操作
keystone安裝完成之後,keystone還不能直接使用,還必須進行keystone的初始化。
1:向Catalog中註冊keystone服務
2:keystone註冊Admin用戶
3:keystone創建service Tenant
4:keystone穿件Demo用戶
本文出自 “11097124” 博客,請務必保留此出處http://11107124.blog.51cto.com/11097124/1961262
OpenStack之Keystone學習