J2EE 中的安全第一部分 - J2EE安全介绍
現(xiàn)在越來(lái)越多的企業(yè)應(yīng)用建置在J2EE平臺(tái)上,這得益于J2EE為企業(yè)應(yīng)用的開發(fā)提供了良好的框架和服務(wù)的支持。J2EE為企業(yè)應(yīng)用提供了多方面的服務(wù)(Security、Transaction、Naming等)。本文將介紹J2EE提供的安全服務(wù) 。作者首先介紹J2EE中的安全概念和J2EE的安全架構(gòu),然后結(jié)合具體的案例向讀者展示如何在自己的程序中應(yīng)用J2EE提供的安全特性。本文所介紹的內(nèi)容是基于J2EE1.3版本的。
二.J2EE中的安全概念主體(Principal)︰主體(Principal)是被在企業(yè)安全服務(wù)驗(yàn)證了的實(shí)體。主體(Principal)用主體名作為它的識(shí)別數(shù)據(jù),透過(guò)與主體相關(guān)的驗(yàn)證數(shù)據(jù)進(jìn)行驗(yàn)證。通常主體名就是使用者的 登入名,驗(yàn)證數(shù)據(jù)就是登入的密碼。J2EE規(guī)范中并沒(méi)有限定J2EE 產(chǎn)品提供商使用怎樣的認(rèn)證方法,因此主體名和驗(yàn)證數(shù)據(jù)的內(nèi)容和格式依不同的認(rèn)證協(xié)議而不同。
安全原則網(wǎng)域(Security Policy Domain)︰也稱安全網(wǎng)域(security domain)或 realm,它是一個(gè)邏輯范圍或字段,在這一范圍或字段中安全服務(wù)的管理員定義和實(shí)施通用的安全原則。它是從安全原則的角度來(lái)劃分的字段。比如可以將企業(yè)應(yīng)用系統(tǒng)劃分為企業(yè)員工、供貨商、合作伙伴等不同的安全網(wǎng)域,對(duì)這些安全字段采用不同的安全原則。
安全技術(shù)網(wǎng)域(Security Technology Domain)︰它是從安全技術(shù)的角度來(lái)劃分的字段,在一個(gè)安全技術(shù)網(wǎng)域中使用同樣的安全機(jī)制來(lái)執(zhí)行安全原則。一個(gè)安全技術(shù)網(wǎng)域可以包括多個(gè)安全原則網(wǎng)域。
安全屬性(Security Attributes)︰每個(gè)主體(Principal)都有一系列與之相關(guān)的安全屬性。安全屬性可用來(lái)存取被保護(hù)的資源,檢查使用者的身份和完成其它一些安全相關(guān)的用途。J2EE產(chǎn)品提供商或具體的驗(yàn)證服務(wù)的實(shí)作來(lái)決定怎樣將安全屬性與一個(gè)主體連絡(luò)起來(lái)。J2EE規(guī)范并沒(méi)有限定什么樣的安全屬性將與主體相連絡(luò)。
憑證(Credential)︰憑證包括或參照為J2EE 系統(tǒng)驗(yàn)證一個(gè)主體的驗(yàn)證訊息(安全屬性)。如果成功的透過(guò)了驗(yàn)證,主體將獲得一個(gè)包括安全屬性的憑證。如果被容許的話,一個(gè)主體也可能獲取另一個(gè)主體的憑證。在這種情況下兩個(gè)主體在同一安全網(wǎng)域中具有相同的安全屬性。
在J2EE的環(huán)境中,組件的安全是由他們各自的容器來(lái)負(fù)責(zé)的,組件的開發(fā)人員幾乎可以不用或者很少在組件中加入有關(guān)安全的代碼。這種安全邏輯和商業(yè)邏輯相對(duì)獨(dú)立的架構(gòu),使得企業(yè)級(jí)應(yīng)用系統(tǒng)有更好的靈活性和擴(kuò)充性。J2EE規(guī)范要求J2EE 產(chǎn)品必須為應(yīng)用程序開發(fā)者提供兩種形式的基于容器的安全性-說(shuō)明性的安全性和可程序化的安全性。
a. 說(shuō)明性的安全性
說(shuō)明性的安全性透過(guò)安全結(jié)構(gòu)描述的方式來(lái)代表應(yīng)用程序的安全需求,安全結(jié)構(gòu)一般包括安全角色,存取控制和驗(yàn)證要求等。在J2EE平臺(tái)中布署描述子作為說(shuō)明的安全性的主要工具。 布署描述子是組件開發(fā)者和應(yīng)用程序布署者或應(yīng)用程序組裝者之間的交流工具。應(yīng)用程序的開發(fā)者用它來(lái)表示應(yīng)用中的安全需求,應(yīng)用程序布署者或應(yīng)用程序組裝者將安全 角色與布署環(huán)境中的使用者和群組映射起來(lái)。
在程序執(zhí)行時(shí)容器從布署描述子中提取出相應(yīng)的安全原則,然后容器根據(jù)安全原則執(zhí)行安全驗(yàn)證。說(shuō)明的安全性不需要工作人員編寫任何安全相關(guān)的 程序代碼,一切都是透過(guò)設(shè)定布署描述子來(lái)完成的。
b. 可程序化的安全性
可程序化的安全性在說(shuō)明性的安全性的基礎(chǔ)上,使安全敏感的應(yīng)用可以透過(guò)呼叫被容器提供的API來(lái)對(duì)安全作出決斷。這在說(shuō)明性的安全性不足以滿足企業(yè)的安全模型的情況是非常有用的。J2EE在EJB EjbConext interface和servlet HttpServletRequest interface中各提供兩個(gè)方法︰
這些方法容許組件根據(jù)呼叫者或遠(yuǎn)程使用者的安全角色來(lái)作出商業(yè)判斷。在文章的后面部分將有這些方法的詳細(xì)介紹和范例,以便讀者更好的理解可程序化的安全性的用途。
2.J2EE的驗(yàn)證模型身份驗(yàn)證是使用者或組件呼叫者向系統(tǒng)證明其身份的過(guò)程。使用者透過(guò)某種方式向系統(tǒng)提交驗(yàn)證訊息(通常是使用者名稱和密碼或者是使用者的數(shù)字簽章),系統(tǒng)用使用者提供的驗(yàn)證訊息和系統(tǒng)的安全原則來(lái)驗(yàn)證使用者的身份。
圖一 初始驗(yàn)證過(guò)程
圖二 驗(yàn)證URL
圖三 驗(yàn)證EJB方法呼叫
使用者的驗(yàn)證
使用者的驗(yàn)證根據(jù)其客戶端類型不同分為兩種︰Web 客戶端的驗(yàn)證和Application客戶端的驗(yàn)證
a. Web 客戶端的驗(yàn)證
Web客戶端通常透過(guò)http協(xié)議來(lái)請(qǐng)求web服務(wù)器端的資源,這些web資源通常包括html網(wǎng)頁(yè)、jsp(java server page)檔案、java servlet和其它一些二進(jìn)制或多媒體檔案。在企業(yè)環(huán)境中,企業(yè)的某些資源往往要求只容許某些人存取,有些資源甚至是機(jī)密的或安全敏感的。因此對(duì)企業(yè)中各種web資源進(jìn)行存取控制是十分必要的。為了滿足企業(yè)中的不同安全層級(jí)和客戶化的需求,J2EE提供了三種基于web客戶端的驗(yàn)證方式︰
HTTP基本驗(yàn)證(HTTP Basic Authentication)
HTTP基本驗(yàn)證 是HTTP協(xié)議所支持的驗(yàn)證機(jī)制。這種驗(yàn)證機(jī)制使用使用者的使用者名稱和密碼作為驗(yàn)證訊息。Web客戶端從使用者獲取使用者名稱和密碼,然后傳遞他們給web服務(wù)器,web服務(wù)器在指定的字段(realm)中驗(yàn)證使用者。但需要注意的是,這種驗(yàn)證方法是不夠安全的。因?yàn)檫@種驗(yàn)證方法并不對(duì)使用者密碼進(jìn)行加密,而祇是對(duì)密碼進(jìn)行基本的base64的編碼。而且目標(biāo)web服務(wù)器對(duì)使用者來(lái)說(shuō)也是非驗(yàn)證過(guò)的。不能保證使用者存取到的web服務(wù)器就是使用者希望存取的。可以采用一些安全措施來(lái)克服這個(gè)弱點(diǎn)。例如在傳輸層上應(yīng)用SSL或者在網(wǎng)絡(luò)層上使用IPSEC或×××技術(shù)。
基于窗體的驗(yàn)證(Form-Based Authentication)
基于窗體的驗(yàn)證 使系統(tǒng)開發(fā)者可以訂做使用者的登入頁(yè)面和錯(cuò)誤頁(yè)面(error pages)。這種驗(yàn)證方法與基本HTTP的驗(yàn)證方法的唯一區(qū)別就在于它可以根據(jù)使用者的要求制定登入和 錯(cuò)誤頁(yè)面。基于窗體的驗(yàn)證方法同樣具有與基本HTTP驗(yàn)證類似的不安全的弱點(diǎn)。使用者在窗體中填寫使用者名稱和密碼,而后密碼以明文形式在網(wǎng)絡(luò)中傳遞,如果在網(wǎng)絡(luò)的某一節(jié)點(diǎn)將此驗(yàn)證請(qǐng)求截獲,在經(jīng)過(guò)反編碼很容易就可以獲取使用者的密碼。因此在使用基本HTTP的驗(yàn)證方式和基于窗體的驗(yàn)證方法時(shí),一定確定這兩種方式的弱點(diǎn)對(duì)你的應(yīng)用是可接受的。
基于客戶端證書的驗(yàn)證(Client-Certificate Authentication)
基于客戶端證書的驗(yàn)證方式要比上面兩種方式更安全。它透過(guò)HTTPS(HTTP over SSL)來(lái)保證驗(yàn)證的安全性。SSL 為驗(yàn)證過(guò)程提供了數(shù)據(jù)加密,服務(wù)器端認(rèn)證,訊息真實(shí)性等方面的安全保證。在此驗(yàn)證方式中,客戶端必須提供一個(gè)公鑰證書,你可以把這個(gè)公鑰證書看作是你的 數(shù)位護(hù)照。公鑰證書也稱數(shù)位簽章,它是被稱作證書授權(quán)機(jī)構(gòu)(CA)-一個(gè)被信任的組織頒發(fā)的。這個(gè)數(shù)字簽章必須符合X509公鑰體系結(jié)構(gòu)(PKI)的標(biāo)準(zhǔn)。如果你指定了這種驗(yàn)證方式,Web服務(wù)器將使用客戶端提供的 數(shù)字簽章來(lái)驗(yàn)證使用者的身份。
b. 應(yīng)用程序客戶端的驗(yàn)證(Application Client User Authentication)
java客戶端程序是執(zhí)行在使用者本地java虛擬機(jī)器上的java程序,它擁有main方法,通常由使用者可透過(guò)java.exe或javaw.exe直接啟動(dòng)執(zhí)行。J2EE應(yīng)用程序客戶端與java客戶端程序相似,也擁有main方法,但他們?cè)趫?zhí)行時(shí)存在一定的差別。J2EE應(yīng)用程序客戶端和其它J2EE組件一樣執(zhí)行在自己的容器中。使用者透過(guò)容器來(lái)執(zhí)行J2EE應(yīng)用程序客戶端。這樣J2EE應(yīng)用程序客戶端容器就有機(jī)會(huì)在J2EE應(yīng)用程序客戶端被執(zhí)行之前完成使用者身份的驗(yàn)證。J2EE提供了一種可訂做的方式來(lái)獲取使用者的驗(yàn)證訊息。可以選擇使用容器提供的 預(yù)設(shè)的方式來(lái)獲取J2EE應(yīng)用客戶端程序的使用者的驗(yàn)證訊息,也可以選擇訂做的方式來(lái)獲取使用者的驗(yàn)證訊息。當(dāng)選擇訂做方式時(shí),應(yīng)用程序開發(fā)者必須提供一個(gè)實(shí)作了javax.security.auth.callback.CallbackHandler interfce的類別,并且在J2EE布署描述檔application-client.xml中的元素callback-handler中加入這個(gè)類別的 類別名。這樣,當(dāng)系統(tǒng)需要驗(yàn)證使用者身份時(shí),客戶端程序的容器將布署描述檔中的CallbackHandler實(shí)作類別的類別名傳遞給系統(tǒng)的 登入模塊(驗(yàn)證模塊),登入模塊再案例化這個(gè)實(shí)作類別。這個(gè)類別的案例負(fù)責(zé)收集使用者驗(yàn)證訊息,并將收集到的使用者驗(yàn)證訊息傳遞給登入模塊,登入模塊用這些驗(yàn)證訊息來(lái)驗(yàn)證使用者。這個(gè)實(shí)作 類別可以是具有使用者界面的,或是透過(guò)要求使用者輸入來(lái)收集使用者驗(yàn)證訊息,也可以是透過(guò)指令行來(lái)獲取使用者驗(yàn)證訊息,還可能是透過(guò)讀取本地或在線的使用者證書庫(kù)來(lái)獲取使用者的電子證書。選取哪種方式取決于驗(yàn)證訊息的儲(chǔ)存方式。
有些J2EE產(chǎn)品廠商把容器的驗(yàn)證服務(wù)和本地系統(tǒng)的驗(yàn)證服務(wù)或其它應(yīng)用系統(tǒng)產(chǎn)品的驗(yàn)證服務(wù)整合起來(lái),從而在一定的應(yīng)用系統(tǒng)的范圍內(nèi)實(shí)作單一登入的能力。
單一登入 (Single Sign-On)
單一登入從使用者的角度來(lái)看,是指使用者在特定的邏輯安全字段中,只需進(jìn)行一次登入即可在存取在此邏輯安全字段中不同應(yīng)用系統(tǒng)中的被授權(quán)的資源,祇有超越了安全字段邊緣時(shí) 才要求再次 登入。這種能力對(duì)多種IT應(yīng)用系統(tǒng)共存的企業(yè)顯得更有價(jià)值。隨著企業(yè)訊息化建設(shè)程度的不斷提高,企業(yè)中的應(yīng)用系統(tǒng)也越來(lái)越多。在傳統(tǒng)的應(yīng)用系統(tǒng)中,各系統(tǒng)各自維護(hù)自己的安全原則,這些安全原則典型的包括組織結(jié)構(gòu)定義,安全 角色定義,使用者身份驗(yàn)證,資源存取控制等。由于各系統(tǒng)互相獨(dú)立,一個(gè)使用者在使用每一應(yīng)用系統(tǒng)之前,都必須按照相應(yīng)的系統(tǒng)身份進(jìn)行系統(tǒng) 登入。這對(duì)于使用者來(lái)說(shuō)必須記住每一個(gè)系統(tǒng)的使用者名稱和密碼,給使用者帶來(lái)了不小的麻煩。針對(duì)于這種情況,單一登入的概念隨之產(chǎn)生,并不斷的應(yīng)用到企業(yè)的應(yīng)用系統(tǒng)的整合當(dāng)中。J2EE1.3也在規(guī)范中建議J2EE產(chǎn)品應(yīng)為應(yīng)用系統(tǒng)提供單 一登入的能力。但J2EE1.3規(guī)范并沒(méi)有規(guī)定J2EE產(chǎn)品應(yīng)遵循何種標(biāo)準(zhǔn),因此不同的廠商的產(chǎn)品在單一登入上的實(shí)作和應(yīng)用各不相同。有的J2EE產(chǎn)品實(shí)作了在本產(chǎn)品環(huán)境范圍內(nèi)的單 一登入,有的實(shí)作了特定系統(tǒng)環(huán)境之間的單一登入(如IBM WebSphere Application 4.0 AE 實(shí)作了WebSphere Application Server與WebSphere Application Server、WebSphere Application Server與Lotus Domino server 之間的單一登入能力)。在J2EE中單一登入是透過(guò)傳遞憑證(Credential)來(lái)實(shí)作的。當(dāng)使用者進(jìn)行系統(tǒng)登入時(shí),客戶端容器(包括WEB客戶端和應(yīng)用程序客戶端)根據(jù)使用者的憑證(Credential)為使用者建立一個(gè)安全 性內(nèi)容(security Context),安全性內(nèi)容包括用于驗(yàn)證使用者的安全信息,系統(tǒng)用這個(gè)安全性內(nèi)容和安全原則來(lái)判斷使用者是否有存取系統(tǒng)資源的權(quán)限。遺憾的是J2EE規(guī)范并沒(méi)有規(guī)定安全 性內(nèi)容的格式,因此不能在不同廠商的J2EE產(chǎn)品之間傳遞安全性內(nèi)容。到目前為止還很少有在不同的J2EE產(chǎn)品間互相共享安全性內(nèi)容,因此在不同J2EE產(chǎn)品間實(shí)作單 一登入只能透過(guò)第三方產(chǎn)品(如LDAP server等)整合的方式。
惰性驗(yàn)證(Lazy Authentication)
身份驗(yàn)證是有代價(jià)的。例如,一次驗(yàn)證過(guò)程也許包括多次透過(guò)網(wǎng)絡(luò)訊息交換。因此惰性驗(yàn)證就非常有用了。惰性驗(yàn)證 是當(dāng)使用者存取受保護(hù)的資源時(shí)才執(zhí)行驗(yàn)證過(guò)程,而不是在使用者第一次發(fā)起請(qǐng)求時(shí)就執(zhí)行驗(yàn)證過(guò)程。
程序代碼授權(quán)(Code Authorization)
J2EE產(chǎn)品透過(guò)java 2 安全模型來(lái)限制特定J2SE的類別和方法的執(zhí)行,以保護(hù)和確保操作系統(tǒng)的安全。詳細(xì)描述請(qǐng)參閱《J2SE規(guī)范文件》。
呼叫者授權(quán)(Caller Authorization)
安全角色︰安全角色是具有相同安全屬性的邏輯組。它是由應(yīng)用程序的組裝者(Application Assembler)或應(yīng)用程序的布署者(Application Deployer)指派的。
安全角色參照
安全角色參照是應(yīng)用程序提供者(Application Provider)用來(lái)參照安全角色的識(shí)別數(shù)據(jù)。應(yīng)用程序提供者(Application Provider)可以用安全角色參照來(lái)為安全角色指派資源存取的權(quán)限。也在安全相關(guān)的程序代碼中參照安全角色。
使用者和群組
使用者和群組是在實(shí)際系統(tǒng)環(huán)境下的使用者和使用者的集合。它們對(duì)應(yīng)者現(xiàn)實(shí)當(dāng)中的人和群體
存取控制
存取控制可以確保安全角色只能存取已授予它安全權(quán)限的授權(quán)對(duì)象。授權(quán)對(duì)象包括EJB的遠(yuǎn)程方法、web資源(html網(wǎng)頁(yè),jsp/servlet和多媒體或二進(jìn)制 檔案)等。在J2EE中存取控制在應(yīng)用程序描述文件中與安全角色關(guān)聯(lián)起來(lái)。
映射
透過(guò)映像應(yīng)用程序的系統(tǒng)管理員將實(shí)際系統(tǒng)環(huán)境中的使用者和角色與安全角色連絡(luò)起來(lái),讓實(shí)際的使用者擁有對(duì)企業(yè)資源存取的適當(dāng)授權(quán)。
被傳播的呼叫者身份識(shí)別數(shù)據(jù)(Propagated Caller Identities)
在J2EE 1.3中可以選擇用傳播呼叫者識(shí)別數(shù)據(jù)作為web組件和ejb組件呼叫者的識(shí)別數(shù)據(jù)以便進(jìn)行驗(yàn)證。在這種方式下,整個(gè)ejb組件的呼叫鏈中interface EJBContext的方法getCallerPrincipal傳回相同的主體名(principal name)。如果呼叫鏈中的第一個(gè)ejb是被jsp/servlet呼叫的,interface EJBContext的方法getCallerPrincipal傳回的主體名(principal name)應(yīng)與interface HttpServletRequest的方法getUserPrincipal的 傳回值相同。要注意的是在呼叫鏈中傳遞的是使用者的識(shí)別數(shù)據(jù),而不是憑證(credentials),這一點(diǎn)非常重要,因?yàn)樵诤艚墟湹拿總€(gè)節(jié)點(diǎn)上使用者可能使用不同的安全屬性。
Run As Identities
J2EE 1.3中提供了容許組件開發(fā)者和布署這來(lái)指定組件以什么身份執(zhí)行的方法。符合J2EE1.3規(guī)范的產(chǎn)品會(huì)提供將組件設(shè)定成Run As Identities方式的方法。如果Run As Identities方式被選中,在執(zhí)行中被設(shè)定為Run As Identities的組件的呼叫者不再是呼叫鏈中第一個(gè)節(jié)點(diǎn)的呼叫者了,而是在布署時(shí)被指定的呼叫者。而呼叫鏈中隨后節(jié)點(diǎn)的呼叫者也變?yōu)榕c被設(shè)定為Run As Identities的組件的呼叫者相同。
圖四 使用者識(shí)別數(shù)據(jù)傳遞
這一部分介紹了J2EE的安全概念,意在使讀者能夠?qū)2EE在安全方面有一定的了解,后面還會(huì)有應(yīng)用這些概念的具體例子。
J2EE為我們提供了對(duì)于驗(yàn)證和授權(quán)的安全服務(wù),在開發(fā)基于J2EE的應(yīng)用時(shí)應(yīng)該盡可能的使用J2EE為我們提供的這些服務(wù)。因?yàn)榈o有遵循J2EE標(biāo)準(zhǔn),才能使你的應(yīng)用具有良好的移植性、擴(kuò)充性和可維護(hù)性。祇有在所選J2EE產(chǎn)品不能滿足特定的安全需求時(shí),才應(yīng)該考慮使用第三方安全產(chǎn)品或自己開發(fā)安全服務(wù)。
轉(zhuǎn)載于:https://blog.51cto.com/515632/788603
總結(jié)
以上是生活随笔為你收集整理的J2EE 中的安全第一部分 - J2EE安全介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: System Center 2012 P
- 下一篇: linux 下的shell脚本