趙志學(xué),朱方洲
(1.安徽省委黨校,安徽 合肥 230022;2.安徽經(jīng)濟(jì)管理學(xué)院,安徽 合肥 230022)
網(wǎng)絡(luò)信息安全最重要的是保證用戶合法地對(duì)資源進(jìn)行訪問,防止非法用戶訪問不屬于自己的訪問權(quán)限,以此來保護(hù)信息不受篡改[1]。目前,網(wǎng)絡(luò)攻擊越來越多,利用安全漏洞竊取系統(tǒng)數(shù)據(jù)、非法入侵系統(tǒng)等安全問題嚴(yán)重影響了各個(gè)系統(tǒng)的穩(wěn)定運(yùn)行,致使業(yè)務(wù)無法正常運(yùn)營(yíng),給政府、企業(yè)和個(gè)人帶來很大的損失[2]。為了解決上述問題,訪問控制機(jī)制和對(duì)應(yīng)的權(quán)限管理應(yīng)運(yùn)而生。訪問控制是從20世紀(jì)60年代后期開始研究,其任務(wù)主要是根據(jù)系統(tǒng)內(nèi)部提供的安全策略和訪問者的身份信息,對(duì)請(qǐng)求訪問的權(quán)限設(shè)置限制和規(guī)則,旨在防止未經(jīng)授權(quán)的用戶訪問系統(tǒng)資源[3]。應(yīng)用比較廣泛的主要有自主訪問控制(DAC)、強(qiáng)制訪問控制(MAC)、基于角色訪問控制模型(RBAC)、基于任務(wù)訪問控制模型(TBAC)和基于屬性訪問控制模型(ABAC)等[4],其中RBAC近年來研究最為廣泛,并以其靈活性與安全性普遍應(yīng)用于許多系統(tǒng)中。隨著互聯(lián)網(wǎng)+政務(wù)服務(wù)、企業(yè)綜合應(yīng)用系統(tǒng)等移動(dòng)應(yīng)用的不斷增加,上述授權(quán)方式顯得繁雜、不靈活、粗糙,在應(yīng)用上不利于應(yīng)用系統(tǒng)的擴(kuò)展和缺乏良好的通用性,為此文章提出了基于Shiro框架的移動(dòng)互聯(lián)網(wǎng)場(chǎng)景下服務(wù)器認(rèn)證授權(quán)方法。
傳統(tǒng)的PC應(yīng)用使用場(chǎng)景客戶端往往是Web瀏覽器,通過瀏覽器發(fā)出訪問服務(wù)器請(qǐng)求,這種方式需要在服務(wù)端保存客戶端的session(會(huì)話),建立session的本質(zhì)就是瀏覽器訪問服務(wù)器時(shí),從服務(wù)器取回一個(gè)cookie,該cookie標(biāo)識(shí)了會(huì)話,而瀏覽器下次訪問服務(wù)器時(shí)再次攜帶該cookie提交給服務(wù)器,服務(wù)器根據(jù)提交的cookie區(qū)別不同的客戶端瀏覽器,達(dá)到保持不同客戶端session的目的,從而維持客戶端與服務(wù)器的無狀態(tài)通信。
在移動(dòng)互聯(lián)網(wǎng)應(yīng)用場(chǎng)景中,用戶登錄App后,可能過很久才有下次操作,又不便要求用戶反復(fù)登錄賬號(hào)和密碼,無session過期要求。移動(dòng)應(yīng)用場(chǎng)景要求用戶操作便捷,又不降低對(duì)安全性的要求,始終要求用戶提交賬號(hào)和密碼本身就會(huì)帶來丟失信息的風(fēng)險(xiǎn),這就需要使用token的方式來進(jìn)行標(biāo)識(shí)用戶合法身份,客觀上減少賬號(hào)和密碼提交服務(wù)器的次數(shù)。在移動(dòng)應(yīng)用場(chǎng)景中大多數(shù)都是使用原生App操作方式,而在原生App開發(fā)方式中每次使用cookie十分麻煩,技術(shù)上采用了放棄使用cookie的方法。
現(xiàn)行服務(wù)器場(chǎng)景中一般會(huì)選擇較為成熟的權(quán)限管理框架,如Spring Security框架、Apache的Shiro框架。
Spring Security功能強(qiáng)大[5-6],但配置繁瑣。Shiro框架相對(duì)于Spring Security框架,具有高度的靈活性、開發(fā)的易用性、代碼的開放性等優(yōu)勢(shì),因此在權(quán)限管理和安全認(rèn)證業(yè)務(wù)場(chǎng)景中得到了廣泛使用。Shiro框架不僅可以應(yīng)用于Java SE場(chǎng)景中的開發(fā),也可以應(yīng)用于Java EE場(chǎng)景中的開發(fā)。同時(shí)Shiro框架與Spring框架也能進(jìn)行很好的整合,這就給開發(fā)者在使用過程中帶來極大的便利。
互聯(lián)網(wǎng)+政務(wù)服務(wù)系統(tǒng)、企業(yè)級(jí)應(yīng)用系統(tǒng)對(duì)于權(quán)限管理包括兩個(gè)方面:一是認(rèn)證,通過認(rèn)證確認(rèn)用戶賬號(hào)的合法性,用戶提交各類合法的身份信息,服務(wù)端對(duì)身份信息進(jìn)行驗(yàn)證,驗(yàn)證通過允許用戶登錄,驗(yàn)證不通過拒絕用戶登錄。二是授權(quán),通過授權(quán)根據(jù)事先劃分好的權(quán)限資源,用戶身份角色,將對(duì)應(yīng)的權(quán)限分配給合法登錄的用戶,這樣通過驗(yàn)證的用戶就具備訪問某某資源的權(quán)限。
Shiro框架廣泛支持認(rèn)證和授權(quán)等功能模塊,且提供足夠的API供開發(fā)者定制,這就為政務(wù)系統(tǒng)、企業(yè)級(jí)系統(tǒng)的靈活定制提供可能。Shiro框架主要包括核心功能模塊、支持功能模板,核心功能模塊包含認(rèn)證、授權(quán)、會(huì)話管理、加密四個(gè)部分;支持功能模板包含“Web集成、緩存、并發(fā)、測(cè)試、作為、記住我”六個(gè)部分[7]。具體功能模板如圖1所示。
圖1 Shiro框架的基本結(jié)構(gòu)
Shiro框架是通過一個(gè)名稱為Subject的主體對(duì)象代表用戶的,該Subject就是一次發(fā)出請(qǐng)求認(rèn)證的對(duì)象,每一次要求認(rèn)證都是通過Subject對(duì)象的Login方法發(fā)給SecurityManager。SecurityManager負(fù)責(zé)所有與安全操作的交互操作,并且實(shí)現(xiàn)對(duì)Subject的管理,它構(gòu)成了Subject請(qǐng)求認(rèn)證和Realm安全數(shù)據(jù)來源之間嫁接的橋梁。Realm是用戶安全數(shù)據(jù)的來源,但并不維護(hù)用戶和權(quán)限的具體信息表,這也是Shiro框架的強(qiáng)大之處,這就使開發(fā)者自己擴(kuò)展用戶權(quán)限信息表成為可能。圖2為Shiro框架的認(rèn)證授權(quán)時(shí)序圖。
圖2 Shiro框架的認(rèn)證授權(quán)時(shí)序
認(rèn)證授權(quán)過程首先是用戶提交賬號(hào)和密碼,使用Shiro框架提供的Subject發(fā)起Login請(qǐng)求;Login請(qǐng)求發(fā)送給SecurityManager對(duì)象,SecurityManager根據(jù)提前配置的Authenticator對(duì)賬號(hào)信息執(zhí)行驗(yàn)證;Authenticator對(duì)象可以調(diào)用自定義的Realm對(duì)象執(zhí)行具體的驗(yàn)證,并且可以通過Realm訪問用戶安全信息來源;回調(diào)Realm對(duì)象的doGetAuthenticationInfo()方法,執(zhí)行具體的安全信息認(rèn)證;可以在doGetAuthenticationInfo()方法中獲取證書匹配器,也就是可以在此實(shí)現(xiàn)加密驗(yàn)證;加載一個(gè)具體的加密匹配器;當(dāng)認(rèn)證通過后,Realm可以加載安全信息數(shù)據(jù)來實(shí)現(xiàn)具體的授權(quán)工作,該授權(quán)工作在doGetAuthorizationInfo()方法中實(shí)現(xiàn);最后返回認(rèn)證成功或失敗的結(jié)果。如果認(rèn)證成功,將帶有成功的消息和帶有授權(quán)的用戶返回。
當(dāng)用戶成功登錄企業(yè)系統(tǒng)后,該用戶將擁有相應(yīng)的角色和權(quán)限。在用戶訪問具體權(quán)限資源時(shí),Shiro框架將對(duì)該用戶的身份權(quán)限做進(jìn)一步驗(yàn)證。Shiro框架提供了Authorizer組件來實(shí)現(xiàn)用戶的鑒權(quán)工作。圖3為Shiro框架的鑒權(quán)時(shí)序圖。
圖3 Shiro框架的鑒權(quán)時(shí)序
鑒權(quán)過程首先用戶訪問某具體的權(quán)限資源,發(fā)起isPermitted()方法的請(qǐng)求,該請(qǐng)求將引起SecurityManager對(duì)象方法isPermitted()的調(diào)用,Shiro框架會(huì)根據(jù)具體的配置信息調(diào)用對(duì)應(yīng)的Authorizer,并在Authorizer中調(diào)用ResolvePermissionRole方法,使用PermissionResolver對(duì)象返回該用戶的權(quán)限集合。繼續(xù)請(qǐng)求是否具備某權(quán)限,根據(jù)返回結(jié)果true或者false,表示是否具備某權(quán)限。最后返回鑒權(quán)結(jié)果。
通過構(gòu)建基于Shiro框架的移動(dòng)互聯(lián)網(wǎng)場(chǎng)景下服務(wù)器認(rèn)證授權(quán)方法,移動(dòng)互聯(lián)場(chǎng)景中服務(wù)器無需保存客戶端cookie的信息,只維持客戶端與服務(wù)器之間的會(huì)話狀態(tài),有效實(shí)現(xiàn)用戶身份認(rèn)證、授權(quán)、加密、會(huì)話管理等功能,構(gòu)建了一個(gè)通用、便捷的安全認(rèn)證框架,使用Shiro就可以高效、安全地完成認(rèn)證、授權(quán)等功能,降低系統(tǒng)成本。
圖4 基于Shiro框架的移動(dòng)互聯(lián)網(wǎng)場(chǎng)景下服務(wù)器認(rèn)證授權(quán)方法
密鑰相關(guān)的哈希運(yùn)算消息認(rèn)證碼(hash-based message authentication code,HMAC)是基于散列的消息認(rèn)證碼[8-9],該方法身份認(rèn)證方式簡(jiǎn)單、安全,且克服了安全證書授權(quán)Radius、Kerberos等協(xié)議的部署復(fù)雜性、開銷過大等問題。在用戶通過安全認(rèn)證后,服務(wù)端將驗(yàn)證密鑰發(fā)給用戶,當(dāng)前該密鑰將由客戶端和服務(wù)端共同持有。每當(dāng)用戶發(fā)送請(qǐng)求給服務(wù)器時(shí),無需再次發(fā)送賬號(hào)和密碼,而是發(fā)送消息和消息摘要到服務(wù)器即可。客戶端消息摘要是由共同持有的密鑰生成,該消息摘要保證了請(qǐng)求信息的唯一性。服務(wù)器端使用共同的密鑰對(duì)消息進(jìn)行驗(yàn)證,驗(yàn)證用戶身份的合法性?;贖MAC算法的關(guān)鍵代碼如下:
public static byte HmacSHAEncrypt(String encryptText,String encryptKey)throws Exception
{ byte data=encryptKey.getBytes(ENCODING);
SecretKey secretKey = new SecretKeySpec(data,MAC_NAME);
Mac mac = Mac.getInstance(MAC_NAME);
mac.init(secretKey);
byte text = encryptText.getBytes(ENCODING);
return mac.doFinal(text);
}
}
在Shiro框架中token的作用主要是用于傳遞用戶身份信息,在subject的login方法中需要傳遞token;在認(rèn)證過程中需要調(diào)用token,判斷賬號(hào)和密碼的合法性;在授權(quán)過程中需要調(diào)用token,獲取用戶的身份信息,據(jù)此判斷該用戶該擁有什么權(quán)限。由于用戶的請(qǐng)求信息包含了賬號(hào)和請(qǐng)求信息以及請(qǐng)求信息的摘要。所以該token可以設(shè)計(jì)為如下方式:
public class MyToken implements AuthenticationToken {
private String username;
private Map
private String msgDigest;
getPrincipal()…//具體省略
getCredentials ()…//具體省略
}
當(dāng)在Shiro框架中用戶的信息改造成無狀態(tài)的token時(shí),也需要對(duì)AuthorizingRealm進(jìn)行繼承改造,這里實(shí)現(xiàn)自定義Realm。在doGetAuthenticationInfo()方法中使用HMAC加密方案對(duì)用戶發(fā)送至服務(wù)器的請(qǐng)求信息進(jìn)行驗(yàn)證,主要驗(yàn)證消息摘要。如果消息摘要驗(yàn)證通過表示該用戶使用的密鑰為合法密鑰,如果驗(yàn)證不通過則表示該密鑰失效或者過期,從而保證用戶身份的合法性和唯一性。優(yōu)化AuthorizingRealm關(guān)鍵代碼如下:
public AuthorizingRealm(CacheManager cacheManager,CredentialsMatcher credentialsMatcher) {
super();
if (cacheManager != null) {
setCacheManager(cacheManager);
}
if (credentialsMatcher != null) {
setCredentialsMatcher(credentialsMatcher);
}
this.authorizationCachingEnabled = true;
this.permissionResolver = new WildcardPermissionResolver();
int instanceNumber = INSTACE_COUNT.getAndIncrement();
this.authorizationCacheName = getClass().getName() + DEFAULT_AUTHOR_CACHE_SUFFIX;
if (instanceNumber > 0) {
this.authorizationCacheName = this.authorizationCacheName + "." + instanceNumber;
}
}
Shiro框架提供了JavaEE中的Filter組件,在Web服務(wù)器啟動(dòng)時(shí)就能加載Filter,該Filter就是Shiro框架的DelegatingFilterProxy,它相當(dāng)于一個(gè)集中的調(diào)度器,所有的請(qǐng)求都將由該Filter來集中調(diào)度。Shiro框架也支持開發(fā)者自定義Filter來實(shí)現(xiàn)對(duì)請(qǐng)求的攔截。通常自定義Filter需要繼承Shiro框架的AccessControlFilter類,并在Spring配置中加入如下代碼:
其中***Filter表示自定義的Filter,通過該配置就加入到過濾器的隊(duì)列中,當(dāng)請(qǐng)求到來時(shí)將會(huì)自動(dòng)執(zhí)行該Filter完成對(duì)請(qǐng)求的身份驗(yàn)證。另外注意關(guān)閉Shiro框架默認(rèn)的Session。
以某單位建設(shè)智慧政務(wù)系統(tǒng)為例,驗(yàn)證和測(cè)試基于Shiro框架的移動(dòng)互聯(lián)網(wǎng)場(chǎng)景下服務(wù)器認(rèn)證授權(quán)方法。該政務(wù)系統(tǒng)將基于Shiro框架的移動(dòng)互聯(lián)網(wǎng)場(chǎng)景下服務(wù)器認(rèn)證授權(quán)方法部署到Tomcat上,然后建立相應(yīng)的Android或iOS項(xiàng)目,先從服務(wù)器端使用賬號(hào)和密碼獲取相應(yīng)的HMAC方案中針對(duì)用戶的key,然后再?gòu)目蛻舳酥邪l(fā)送請(qǐng)求信息和消息摘要。測(cè)試合法用戶的認(rèn)證結(jié)果以及非法用戶的認(rèn)證結(jié)果,通過功能對(duì)比測(cè)試,本文方法比目前常用RBAC在資源實(shí)例權(quán)限、新增屏蔽權(quán)限、分層級(jí)ID設(shè)定及微架構(gòu)分庫(kù)設(shè)計(jì)方面有明顯的優(yōu)越性,提高了靈活性、簡(jiǎn)便性、可擴(kuò)展性及安全性(表1)。
表1 RABC與基于Shiro框架的移動(dòng)互聯(lián)網(wǎng)場(chǎng)景下服務(wù)器認(rèn)證授權(quán)方法功能對(duì)比
使用基于Shiro框架的移動(dòng)互聯(lián)網(wǎng)場(chǎng)景下服務(wù)器認(rèn)證授權(quán)方法大大降低了權(quán)限管理的開發(fā)難度,其本身也具備較高的靈活性和開放性,這就為適應(yīng)移動(dòng)互聯(lián)網(wǎng)服務(wù)器端場(chǎng)景變化進(jìn)行框架改造帶來可能性。文章主要分析了移動(dòng)互聯(lián)網(wǎng)場(chǎng)景中服務(wù)端的設(shè)計(jì)的新要求,客戶端場(chǎng)景的變化促使服務(wù)器端也要隨之變化,這就要求連接服務(wù)端時(shí)放棄使用cookie。該方法可以有效解決移動(dòng)互聯(lián)網(wǎng)這一領(lǐng)域企業(yè)級(jí)應(yīng)用系統(tǒng)的權(quán)限管理需求,大大降低服務(wù)器端持有session資源開銷,也充分保障了通信的安全性、簡(jiǎn)潔性。