深入理解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是否已經在撤銷列表。