自動(dòng)化運(yùn)維平臺(tái)中的統(tǒng)一認(rèn)證接入與SSO單點(diǎn)登錄
前言:
在工作中,大大小小開發(fā)了不少自動(dòng)化運(yùn)維平臺(tái),能更好的提高效率以及人工的失誤。有朋友問(wèn)我,登錄平臺(tái)的賬號(hào)密碼如何的管理。當(dāng)聽到這個(gè)問(wèn)題的時(shí)候,我說(shuō)直接入庫(kù)呀,但是說(shuō)完后,覺(jué)得相當(dāng)?shù)牟煌祝钌俸臀椰F(xiàn)在解決方案也不一樣。
以前做運(yùn)維開發(fā)項(xiàng)目的時(shí)候,每個(gè)app都是一套用戶密碼,頂多做了一個(gè)加密流轉(zhuǎn),申請(qǐng)接入的時(shí)候,需要領(lǐng)導(dǎo)的郵件審批,后期改成ldap在openldap做認(rèn)證了。 但是現(xiàn)在不這么搞了。
原因呢? 我相信大家公司肯定都有認(rèn)證的接口,先說(shuō)下常見的認(rèn)證接口有那兩種(我就見過(guò)這兩種,希望朋友補(bǔ)充):
- 公司的各個(gè)平臺(tái)通過(guò)ldap連入windows ad目錄,或者是連入特定的db。 當(dāng)時(shí)這樣很不安全,如果我是開發(fā)者的話,用戶輸入用戶名和密碼的時(shí)候,點(diǎn)擊登錄,我完全可以把賬號(hào)密碼給print出來(lái)。
- Passport方案,這個(gè)算是統(tǒng)一認(rèn)證,一般是oauth,但是oauth相對(duì)麻煩點(diǎn)。大家有時(shí)候,要登錄論壇的時(shí)候,他會(huì)提示可以用qq,支付寶,人人的賬號(hào)登錄。 我現(xiàn)在的方案就是類似這種的方法,好! 下面說(shuō)下,我對(duì)這個(gè)統(tǒng)一認(rèn)證的接口使用。
我自己也寫過(guò)一個(gè) 統(tǒng)一認(rèn)證平臺(tái)接口,是基于cookie方式的,實(shí)現(xiàn)的方法相對(duì)簡(jiǎn)單,但是很有效,安全方面讓安全部門測(cè)試過(guò),在一定條件下,還是很安全的。在以前公司開發(fā)的多個(gè)平臺(tái)也都接入了這個(gè)統(tǒng)一認(rèn)證。
語(yǔ)言:python 框架:tornado 模塊:requests,flask-admin,oauth2 組件:redis,mysql 前端:Bootstrap |
對(duì)于python oauth2的方案,可以看 https://github.com/simplegeo/python-oauth2
- 得到授權(quán)碼code
- 獲取access token
- 通過(guò)access token,獲取OpenID
- 通過(guò)access token及OpenID調(diào)用API,獲取用戶授權(quán)信息
這里的方案不是oauth2,因?yàn)閛auth2更多的是給大批的第三方應(yīng)用設(shè)計(jì)的,咱們這里只是做passport認(rèn)證,用oauth2顯得不是太合適。
集群平臺(tái)clusterops clusterops.xiaorui.cc,中心認(rèn)證passport.xiaorui.cc為例:
- 判斷用戶是否登錄,已經(jīng)在passport登錄的話,可以直接訪問(wèn)clusterops,如果沒(méi)有登錄的話,會(huì)轉(zhuǎn)跳到 passprot.xiaorui.cc/redirect?urlto=clusterops.xiaorui.cc
- 當(dāng)轉(zhuǎn)跳到 passprot.xiaorui.cc/redirect?urlto=clusterops.xiaorui.cc的時(shí)候,會(huì)提示用你的域賬戶和密碼登錄,登錄成功后,會(huì)再次轉(zhuǎn)跳到 clusterops.xiaorui.cc/api?res=aqggzwnasdzo9kzwsxedclmcksduwe8sdf0d&Token=F3fQk1eTJWu2XbWHEzuXXJ0KoJeH6O
- clusterops接收api接口的res和Token字段數(shù)據(jù),用這兩個(gè)字段以cookie的方式去訪問(wèn)passport.xiaorui.cc/getuserdata?accesstime=時(shí)間戳
- 統(tǒng)一認(rèn)證端passport拿到了cookie在redis里面做對(duì)比,然后判斷access時(shí)間,在5分鐘之內(nèi),符合要求給他return 用戶數(shù)據(jù),如果不符合,就給他回一個(gè)錯(cuò)誤數(shù)據(jù)。
- clusterops解析了返回的json數(shù)據(jù),把username及一些數(shù)據(jù),放到session里面,這樣用戶就完成了認(rèn)證及登錄。
看這個(gè)流程圖比較直觀點(diǎn),一般來(lái)說(shuō)我們只是對(duì)于web應(yīng)用做認(rèn)證接入,認(rèn)證后,在這個(gè)web應(yīng)用的所有動(dòng)作權(quán)限,都是在web應(yīng)用本身做的。如果每個(gè)應(yīng)用和連接都再次向認(rèn)證系統(tǒng)去驗(yàn)證cookie、session,那就會(huì)有瓶頸,所以用saml使兩個(gè)認(rèn)證服務(wù)器做認(rèn)證通信 !
上面說(shuō)的只是統(tǒng)一認(rèn)證方面的,下面再來(lái)說(shuō)說(shuō)單點(diǎn)登錄。
單點(diǎn)登錄SSO(Single Sign-On)是身份管理中的一部分。SSO的一種較為通俗的定義是:SSO是指訪問(wèn)同一服務(wù)器不同應(yīng)用中的受保護(hù)資源的同一用戶,只需要登錄一次,即通過(guò)一個(gè)應(yīng)用中的安全驗(yàn)證后,再訪問(wèn)其他應(yīng)用中的受保護(hù)資源時(shí),不再需要重新登錄驗(yàn)證。
開源的sso,也有不少,我用過(guò)lemonldap這個(gè)websso方案,感覺(jué)還不錯(cuò)。
SSO的好處:
方便用戶:從用戶實(shí)際使用角度考慮
用戶使用應(yīng)用系統(tǒng)時(shí),能夠一次登錄,多次使用。用戶不再需要每次輸入用戶名稱和用戶密碼,也不需要牢記多套用戶名稱和用戶密碼。
方便管理員:從日常維護(hù)管理角度考慮
系統(tǒng)管理員只需要維護(hù)一套統(tǒng)一的用戶賬號(hào),方便、簡(jiǎn)單。相比之下,系統(tǒng)管理員以前需要管理很多套的用戶賬號(hào)。每一個(gè)應(yīng)用系統(tǒng)就有一套用戶賬號(hào),不僅給管理上帶來(lái)不方便,而且,也容易出現(xiàn)管理漏洞,開發(fā)者也不知道用戶的賬號(hào)密碼
簡(jiǎn)化應(yīng)用系統(tǒng)開發(fā):從應(yīng)用擴(kuò)展角度考慮
開發(fā)新的應(yīng)用系統(tǒng)時(shí),可以直接使用單點(diǎn)登錄平臺(tái)的用戶認(rèn)證服務(wù),簡(jiǎn)化開發(fā)流程。單點(diǎn)登錄平臺(tái)通過(guò)提供統(tǒng)一的認(rèn)證平臺(tái),實(shí)現(xiàn)單點(diǎn)登錄。因此,應(yīng)用系統(tǒng)并不需要開發(fā)用戶認(rèn)證程序。
單點(diǎn)登錄在這里就很好體現(xiàn)了,只要用戶登錄了passport統(tǒng)一認(rèn)證,登錄后平臺(tái)會(huì)session標(biāo)記,只要?jiǎng)e的項(xiàng)目指向PassPort認(rèn)證,那自然而然他們都可以登錄了。
另外,我們一定要再開發(fā)一套針對(duì)統(tǒng)一認(rèn)證passport的權(quán)限控制,不然每個(gè)應(yīng)用都自己控制admin和guest的權(quán)限,這樣會(huì)顯得很亂。 這段時(shí)間我也配置一套權(quán)限管理接口,可以配套在統(tǒng)一認(rèn)證接口上,權(quán)限控制的很細(xì),一個(gè)頁(yè)面,一個(gè)菜單,一個(gè)動(dòng)作都可以控制。
歐了,這里是我自己對(duì)于運(yùn)維平臺(tái)的統(tǒng)計(jì)認(rèn)證,sso單點(diǎn)登錄,權(quán)限管理的理解。 我相信,我的這篇文章更加適合新手理解,當(dāng)然肯定也有理解出問(wèn)題的地方,請(qǐng)大神指正 !