李 強
(中電金信軟件有限公司,浙江 杭州310000)
銀行的應(yīng)用系統(tǒng)越來越多,每個系統(tǒng)單獨管理各自的用戶,容易形成信息孤島,分散的用戶管理模式阻礙了銀行應(yīng)用向平臺化演進。當(dāng)銀行的業(yè)務(wù)發(fā)展到一定規(guī)模,構(gòu)建統(tǒng)一的賬戶管理體系將是必不可少的,因為它是銀行未來互聯(lián)網(wǎng)云平臺的重要基礎(chǔ)設(shè)施,能夠為平臺帶來統(tǒng)一的賬號管理、身份認(rèn)證和用戶授權(quán),為銀行帶來諸如跨系統(tǒng)單點登錄、第三方授權(quán)等基礎(chǔ)能力,為構(gòu)建開放平臺和業(yè)務(wù)生態(tài)提供必要的條件。
常見的賬戶管理產(chǎn)品有:CA 公司的SiteMinder,其價格昂貴;IBM 公司的 Tivoli Access Manager,其需購買且和 IBM 其他產(chǎn)品結(jié)合較緊密;Atlassian 公司的 Crowd,其需購買且和自家的 Jira、Confluence 結(jié)合較緊密;Oracle 公司的OpenAM,它是一個率先開源的認(rèn)證授權(quán)產(chǎn)品,對Oracle 的產(chǎn)品支持較好;耶魯太學(xué)發(fā)起的開源項目CAS(Central Authentication Service),其簡單、實效、安全,支持多種客戶端,支持單點登錄(Single Sign On,SSO)、開放授權(quán)(Open Authorization,OAuth)等。
考慮到費用、易用性、支持廣泛度等因素,本設(shè)計選擇了開源產(chǎn)品CAS。
CAS 包含服務(wù)端和客戶端兩部分,服務(wù)端是一個獨立部署的WAR 包,負(fù)責(zé)用戶認(rèn)證??蛻舳素?fù)責(zé)處理對受保護資源的訪問,支持 Java、.NET、PHP 等多種軟件平臺,極太地方便了各種系統(tǒng)的接入[1]。
CAS 支持 SSO, 即用戶登錄一個系統(tǒng)后, 再訪問權(quán)限范圍內(nèi)的其他系統(tǒng)時不用再次登錄[2-3]。 常見的如:用戶登錄淘寶網(wǎng)頁后,再訪問天貓網(wǎng)頁時無需再次登錄即可使用。
OAuth 是實現(xiàn)第三方授權(quán)的開放框架,在用戶無需提供賬號和密碼的情況下,允許第三方應(yīng)用訪問用戶存于某服務(wù)商的資源(如個人信息、照片等)[4]。常見的如: 在微信中點擊某應(yīng)用后, 會被請求授權(quán),點擊授權(quán)后,可以在這個被授權(quán)應(yīng)用里看到自己的微信名稱、頭像等信息。 這就是被授權(quán)應(yīng)用訪問了自己在微信里的數(shù)據(jù)。
OAuth 框架定義了四種角色[5],以微信授權(quán)為例:(1)資源所有者:指正在使用微信的用戶;(2)資源服務(wù)器:指微信保存用戶數(shù)據(jù)的服務(wù)器;(3)客戶端:指在微信里請求用戶授權(quán)的應(yīng)用;(4)授權(quán)服務(wù)器:用戶點擊授權(quán)后會轉(zhuǎn)到此服務(wù)器進行授權(quán)。
CAS 支持 OAuth,其結(jié)合 OAuth,可簡化客戶端的開發(fā),提供標(biāo)準(zhǔn)的授權(quán)流程,支持 Web 應(yīng)用、桌面應(yīng)用、手機應(yīng)用。 CAS 使用 HTTP 進行對接,支持各種軟件的接入[6]。
本文采用CAS+OAuth 的方案來實現(xiàn)銀行內(nèi)部和外部的統(tǒng)一認(rèn)證授權(quán),可以實現(xiàn)用戶的單點登錄,也可以為外部的第三方應(yīng)用授權(quán),從而使用外部的服務(wù)。
本設(shè)計的架構(gòu)圖如圖 1 所示,描述如下:(1)用戶訪問 Web 應(yīng)用、桌面應(yīng)用或手機應(yīng)用;(2)應(yīng)用服務(wù)器將用戶轉(zhuǎn)到 CAS 服務(wù)器;(3)CAS 服務(wù)器是獨立部署的,負(fù)責(zé)認(rèn)證授權(quán),它需要訪問目錄服務(wù)器(LDAP)或數(shù)據(jù)庫;(4)用戶在 CAS 服務(wù)器上完成認(rèn)證授權(quán)后,CAS 服務(wù)器將發(fā)放 SSO 票據(jù)或 OAuth 令牌給用戶;(5)用戶的后續(xù)訪問會自動攜帶票據(jù)或令牌來完成,避免了再次登錄授權(quán)。
圖1 架構(gòu)圖
TGT(Ticket Granting Ticket),代表了用戶的一次單點登錄會話[7]。
ST(Service Ticket),代表了 CAS 服務(wù)器對用戶在某應(yīng)用的一次授權(quán)[7]。
假設(shè)有兩個被保護的銀行內(nèi)部應(yīng)用:貸款系統(tǒng)和卡系統(tǒng),下面描述了用戶訪問時是怎樣保護資源的。
3.1.1 第一次訪問貸款系統(tǒng)
用戶第一次訪問貸款系統(tǒng)時,被轉(zhuǎn)到CAS 服務(wù)器去認(rèn)證。 用戶在 CAS 的登錄頁面輸入賬號和密碼后登錄成功。 CAS 服務(wù)器為用戶創(chuàng)建一個SSO會話,并把 TGT、ST 返回給用戶。 瀏覽器會把 TGT保存起來,并攜帶 ST 去訪問貸款系統(tǒng)。 貸款系統(tǒng)轉(zhuǎn)到CAS 服務(wù)器去驗證ST,驗證通過后,貸款系統(tǒng)為用戶創(chuàng)建貸款系統(tǒng)會話。 瀏覽器保存貸款系統(tǒng)會話,后續(xù)訪問都會攜帶這個會話,貸款系統(tǒng)驗證會話通過后,向用戶顯示訪問的資源。 時序圖如圖2所示[7]。
圖2 第一次訪問貸款系統(tǒng)的時序圖
3.1.2 第二次訪問貸款系統(tǒng)
用戶第二次訪問貸款系統(tǒng)時,因為已成功登錄過, 所以瀏覽器會自動攜帶貸款系統(tǒng)會話去訪問,貸款系統(tǒng)驗證會話通過后,向用戶顯示訪問的資源。時序圖如圖 3 所示[7]。
圖3 第二次訪問貸款系統(tǒng)的時序圖
3.1.3 第一次訪問卡系統(tǒng)
用戶第一次訪問卡系統(tǒng),因為沒有登錄過,所以瀏覽器自動攜帶TGT 去CAS 做認(rèn)證,認(rèn)證通過后,CAS 服務(wù)器把 ST 返回給用戶。 瀏覽器會攜帶 ST 去訪問卡系統(tǒng)。 卡系統(tǒng)轉(zhuǎn)到 CAS 服務(wù)器去驗證 ST,驗證通過后,卡系統(tǒng)為用戶創(chuàng)建卡系統(tǒng)會話。 瀏覽器保存卡系統(tǒng)會話,后續(xù)訪問都會攜帶這個會話,卡系統(tǒng)驗證會話通過后,向用戶顯示訪問的資源,整個流程不會要求用戶再次登錄。 時序圖如圖4 所示[7]。
OAuth 框架里的安全機制是令牌。 應(yīng)用可以通過一個令牌在特定的時間段內(nèi)訪問特定的資源[8]。
假設(shè)有個銀行外部的第三方交易系統(tǒng),它需要用戶在銀行的授權(quán)系統(tǒng)里登錄并對它授權(quán)后才能使用。
3.2.1 交易系統(tǒng)令牌訪問
第三方交易系統(tǒng)首先向用戶請求授權(quán),用戶登錄銀行的授權(quán)系統(tǒng)并進行授權(quán)后會發(fā)放授權(quán)許可,交易系統(tǒng)向CAS 服務(wù)器出示授權(quán)許可,并請求訪問令牌。CAS 服務(wù)器校驗授權(quán)許可通過后,發(fā)放訪問令牌,交易系統(tǒng)憑令牌訪問資源。 時序圖如圖5 所示[9]。
3.2.2 交易系統(tǒng)刷新令牌
令牌是有時效性的,當(dāng)其失效后,第三方交易系統(tǒng)需憑刷新令牌再次請求一個新的訪問令牌。 時序圖如圖 6 所示[9]。
圖4 第一次訪問卡系統(tǒng)的時序圖
圖5 第三方交易系統(tǒng)令牌訪問的時序圖
4.1.1 運行環(huán)境
為了完成單點登錄的驗證,規(guī)劃了3 臺服務(wù)器,如圖 7 所示。 服務(wù)器全部預(yù)裝 CentOS 7[10],每臺安裝的軟件如表 1 所示[11-15]。
圖6 第三方交易系統(tǒng)刷新令牌的時序圖
圖7 單點登錄驗證服務(wù)器設(shè)計
表1 單點登錄驗證軟件清單
4.1.2 驗證
(1)瀏覽器訪問 https://www.app1.com,因沒有登錄過,所以會跳轉(zhuǎn)到圖8 所示的登錄頁面,并且地址變?yōu)?https://www.sso.com/cas/login?service=https-%3A%2F%2Fwww.app1.com%2F,從地址可知,這是由CAS 提供的登錄頁面。
(2)輸入用戶名和密碼登錄后,分析CAS 的日志可以看出它首先對用戶名和密碼進行了認(rèn)證。
WHO:liqiang
WHAT:Supplied credentials:
[UsernamePasswordCredential(username=liqiang)]
ACTION:AUTHENTICATION_SUCCESS
圖8 單點登錄的登錄頁面
APPLICATION:CAS
(3)認(rèn)證通過后,CAS 服務(wù)器自動創(chuàng)建了 Ticket Granting Ticket(TGT)。
WHO:liqiang
WHAT:
TGT-2-************************bo-47opiGacsso
ACTION:TICKET_GRANTING_TICKET_CREATED
APPLICATION:CAS
(4)緊接著 CAS 服務(wù)器又為 APP1 創(chuàng)建了 Service Ticket(ST)。
WHO:liqiang
WHAT:ST-3-BP9pvxb0-i-rwvrxQFQ8mn5py-wsso for
https://www.app1.com/
ACTION:SERVICE_TICKET_CREATED
APPLICATION:CAS
(5)CAS 服務(wù)器把 TGT 和 ST 返回給 APP1 服務(wù)器,APP1 服務(wù)器再次攜帶ST 到 CAS 服務(wù)器進行校驗。
WHO:liqiang
WHAT:ST-3-BP9pvxb0-i-rwvrxQFQ8mn5py-wsso
for https://www.app1.com/
ACTION:SERVICE_TICKET_VALIDATED
APPLICATION:CAS
(6)ST 校 驗 通 過 ,APP1 服務(wù)器顯示APP1 的歡迎頁面,如圖 9 所示。
圖9 單點登錄成功轉(zhuǎn)到APP1
(7)瀏覽器訪問 https://www.app2.com,因已登錄過APP1,TGT 已經(jīng)保存在瀏覽器緩存了,所以去CAS 認(rèn)證時會攜帶 TGT,又因為該 TGT 是有效的,所以 CAS 會自動為 APP2 創(chuàng)建 ST。
WHO:liqiang
WHAT:ST-4--1a-tB2GwHoxrcZwLGlKQ-46ET0sso
for https://www.app2.com/
ACTION:SERVICE_TICKET_CREATED
APPLICATION:CAS
(8)CAS 服務(wù)器把 ST 返回給 APP2 服務(wù)器后,APP2 服務(wù)器再次攜帶 ST 到 CAS 服務(wù)器進行校驗。
WHO:liqiang
WHAT:ST-4--1a-tB2GwHoxrcZwLGlKQ-46ET0sso
for https://www.app2.com/
ACTION:SERVICE_TICKET_VALIDATED
APPLICATION:CAS
(9)ST 校 驗 通 過 ,APP2 服務(wù)器顯示APP2 的歡迎頁面,如 圖 10 所 示 。 訪 問 APP2 的整個過程并沒有再要求用戶登錄。
圖10 直接進入APP2
4.2.1 運行環(huán)境
為了完成第三方授權(quán)的驗證, 規(guī)劃了 2 臺服務(wù)器,如 圖 11 所 示。 服務(wù)器全部預(yù)裝 CentOS 7[10],每臺安裝的軟件如表2 所示[11-15]。
圖11 第三方授權(quán)驗證服務(wù)器設(shè)計
表2 第三方授權(quán)驗證軟件清單
4.2.2 驗證
(1)瀏覽器訪問 https://www.app3.com,會顯示圖 12 所示頁面。
圖12 提示使用第三方賬號登錄
(2)點擊下方的“使用第三方賬號登錄”鏈接,會跳轉(zhuǎn)到如圖13 所示的登錄頁面,并且地址欄變?yōu)閔ttps://www.sso.com/cas/login?service=https%3A%2F%2Fwww.sso.com%2Fcas%2Foauth2.0%2Fcallback-Authorize%3Fclient_id%3Dots%26redirect_uri%3Dhttps-%253A%252F%252Fwww.app3.com%252Fauth%26response_type%3Dcode%26client_name%3DCasOAuthClient,從地址可知,這是由CAS 提供的登錄頁面,客戶 ID是ots,代表了驗證用的交易系統(tǒng)。
圖13 轉(zhuǎn)到第三方應(yīng)用去登錄
(3)輸入用戶名和密碼,登錄成功后會顯示授權(quán)頁面,如圖 14 所示。
(4)點擊 Allow 按鈕,同意授權(quán)給第三方交易系統(tǒng)后, 分析日志可以看出 CAS 服務(wù)器給 APP3 服務(wù)器返回了一個授權(quán)碼。
OC-1-NrqJTop-h7IYyOtxCmYGUS0mKFVGaII3
(5)APP3 服務(wù)器收到授權(quán)碼后,攜帶授權(quán)碼向CAS 服務(wù)器發(fā)出以下請求去獲取訪問令牌:
https://www.sso.com/cas/oauth2.0/accessToken?grant_type=authorization_code&client_id=ots&client_secret=12345-6&code=OC-1-NrqJTop-h7IYyOtxCmYGUS0mKFVGaII3-&redirect_uri=https://www.app3.com/auth
(6)CAS 服務(wù)器校驗授權(quán)碼通過,生成訪問令牌,并把令牌返回給APP3 服務(wù)器。
access_token =AT -1 -AjYYAXSxR2M8EQuDqvHL3V -QwKN871hSN&expires_in=28800
(7)APP3 服務(wù)器得到訪問令牌后,攜帶令牌去CAS 服務(wù)器獲取用戶信息。
https://www.sso.com/cas/oauth2.0/profile?access_token=AT-1-AjYYAXSxR2M8EQuDqvHL3VQwKN871hSN
(8)CAS 服務(wù)器校驗令牌通過, 向 APP3 服務(wù)器返回用戶信息。
{"service":"https://www.app3.com/auth","attributes":{"credentialType":"UsernamePasswordCredential"},"id":"liqiang","client_id":"ots"}
(9)APP3 服務(wù)器轉(zhuǎn)到登錄成功頁面,并顯示獲取到的用戶名,如圖15 所示。
圖15 獲取授權(quán)成功轉(zhuǎn)到第三方交易系統(tǒng)
本文對 CAS 協(xié)議和OAuth 框架進行了簡單介紹, 并基于此給出了統(tǒng)一認(rèn)證授權(quán)系統(tǒng)的設(shè)計,隨后結(jié)合實戰(zhàn)對每一步進行了驗證與分析。 以此為技術(shù)基礎(chǔ)可以逐步整合銀行內(nèi)部現(xiàn)有應(yīng)用系統(tǒng)的用戶登錄認(rèn)證,規(guī)范新應(yīng)用系統(tǒng)的開發(fā),為銀行帶來跨系統(tǒng)單點登錄、第三方授權(quán)等基礎(chǔ)能力,為進一步構(gòu)建開放平臺和業(yè)務(wù)生態(tài)提供了必要的條件。 此外, 若能通過域賬號與統(tǒng)一認(rèn)證授權(quán)系統(tǒng)進行集成,將更加有助于簡化用戶的管理,進一步提高系統(tǒng)集成度和用戶的使用體驗。