專利名稱:一種Java應(yīng)用安全訪問控制方法及其裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通信技術(shù)領(lǐng)域,尤其涉及一種Java應(yīng)用安全訪問控制方法及其裝置。
背景技術(shù):
Java語言具有與平臺(tái)無關(guān)性的特點(diǎn),使得Java技術(shù)目前得到廣泛應(yīng)用。自從Java技術(shù)出現(xiàn)以來,有關(guān)Java平臺(tái)的安全性及由Java技術(shù)發(fā)展所引發(fā)的新的安全性問題,引起了越來越多的關(guān)注。Java應(yīng)用服務(wù)器能為Java應(yīng)用程序提供運(yùn)行環(huán)境,并使用安全機(jī)制來保障應(yīng)用服務(wù)器的安全性。Java應(yīng)用服務(wù)器的安全機(jī)制主要目的在于阻止某些未授權(quán)的用戶調(diào)用 某些危險(xiǎn)的組件(如類、jar包),并允許授權(quán)的用戶調(diào)用這些組件。具體來說,Java應(yīng)用服務(wù)器的安全機(jī)制根據(jù)需求實(shí)現(xiàn)了不同的功能,比如-阻止未授權(quán)用戶程序創(chuàng)建子進(jìn)程或者子線程;-阻止未授權(quán)用戶程序通過創(chuàng)建socket(套接字)和其他進(jìn)程進(jìn)行通信;-阻止未授權(quán)用戶對文件系統(tǒng)執(zhí)行寫操作,并且只能對文件系統(tǒng)中有限的資源執(zhí)行讀操作。傳統(tǒng)的Java安全機(jī)制包括SecurityManager (安全管理器)和JAAS (JavaAuthentication and Authorization Service, Java 驗(yàn)證和授權(quán) API),分別從兩個(gè)不同的角度實(shí)現(xiàn)Java的安全機(jī)制。其中,SecurityManager通過判斷代碼來源,控制哪些來源的代碼可以訪問哪些敏感資源,從而保護(hù)代碼執(zhí)行者的安全性JAAS通過判斷代碼執(zhí)行者的身份,從而判斷哪些身份的用戶可以訪問哪些敏感資源。傳統(tǒng)的Java安全機(jī)制分兩個(gè)層面實(shí)現(xiàn),在部署層面通過類加載器(classloader)對某些類的加載來保證安全性;在運(yùn)行階段通過Java的訪問控制機(jī)制來實(shí)現(xiàn)。Java的訪問控制機(jī)制基于的數(shù)學(xué)模型是一個(gè)三元組〈subject, object, action〉,其中,subject代表角色,object代表資源,action代表擁有的權(quán)限集,如〈user, /home/text. txt,read>表示某一個(gè)用戶user對/home目錄下的text, txt文件具有read的權(quán)限。三元組在計(jì)算機(jī)中可以用二維訪問數(shù)組來表示,典型的二維訪問數(shù)組如下表I所示表I、二維訪問數(shù)組
Objectl0bject2
Subjectl Read, Write ReadSubject2 WriteRead
Subject3 ReadRead,Write下面分別介紹SecurityManager 和 JAAS。SecurityManager通過*· policy策略文件(默認(rèn)的策略文件保存在% jre_home% \lib\security目錄中)來生成存儲(chǔ)二維訪問數(shù)組的數(shù)據(jù)結(jié)構(gòu)。典型的policy文件采用如下格式編寫grant[codebase]{permission FilePermission d:\java_resource\*read, write ;};其中,Grant和permission為policy文件的關(guān)鍵字;codebase相當(dāng)于三元組中的subject ;FilePermission表不權(quán)限所屬的類型;d: \java_resource\*相當(dāng)于三兀組中的object,支持通配符表示目錄下的所有文件;read, write相當(dāng)于三元組中的action,表示代碼對d:\java_resource目錄下所有的文件具有read(讀)和write (寫)的權(quán)限。SecurityManager通過此配置文件生成一個(gè)數(shù)據(jù)結(jié)構(gòu),Java通過此數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)policy文件配置的規(guī)則,然后根據(jù)棧檢測來判斷某一個(gè)操作是否有權(quán)限。比如假設(shè)類A,B,C的權(quán)限集分別為A_set, B_set, C_set,并存在此調(diào)用關(guān)系類A調(diào)用類B的do_something O方法,類B的此方法又調(diào)用類C的readFile ( “text, txt”)方法,類C的此方法讀寫本地磁盤文件text, txt。JVM(Java Virtual Machine, Java虛擬機(jī))中的調(diào)用棧如圖I所示,JVM判斷類C的方法readFile O是否有權(quán)限讀寫text, txt文件,是通過將調(diào)用棧中的A,B, C三個(gè)類的權(quán)限集取交集,并判斷么_8的H B_set H C_set的結(jié)果是否有讀寫text, txt的權(quán)限。如果有權(quán)限,則應(yīng)用程序繼續(xù)正常執(zhí)行,否則拋出安全異常SecurityExceptionοJAAS (Java Authentication Authorization Service)也是 Java安全機(jī)制中的一種,它強(qiáng)調(diào)的是通過驗(yàn)證誰在運(yùn)行代碼以及它的權(quán)限來保證系統(tǒng)免受用戶的攻擊。傳統(tǒng)的Java安全訪問控制機(jī)制正是通過SecurityManager類實(shí)現(xiàn)了基于源代碼的訪問控制,通過JAAS SecurityManager類實(shí)現(xiàn)了基于主題(subject)的訪問控制,兩者共同提高了 Java的安全性。傳統(tǒng)的Java安全機(jī)制SecurityManager在進(jìn)行操作之前,通過棧檢測對操作相關(guān)類的權(quán)限集取交集,然后判斷某項(xiàng)操作是否有必要的權(quán)限執(zhí)行。然而這種機(jī)制存在缺陷,尤其是在用戶使用PaaS云平臺(tái)提供的服務(wù)時(shí)。這種情況發(fā)生在當(dāng)一個(gè)Subject_a調(diào)用另一個(gè)subject_b的操作以完成自身的功能時(shí),被調(diào)用的subject_b肯定具有必要的權(quán)限來執(zhí)行所需的任務(wù),但是一般來說subject_a沒有必要的權(quán)限,因此如果使用SecurityManager進(jìn)行訪問控制,用戶的訪問服務(wù)的請求就可能會(huì)因?yàn)闆]有權(quán)限被拒絕,最終將導(dǎo)致PaaS云平臺(tái)提供給用戶的服務(wù)無法正常調(diào)用。JAAS在一定程度上解決的了傳統(tǒng)的SecurityManager機(jī)制存在的問題。在前面提到的場景中,JAAS通過將subjeCt_b的操作提升為特權(quán)操作,當(dāng)享有特權(quán)時(shí),該操作就不需要調(diào)用它的subject_a具有一樣的特權(quán),因此subject_b的操作就可以對資源進(jìn)行全面的訪問。然而,JAAS存在的問題是不夠靈活,要使某個(gè)類的某個(gè)操作享有特權(quán),就必須編寫特定的代碼,調(diào)用JAAS提供的接口,因此會(huì)造成代碼的緊耦合,導(dǎo)致后續(xù)的維護(hù)比較麻煩。比如,開放PaaS平臺(tái)的需求經(jīng)常會(huì)發(fā)生變化,采用這種硬編碼的方式可能會(huì)導(dǎo)致在需求變化的時(shí)候不得不修改代碼,重新編譯、部署,代價(jià)比較大。另外,PaaS云平臺(tái)提供的一些供用戶程序調(diào)用的服務(wù)使用的是第三方軟件,其中一些第三方軟件只是做到了功能 上的實(shí)現(xiàn),沒有考慮安全機(jī)制的問題,并且不提供源代碼,這就導(dǎo)致試圖通過修改源代碼使其在被調(diào)用時(shí)提升為享有特權(quán)的操作變得異常的困難。由此可見,傳統(tǒng)的Java安全機(jī)制中的SecurityManager,有可能導(dǎo)致用戶的訪問服務(wù)的請求就因?yàn)闆]有權(quán)限被拒絕,而JAAS在部署上又不靈活,尤其對于PaaS云平臺(tái)來說,在技術(shù)實(shí)現(xiàn)上有較大障礙。因此亟需一種能夠?qū)崿F(xiàn)靈活部署而又能在安全控制范圍內(nèi)滿足用戶訪問需求的Java安全機(jī)制。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例提供一種Java 應(yīng)用安全訪問控制方法及其裝置,用以提高Java安全機(jī)制部署的靈活性,并能保證在安全控制范圍內(nèi)滿足用戶訪問需求。本發(fā)明實(shí)施例提供的Java應(yīng)用安全訪問控制方法,包括JVM根據(jù)Java歸檔文件中的權(quán)限描述信息,生成擴(kuò)展安全訪問策略文件,所述擴(kuò)展安全策略文件中的組件的資源訪問權(quán)限信息中設(shè)置有授權(quán)約束條件,所述授權(quán)約束條件表示當(dāng)對應(yīng)組件調(diào)用其它組件時(shí)需要被賦予被調(diào)用組件的資源訪問權(quán)限;當(dāng)JVM接收到第一組件調(diào)用第二組件的請求且相應(yīng)組件已經(jīng)加載時(shí),JVM根據(jù)所述擴(kuò)展安全訪問策略文件,若判斷本次調(diào)用滿足相應(yīng)授權(quán)約束條件,則根據(jù)相應(yīng)授權(quán)約束條件將第二組件的資源訪問權(quán)限賦予第一組件,并對本次調(diào)用進(jìn)行安全訪問控制。本發(fā)明實(shí)施例提供的用于實(shí)現(xiàn)Java應(yīng)用安全訪問控制的JVM,包括類加載器,用于加載用戶類;安全管理器,用于根據(jù)Java歸檔文件中的權(quán)限描述信息,生成擴(kuò)展安全訪問策略文件,所述擴(kuò)展安全策略文件中的組件的資源訪問權(quán)限信息中設(shè)置有授權(quán)約束條件,所述授權(quán)約束條件表示當(dāng)對應(yīng)組件調(diào)用其它組件時(shí)需要被賦予被調(diào)用組件的資源訪問權(quán)限;以及,當(dāng)接收到第一組件調(diào)用第二組件的請求且相應(yīng)組件已經(jīng)加載時(shí),根據(jù)所述擴(kuò)展安全訪問策略文件,若判斷本次調(diào)用滿足相應(yīng)授權(quán)約束條件,則根據(jù)相應(yīng)授權(quán)約束條件將第二組件的資源訪問權(quán)限賦予第一組件,并對本次調(diào)用進(jìn)行安全訪問控制。本發(fā)明的上述實(shí)施例,通過擴(kuò)展現(xiàn)有的安全訪問策略文件,使其組件資源訪問權(quán)限信息中設(shè)置有授權(quán)約束條件,這樣,當(dāng)JVM接收到一組件調(diào)用另一組件的請求時(shí),JVM可根據(jù)該擴(kuò)展安全訪問策略文件,在判斷該調(diào)用滿足授權(quán)約束條件時(shí),將被調(diào)用組件的資源訪問權(quán)限賦予調(diào)用組件,并通過棧檢測對該調(diào)用進(jìn)行安全訪問控制,從而提高了 Java安全機(jī)制部署的靈活性,即,可根據(jù)需要通過設(shè)置相應(yīng)的授權(quán)約束條件來達(dá)到為調(diào)用組件賦予特殊資源訪問權(quán)限的目的;另一方面,JVM對調(diào)用組件進(jìn)行安全訪問控制,保證了在安全控制范圍內(nèi)滿足用戶訪問需求。
圖I為現(xiàn)有技術(shù)中的JVM中的調(diào)用棧示意圖;圖2為本發(fā)明實(shí)施例提供的Java安全控制機(jī)制部署階段的流程示意圖;圖3為本發(fā)明實(shí)施例提供的Java安全控制機(jī)制運(yùn)行階段的流程示意圖;圖4為本發(fā)明實(shí)施例提供的JVM的結(jié)構(gòu)示意圖;圖5為本發(fā)明實(shí)施例中的服務(wù)平臺(tái)以及JVM之間的關(guān)系不意圖;圖6A為本發(fā)明實(shí)施例中的應(yīng)用程序調(diào)用示意圖6B為本發(fā)明實(shí)施例中的調(diào)用棧示意圖。
具體實(shí)施例方式PaaS云平臺(tái)是指在一臺(tái)計(jì)算機(jī)上運(yùn)行多個(gè)程序,需要一種機(jī)制能保證用戶程序之間不會(huì)相互影響。本發(fā)明實(shí)施例提出了一種防止用戶程序之間相互影響的安全沙箱技術(shù)。在安全沙箱的限制范圍內(nèi),用戶可以執(zhí)行任何權(quán)限允許的操作。當(dāng)用戶嘗試執(zhí)行安全沙箱限制外的操作時(shí),將拋出安全異常。通常,安全沙箱機(jī)制包括許多功能,例如限制用戶程序?qū)懳募到y(tǒng)、創(chuàng)建socket、創(chuàng)建子進(jìn)程或子線程、執(zhí)行一些系統(tǒng)調(diào)用等等。本發(fā)明實(shí)施例通過擴(kuò)展傳統(tǒng)policy的描述能力來實(shí)現(xiàn)一種全新的Java訪問控制機(jī)制。本發(fā)明實(shí)施例提供的安全沙箱技術(shù),結(jié)合了 Java訪問控制機(jī)制中SecurityManager 和JAAS的優(yōu)點(diǎn),并彌補(bǔ)了兩者存在的缺陷,為PaaS云平臺(tái)提供了行之有效的安全沙箱機(jī)制。在本發(fā)明實(shí)施例實(shí)現(xiàn)的安全沙箱機(jī)制下,不僅能夠保證PaaS云平臺(tái)提供的服務(wù)能被用戶程序正常的調(diào)用,而且能保證PaaS云平臺(tái)自身的靈活性,以適應(yīng)平臺(tái)多變的需求。與傳統(tǒng)的Java安全控制機(jī)制相同,本發(fā)明實(shí)施例提供的Java安全控制機(jī)制也分兩個(gè)層面實(shí)現(xiàn),在部署層面通過類加載器(classloader)對類的加載來保證安全性;在運(yùn)行階段通過Java的訪問控制機(jī)制來實(shí)現(xiàn)。具體的,本發(fā)明實(shí)施例分別從應(yīng)用的部署階段和運(yùn)行階段實(shí)現(xiàn)了安全沙箱機(jī)制。在部署階段,通過配置白名單,改寫JVM中類加載器來對用戶程序載入的類進(jìn)行限制;在運(yùn)行階段,通過擴(kuò)展policy策略文件的描述能力,引入JAAS機(jī)制中的特權(quán)操作概念,實(shí)現(xiàn)運(yùn)行期的訪問控制,并且其靈活性也能滿足PaaS云平臺(tái)需求多變的特征。首先,對應(yīng)用部署階段和應(yīng)用運(yùn)行階段進(jìn)行說明部署階段是指將磁盤上的物理資源(比如class文件,即類文件)加載到內(nèi)存中的過程;運(yùn)行階段是指應(yīng)用程序從開始執(zhí)行到程序退出之間的過程。JVM采用了滯后加載的類加載機(jī)制,即在程序運(yùn)行時(shí)根據(jù)需要,在調(diào)用某個(gè)類的時(shí)候?qū)⑦@個(gè)類從物理磁盤加載到內(nèi)存中。因此可以說程序的部署階段是穿插在運(yùn)行階段之中的。下面對這兩個(gè)階段的具體實(shí)現(xiàn)進(jìn)行詳細(xì)描述。(I)部署階段本發(fā)明實(shí)施例通過修改JVM的類加載器來限制類的載入。主要的流程可如圖2所示,包括步驟201,應(yīng)用程序調(diào)用某個(gè)類,如調(diào)用該類的某個(gè)方法。步驟202,類加載器判斷此類是否之前已經(jīng)被載入到內(nèi)存中了,如果沒有,則轉(zhuǎn)入步驟203,否則繼續(xù)執(zhí)行應(yīng)用程序,如執(zhí)行被調(diào)用的類的相應(yīng)方法。步驟203,JVM調(diào)用類加載器,以便加載此類的class文件。步驟204,類加載器判斷待加載的類是否在白名單中,如果在白名單中,則轉(zhuǎn)入步驟205 ;若不在白名單中,則轉(zhuǎn)入步驟206。所謂“白名單”即為允許加載的類的列表。在具體實(shí)施時(shí),可通過jar包名加上類名的方式唯一標(biāo)識(shí)一個(gè)類。白名單可預(yù)先設(shè)置,其中存儲(chǔ)有類標(biāo)識(shí),白名單中的類均認(rèn)為是允許加載的類。類加載器可通過該唯一標(biāo)識(shí)判斷待加載的類是否在白名單中。
步驟205,類加載器將此類加載到內(nèi)存中,并返回主程序繼續(xù)執(zhí)行,如執(zhí)行被調(diào)用的類的相應(yīng)方法。步驟206,類加載器拒絕加載此類,拋出異常(如返回操作異常響應(yīng))。通過以上流程可以看出,本發(fā)明實(shí)施例通擴(kuò)展程序部署階段類加載器的能力,通過設(shè)置白名單的方式,類加載器有效限制了應(yīng)用程序可以加載的類的列表。(2)運(yùn)行階段本發(fā)明實(shí)施例對policy策略文件的描述能力進(jìn)行了擴(kuò)展,實(shí)現(xiàn)了帶約束條件的
隱式授權(quán),一個(gè)典型的擴(kuò)展后的策略文件如下所示
Grant myClass{
Permission [File/·. .JPermission d:\java_resource\* read { ClassB.accessResourceQ;
ClassC.accessResource();
}; };
擴(kuò)展后的policy策略文件對傳統(tǒng)格式進(jìn)行了如下擴(kuò)展Permission條目中增加了約束條件,通過嵌套{}的形式擴(kuò)展。如上所示,當(dāng)且僅當(dāng)用戶類myClass調(diào)用ClassB的accessResource O方法,或者調(diào)用ClassC的accessResource O方法時(shí),用戶類myClass具有ClassB或ClassC的資源訪問權(quán)限,如讀寫d:\resource目錄下所有資源的權(quán)限。若用戶類myClass不調(diào)用這兩個(gè)類的accessResource O操作,貝U用戶類myClass僅有讀d: \resource目錄下所有資源的權(quán)限,而沒有寫權(quán)限。通過此擴(kuò)展,policy策略文件描述了一種帶約束的隱式權(quán)限授予機(jī)制,即,為用戶類賦予資源訪問特權(quán)(如讀寫權(quán)限)時(shí)是有附帶約束條件的,僅當(dāng)用戶類的調(diào)用符合該約束條件時(shí),才能將被調(diào)用的用戶類的資源訪問特權(quán)賦給該調(diào)用用戶類,從而通過擴(kuò)展policy策略文件的描述能力來實(shí)現(xiàn)靈活的運(yùn)行時(shí)訪問控制機(jī)制。根據(jù)以上原則,在制定訪問權(quán)限時(shí),可為需要對資源進(jìn)行讀寫的類(如上述的ClassB或ClassC)設(shè)置較高的資源訪問權(quán)限,即特權(quán)權(quán)限,并在policy策略文件中需要調(diào)用該類的用戶類(如上述的myClass)的Permission條目中以調(diào)用關(guān)系的方式設(shè)置授權(quán)約束條件,以便在符合該調(diào)用關(guān)系時(shí)將被調(diào)用的類的特權(quán)權(quán)限賦予給調(diào)用用戶類(如上述的myClass)。通常,SecurityManager的運(yùn)行機(jī)制包括在 JDK(Java Development Kit, Java開發(fā)工具包,JDK包括了 Java運(yùn)行環(huán)境,Java工具和Java基礎(chǔ)的類庫)的一些類的實(shí)現(xiàn)中,在每個(gè)涉及對敏感資源的訪問操作前,都通過SecurityManager對象和policy策略文件的規(guī)則,判斷操作是否有足夠的權(quán)限,如果有,則繼續(xù)訪問敏感資源,否則拋出安全異常SecurityExceptionο
本發(fā)明實(shí)施例依然遵循上述SecurityManager的運(yùn)行機(jī)制,以jar包為單位,根據(jù)每個(gè)jar包的權(quán)限描述文件自動(dòng)生成擴(kuò)展的policy策略文件,然后由擴(kuò)展SecurityManager類來根據(jù)擴(kuò)展的policy策略文件的規(guī)則判斷某個(gè)調(diào)用操作對敏感資源是否有足夠的訪問權(quán)限。在應(yīng)用程序執(zhí)行之前,根據(jù)應(yīng)用程序的類依賴文件,即每個(gè)jar包的權(quán)限描述,生成擴(kuò)展policy策略文件。其中,每個(gè)jar包對其包含的所有類的權(quán)限有一個(gè)整體的描述。描述由兩部分組成,一部分是jar包所有類默認(rèn)具有的權(quán)限,另一部分是jar包中哪些類的哪些方法是特權(quán)方法,這些特權(quán)方法有哪些額外的權(quán)限。通過讀取jar包,可獲得權(quán)限描述信息,然后將jar包描述文件里的所有特權(quán)操作及其具有的額外權(quán)限賦給所有用戶類,需要說明的是,對用戶類的隱式權(quán)限授予是帶約束條件的,從而生成擴(kuò)展的policy策略文件。進(jìn)一步的,還可根據(jù)擴(kuò)展policy策略文件初始 化得到SecurityManager權(quán)限檢測的數(shù)據(jù)結(jié)構(gòu)。此數(shù)據(jù)結(jié)構(gòu)與現(xiàn)有技術(shù)中的數(shù)據(jù)結(jié)構(gòu)不同的是,其中包含了擴(kuò)展policy策略文件中的約束條件。在應(yīng)用程序運(yùn)行期間,當(dāng)應(yīng)用程序執(zhí)行用戶類的調(diào)用操作,且該用戶類或/和被調(diào)用的類已經(jīng)加載的情況下,本發(fā)明實(shí)施例提供的安全訪問控制流程可如圖3所示,通常情況下,用戶自定義的類具有最小的權(quán)限集originalPermissionSet。其中,為描述方便,以用戶類 myClass 調(diào)用 ClassA 的 accessResource ()方法,欲讀寫 d:\java_resource 目錄下的resource, data資源文件為例進(jìn)行描述。其中,用戶類myClass具有讀d: \ java_resource目錄下的所有文件的權(quán)限,ClassA具有讀寫d:\java_resource目錄下的所有文件的權(quán)限,該流程可包括步驟301, SecurityManager根據(jù)policy策略文件判斷用戶類myClass是否有訪問被調(diào)用類ClassA的訪問權(quán)限,如果有,則轉(zhuǎn)入步驟302 ;否則轉(zhuǎn)入步驟306。在具體實(shí)施時(shí),SecurityManager可根據(jù)由擴(kuò)展policy策略文件判斷用戶類myClass是否有訪問被調(diào)用類ClassA的訪問權(quán)限。步驟302, SecurityManager根據(jù)policy策略文件判斷用戶類myClass調(diào)用ClassA的accessResource O方法的操作是否滿足授權(quán)約束條件,如果滿足,貝U轉(zhuǎn)入步驟303 ;否則,轉(zhuǎn)入步驟304。在具體實(shí)施時(shí),SecurityManager可根據(jù)由擴(kuò)展policy策略文件初始化得到SecurityManager權(quán)限檢測的數(shù)據(jù)結(jié)構(gòu),判斷用戶類myClass對ClassA的accessResource O方法的調(diào)用是否滿足授權(quán)約束條件。步驟303, SecurityManager將ClassA的資源訪問權(quán)限賦給用戶類myClass。由于ClassA具有訪問d:\java_resource目錄下的所有文件的權(quán)限,因此用戶類myClass也就具有了問d:\java_resource目錄下的所有文件的權(quán)限,然后轉(zhuǎn)入步驟304。步驟304, SecurityManager進(jìn)行棧檢測,判斷用戶類myClass調(diào)用ClassA的accessResource O方法的操作是否有足夠權(quán)限訪問資源,如果有,則轉(zhuǎn)入步驟305 ;否則,轉(zhuǎn)入步驟306。其中,SecurityManager可根據(jù)現(xiàn)有方式進(jìn)行棧檢測,即通過將調(diào)用棧中的類的權(quán)限集取交集,并判斷取交集的結(jié)果是否有讀寫被訪問資源的權(quán)限。如果有權(quán)限,則應(yīng)用程序繼續(xù)正常執(zhí)行,否則拋出安全異常SecurityException。步驟305,執(zhí)行被調(diào)用的用戶類的方法,訪問資源。步驟3O6, SecurityManager 拋出異常。上述流程中,若JVM在接收到用戶類myClass調(diào)用ClassA的accessResource O方法的請求時(shí),發(fā)現(xiàn)用戶類myClass或ClassA還未加載,則先要加載相應(yīng)類,此后的安全控制流程可如圖3所示。用戶類的加載可使用前述的類加載過程,當(dāng)然也可以采用現(xiàn)有加載方式。以上流程中,應(yīng)用程序開始執(zhí)行之前,首先根據(jù)應(yīng)用程序的Jar包生成擴(kuò)展的policy策略文件,然后根據(jù)格式擴(kuò)展后的policy策略文件來初始化SecurityManager后續(xù)權(quán)限檢測需要用到的數(shù)據(jù)結(jié)構(gòu)。在程序開始執(zhí)行之后,擴(kuò)展后的SecurityManager類首先判斷用戶類的調(diào)用是否滿足約束條件進(jìn)行隱式的權(quán)限授予,如果滿足則對用戶類進(jìn)行隱式 權(quán)限授予操作。然后SecurityManager開始進(jìn)行傳統(tǒng)的棧檢測以判斷操作是否有足夠的權(quán)限。從而實(shí)現(xiàn)了運(yùn)行階段的訪問控制。為了更清楚的描述本發(fā)明,下面以一具體實(shí)例對本發(fā)明實(shí)施例的具體實(shí)現(xiàn)過程進(jìn)行描述。本實(shí)例中,JVM根據(jù)jar包的權(quán)限描述信息所生成的policy策略文件中包括
Grant myClass {
Permission [File/.. .JPermission d:\java_resource\* read { ClassB.accessResource();
ClassC.accessResource();
};其中,ClassB、ClassC和ClassD均有對d:\java_resource目錄下的所有文件進(jìn)行讀寫的權(quán)限。當(dāng)JVM接收到用戶類myClass調(diào)用ClassB. accessResource O的請求,以請求訪問資源“d: \ java_resource\*”時(shí),根據(jù)Permission條目下設(shè)置的資源訪問的授權(quán)約束條件,判斷出用戶類myClass調(diào)用ClassB. accessResource O的操作滿足該授權(quán)約束條件,根據(jù)該判斷結(jié)果JVM將ClassB的資源訪問權(quán)限賦給用戶類myClass,從而使用戶類myClass具有對資源“d:\java_reS0Urce\*”的讀寫訪問權(quán)限,此后JVM按照現(xiàn)有方式通過棧檢測,判斷此調(diào)用操作是否有足夠權(quán)限訪問資源。當(dāng)JVM接收到用戶類myClass調(diào)用ClassD. accessResource O的請求,以請求訪問資源“ d: \ java_resource\* ”時(shí),根據(jù)Permi ssion條目下設(shè)置的資源訪問的授權(quán)約束條件,判斷出用戶類myClass調(diào)用ClassD. accessResource O的操作不滿足該授權(quán)約束條件,根據(jù)該判斷結(jié)果JVM不會(huì)將ClassD的資源訪問權(quán)限賦給用戶類myClass,此后按照現(xiàn)有方式通過棧檢測,判斷此調(diào)用操作是否有足夠權(quán)限訪問資源。需要說明的是,以上流程以“類”為例描述,但本發(fā)明實(shí)施例并不僅限于此種組件,還適用于其它類型的組件,如jar包。通過以上描述可以看出,本發(fā)明實(shí)施例擴(kuò)展了傳統(tǒng)Java的訪問權(quán)限驗(yàn)證流程,通過從部署到運(yùn)行兩個(gè)層次,控制類的加載和特定類對資源的訪問,實(shí)現(xiàn)了靈活可配置的安全沙箱機(jī)制。本發(fā)明實(shí)施例可應(yīng)用在PaaS云服務(wù)平臺(tái),從而有效實(shí)現(xiàn)平臺(tái)的安全性。本發(fā)明實(shí)施例與現(xiàn)有的利用Java傳統(tǒng)安全機(jī)制提供的SecurityManager和JAAS實(shí)現(xiàn)的安全沙箱相比,將JAAS中特權(quán)操作的概念和SecurityManager策略文件的靈活性相結(jié)合,實(shí)現(xiàn)了靈活可配置的安全沙箱機(jī)制?;谙嗤募夹g(shù)構(gòu)思,本發(fā)明實(shí)施例還提供了一種Java應(yīng)用安全訪問控制裝置,該裝置可以是JVM,可通過計(jì)算機(jī)程序?qū)崿F(xiàn)。參見圖4,為本發(fā)明實(shí)施例提供的JVM的結(jié)構(gòu)示意圖,該JVM可包括
類加載器401,用于加載用戶類;安全管理器402,用于根據(jù)Java歸檔文件中的權(quán)限描述信息,生成擴(kuò)展安全訪問策略文件,所述擴(kuò)展安全策略文件中的組件的資源訪問權(quán)限信息中設(shè)置有授權(quán)約束條件,所述授權(quán)約束條件表示當(dāng)對應(yīng)組件調(diào)用其它組件的指定操作時(shí)需要被賦予被調(diào)用組件的資源訪問權(quán)限;以及,當(dāng)接收到第一組件調(diào)用第二組件的請求且相應(yīng)組件已經(jīng)加載時(shí),根據(jù)所述擴(kuò)展安全訪問策略文件,若判斷本次調(diào)用滿足相應(yīng)授權(quán)約束條件,則根據(jù)相應(yīng)授權(quán)約束條件將第二組件的資源訪問權(quán)限賦予第一組件,并對本次調(diào)用進(jìn)行安全訪問控制。進(jìn)一步的,安全管理器402還可用于若判斷本次調(diào)用不滿足授權(quán)約束條件,則通過棧檢測對本次調(diào)用進(jìn)行安全訪問控制。進(jìn)一步的,安全管理器402可通過以下方式,在組件的資源訪問權(quán)限信息中設(shè)置授權(quán)約束條件在所述擴(kuò)展安全策略文件中的第一組件的資源訪問權(quán)限條目下,設(shè)置調(diào)用第二組件的指定操作的語句,用于表示當(dāng)?shù)谝唤M件調(diào)用第二組件的指定操作時(shí)需要被賦予第二組件的資源訪問權(quán)限。進(jìn)一步的,類加載器401具體用于當(dāng)JVM接收到組件調(diào)用其它組件的請求后判斷相應(yīng)組件還未加載時(shí),判斷相應(yīng)組件是否存在于允許加載的組件列表中,并當(dāng)判斷為是時(shí),加載所述相應(yīng)組件。上述組件可以是用戶類。圖5示出了用戶、服務(wù)平臺(tái)以及本發(fā)明實(shí)施例的Java安全訪問控制機(jī)制(由JVM實(shí)現(xiàn))之間的關(guān)系示意。如圖所示,本發(fā)明實(shí)施例的Java安全訪問控制機(jī)制運(yùn)行在PaaS云服務(wù)平臺(tái)上,該安全訪問控制機(jī)制根據(jù)policy策略文件、類加載白名單來限制用戶程序訪問平臺(tái)的敏感資源。用戶程序的各種操作都需要經(jīng)過訪問控制機(jī)制驗(yàn)證通過后才能訪問平臺(tái)的敏感資源。其中,如圖6A所示,用戶程序通過調(diào)用SDK來調(diào)用PaaS云服務(wù)平臺(tái)提供的云能力服務(wù)(如 Database, socket 等)。SDK 是 Software Development Kit 的英文縮寫,即軟件開發(fā)工具包,一般是一些被軟件工程師用于為特定的軟件包、軟件框架、硬件平臺(tái)、操作系統(tǒng)等建立應(yīng)用軟件的開發(fā)工具的集合。用戶程序可通過調(diào)用SDK提供的API (ApplicationProgramming Interface,應(yīng)用程序接口)來調(diào)用PaaS云服務(wù)平臺(tái)提供的云能力服務(wù)。圖6B示出了調(diào)用棧結(jié)構(gòu),其中,權(quán)限交集=用戶類Π SDK η云能力服務(wù)。本發(fā)明的上述實(shí)施例,將Java訪問控制中的JAAS和SecurityManager的優(yōu)點(diǎn)結(jié)合起來,實(shí)現(xiàn)了靈活可配置的安全沙箱機(jī)制。相對于JAAS,本發(fā)明實(shí)施例更具靈活性,通過配置文件而不是硬編碼的方式實(shí)現(xiàn)訪問控制,降低了后續(xù)代碼維護(hù)的復(fù)雜性;相對于SecurityManager,本發(fā)明實(shí)施例通過特權(quán)操作的概念使用戶類在調(diào)用特權(quán)操作時(shí)能夠擴(kuò)展自身的權(quán)限集,達(dá)到正常訪問PaaS平臺(tái)提供的云服務(wù)的功能。本發(fā)明實(shí)施例可應(yīng)用在PaaS云服務(wù)平臺(tái)的應(yīng)用托管服務(wù)器上,不僅能在有效限制用戶程序?qū)ζ脚_(tái)敏感資源的訪問權(quán)限的同時(shí)保證云平臺(tái)的服務(wù)能被正常調(diào)用,并且降低了 PaaS云服務(wù)平臺(tái)提供商的維護(hù)復(fù)雜性和成本。
通過以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的通用硬件平臺(tái)的方式來實(shí)現(xiàn),當(dāng)然也可以通過硬件,但很多情況下前者是更佳的實(shí)施方式。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)終端設(shè)備(可以是手機(jī),個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述的方法。以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視本發(fā)明的保護(hù)范圍。
權(quán)利要求
1. 一種Java應(yīng)用安全訪問控制方法,其特征在于,包括 Java虛擬機(jī)JVM根據(jù)Java歸檔文件中的權(quán)限描述信息,生成擴(kuò)展安全訪問策略文件,所述擴(kuò)展安全策略文件中的組件的資源訪問權(quán)限信息中設(shè)置有授權(quán)約束條件,所述授權(quán)約束條件表示當(dāng)對應(yīng)組件調(diào)用其它組件的指定操作時(shí)需要被賦予被調(diào)用組件的資源訪問權(quán)限; 當(dāng)JVM接收到第一組件調(diào)用第二組件的請求且相應(yīng)組件已經(jīng)加載時(shí),JVM根據(jù)所述擴(kuò)展安全訪問策略文件,若判斷本次調(diào)用滿足相應(yīng)授權(quán)約束條件,則根據(jù)相應(yīng)授權(quán)約束條件將第二組件的資源訪問權(quán)限賦予第一組件,并對本次調(diào)用進(jìn)行安全訪問控制。
2.如權(quán)利要求I所述的方法,其特征在于,還包括 若JVM判斷本次調(diào)用不滿足授權(quán)約束條件,則通過棧檢測對本次調(diào)用進(jìn)行安全訪問控制。
3.如權(quán)利要求I所述的方法,其特征在于,JVM通過以下方式,在組件的資源訪問權(quán)限信息中設(shè)置授權(quán)約束條件 在所述擴(kuò)展安全策略文件中的第一組件的資源訪問權(quán)限條目下,設(shè)置調(diào)用第二組件的指定操作的語句,用于表示當(dāng)?shù)谝唤M件調(diào)用第二組件的指定操作時(shí)需要被賦予第二組件的資源訪問權(quán)限。
4.如權(quán)利要求I所述的方法,其特征在于,當(dāng)JVM接收到第一組件調(diào)用第二組件的請求,但判斷相應(yīng)組件還未加載時(shí),還包括 JVM判斷相應(yīng)組件是否存在于允許加載的組件列表中,并當(dāng)判斷為是時(shí),加載所述相應(yīng)組件。
5.如權(quán)利要求1-4之一所述的方法,其特征在于,所述組件為用戶類。
6.一種用于實(shí)現(xiàn)Java應(yīng)用安全訪問控制的JVM,其特征在于,包括 類加載器,用于加載用戶類; 安全管理器,用于根據(jù)Java歸檔文件中的權(quán)限描述信息,生成擴(kuò)展安全訪問策略文件,所述擴(kuò)展安全策略文件中的組件的資源訪問權(quán)限信息中設(shè)置有授權(quán)約束條件,所述授權(quán)約束條件表示當(dāng)對應(yīng)組件調(diào)用其它組件的指定操作時(shí)需要被賦予被調(diào)用組件的資源訪問權(quán)限;以及,當(dāng)接收到第一組件調(diào)用第二組件的請求且相應(yīng)組件已經(jīng)加載時(shí),根據(jù)所述擴(kuò)展安全訪問策略文件,若判斷本次調(diào)用滿足相應(yīng)授權(quán)約束條件,則根據(jù)相應(yīng)授權(quán)約束條件將第二組件的資源訪問權(quán)限賦予第一組件,并對本次調(diào)用進(jìn)行安全訪問控制。
7.如權(quán)利要求6所述的JVM,其特征在于,所述安全管理器還用于,若判斷本次調(diào)用不滿足授權(quán)約束條件,則通過棧檢測對本次調(diào)用進(jìn)行安全訪問控制。
8.如權(quán)利要求6所述的JVM,其特征在于,所述安全管理器具體用于,通過以下方式,在組件的資源訪問權(quán)限信息中設(shè)置授權(quán)約束條件在所述擴(kuò)展安全策略文件中的第一組件的資源訪問權(quán)限條目下,設(shè)置調(diào)用第二組件的指定操作的語句,用于表示當(dāng)?shù)谝唤M件調(diào)用第二組件的指定操作時(shí)需要被賦予第二組件的資源訪問權(quán)限。
9.如權(quán)利要求6所述的JVM,其特征在于,所述類加載器具體用于,當(dāng)JVM接收到組件調(diào)用其它組件的請求后判斷相應(yīng)組件還未加載時(shí),判斷相應(yīng)組件是否存在于允許加載的組件列表中,并當(dāng)判斷為是時(shí),加載所述相應(yīng)組件。
10.如權(quán)利要求6-9之一所述的方法,其特征在于,所述組件為用戶類。
全文摘要
本發(fā)明公開一種Java應(yīng)用安全訪問控制方法及其裝置,該方法包括JVM根據(jù)Java歸檔文件中的權(quán)限描述信息,生成擴(kuò)展安全訪問策略文件,所述擴(kuò)展安全策略文件中的組件的資源訪問權(quán)限信息中設(shè)置有授權(quán)約束條件,所述授權(quán)約束條件表示當(dāng)對應(yīng)組件調(diào)用其它指定組件的指定操作時(shí)需要被賦予被調(diào)用組件的資源訪問權(quán)限;當(dāng)JVM接收到第一組件調(diào)用第二組件的請求且相應(yīng)組件已經(jīng)加載時(shí),JVM根據(jù)所述擴(kuò)展安全訪問策略文件,若判斷本次調(diào)用滿足相應(yīng)授權(quán)約束條件,則根據(jù)相應(yīng)授權(quán)約束條件將第二組件的資源訪問權(quán)限賦予第一組件,并對本次調(diào)用進(jìn)行安全訪問控制。采用本發(fā)明可提高Java安全機(jī)制部署的靈活性,并能保證在安全控制范圍內(nèi)滿足用戶訪問需求。
文檔編號G06F21/57GK102955915SQ201110244430
公開日2013年3月6日 申請日期2011年8月23日 優(yōu)先權(quán)日2011年8月23日
發(fā)明者李勇, 吳恒, 胡睿 申請人:中國移動(dòng)通信集團(tuán)公司