1. 程式人生 > >深入理解Keystone 認證

深入理解Keystone 認證

最近在搞keystone,學習一下keystone的幾種認證方式:UUID, PKI。

UUID 認證流程

 

1.使用者輸入使用者名稱密碼,傳送給keystone。Horizon登陸時候輸入的使用者密碼或者CLI中的source的使用者名稱密碼環境變數。

2.Keystone驗證使用者名稱密碼,並且生成token(UUID),傳送給客戶端。

3.客戶端快取UUID token

4.客戶端傳送具體的執行請求(nova boot)和UUID給keystone。

5.Keystone從http請求中獲取token,並檢查token是否有效

6.Token有效,處理請求,並返回客戶端請求結果

7.Token失效,拒絕客戶端請求,返回401。

PKI認證

通過keystone-manage pki_setup生成私鑰及自簽署證書。

 

對與pki(包括pkiz)認證方式,keystone相當於一個權威的認證中心,他用自己和的私鑰證書對使用者的token進行簽名。 OpenStack服務中的每一個API Endpoint都有一份keystone簽發的證書,失效列表和根證書。API不用在直接去keystone認證token是否合法,只需要根據keystone的證書和失效列表就可以確定token是否合法。但是這裡還是會有每次都需要請求keystone去獲取失效列表的操作,不可避免。

兩種格式各有優劣,最大的不同是UUID必須每次都經過Keystone才能認證,而PKI是自包含的,service可以自己根據標準演算法來檢查簽名, 這樣的好處就是提高了驗證效率,Keystone不會成為整個Openstack的瓶頸。但是PKI token也帶來了一個問題,因為PKI token包含了很多元資料以及catalog等資訊,會很大,不僅帶來了網路開銷,而且可能超出一些伺服器的限制,引發異常

PKI認證流程大部分和UUID相似,可以對比上邊兩個圖。只有下邊幾處不相同。

1) CMS格式的token

CMStoken包含三部分:service catalog,user role 和metadata。例項如下:

{
   "access": {
       "metadata": {
           ....metadata goes here....
       },
       "serviceCatalog": [
           ....endpoints goes here....
       ],
       "token": {
           "expires": "2013-05-26T08:52:53Z",
           "id": "placeholder",
           "issued_at": "2013-05-25T18:59:33.841811",
           "tenant": {
               "description": null,
               "enabled": true,
               "id": "925c23eafe1b4763933e08a4c4143f08",
               "name": "user"
           }
       },
       "user": {
           ....userdata goes here....
       }
   }
}

2) Token的驗證

Token的驗證包含三個方面:token的簽名,token是否失效和token是否已經在撤銷列表。

用openssl cms -verify -certfile /tmp/keystone-signing-nova/signing_cert.pem -CAfile /tmp/keystone-signing-nova/cacert.pem -inform PEM -nosmimecap -nodetach -nocerts -noattr < cms_token命令驗證token簽名。

根據expiration date判斷token是否失效

向keystone查詢token是否已經在撤銷列表。

Openstack相關技術交流請加群:314889201