安全是所有Web項目在設(shè)計時都要考慮的一個重要因素。無論是選擇最短口令,決定何時使用SSL加密HTTP會話,還是通過自動登錄cookie來識別用戶,都經(jīng)常要付出重大的設(shè)計努力,以保護(hù)用戶的身份信息和他們可能存放于Web站點(diǎn)的其他資料。糟糕的安全性可能帶來公關(guān)災(zāi)難。當(dāng)最終用戶努力保持對其個人信息的控制時,他們要面臨令人迷惑的隱私政策,需要牢記眾多站點(diǎn)的不同口令,以及遭遇“釣魚式攻擊”事件。
在宏觀層次上,數(shù)字身份引起了許多復(fù)雜的技術(shù)和社會問題,業(yè)界一些團(tuán)體如Liberty Alliance和IdentityGang都正試圖通過開發(fā)新的技術(shù)標(biāo)準(zhǔn)來解決它們。 在較小的規(guī)模上,可以使用一些工具來為用戶提供更好的安全性。請考慮口令管理問題。用戶訪問他們保存?zhèn)€人資料的Web站點(diǎn),在可以存取他們的資料之前必須經(jīng)過驗(yàn)證。通過驗(yàn)證來鑒別用戶,確保他們是所聲稱的用戶。進(jìn)行驗(yàn)證最簡單方式是使用口令。然而,若每個站點(diǎn)都需要各自的一套口令,用戶將有難以控制的大量口令。1998年微軟首先嘗試通過其Passport network提供該問題的全球解決方案。Passport使得任意Web站點(diǎn)使用用戶提交給Passport的個人資料(如用戶名、地址、信用卡號)成為可能。Passport是單點(diǎn)登錄(single sign-on,SSO)的第一次電子商務(wù)嘗試。它沒有流行起來,部分原因是由于人們對系統(tǒng)封閉性的擔(dān)心。然而,SSO的理念非常引人注目,許多開放標(biāo)準(zhǔn)和商業(yè)計劃都追隨Passport其后。通過SSO,某個Web站點(diǎn)可以與其他站點(diǎn)共享用戶身份信息。
SSO對于使用應(yīng)用服務(wù)提供商(Application Service Provider,ASP)軟件服務(wù)的企業(yè)特別有用。ASP在自己的服務(wù)器上宿主應(yīng)用程序,出售其訪問權(quán)作為服務(wù)。公司可以在它的標(biāo)準(zhǔn)目錄服務(wù)器里管理自己的用戶和口令,然后通過SSO授予用戶訪問ASP應(yīng)用程序的權(quán)限。SSO允許公司管理自己用戶的信息,不必為每一員工維護(hù)多個用戶賬號。對用戶來說,SSO的好處在于他們可以在多個應(yīng)用程序中使用一個用戶名和口令,并且在應(yīng)用程序之間切換時無需重新驗(yàn)證。SSO不僅僅用于Web應(yīng)用程序,它可用于任何類型的應(yīng)用程序,只要有安全地傳送身份信息的協(xié)議。這種通信方式的開放標(biāo)準(zhǔn)就是安全性斷言標(biāo)記語言(SAML)。
關(guān)于SAML
SAML為SSO提供了一個安全的協(xié)議。SAML(讀作“sam-ell”)是允許Web站點(diǎn)安全地共享身份信息的一個規(guī)范,它來自ebXML和其他XML標(biāo)準(zhǔn)背后的國際性聯(lián)盟OASIS。站點(diǎn)使用SAML的XML詞匯表和請求/應(yīng)答模式,通過HTTP交換身份信息。這種信息共享標(biāo)準(zhǔn)化能幫助Web站點(diǎn)與多個合作伙伴集成,避免由于為不同合作伙伴設(shè)計和維護(hù)各自私有的集成通道而引起的爭論。SAML1.0于2002年11月亮相。本文介紹最終于2003年完成的SAML1.1。雖然于2005年完成的SAML 2.0引入了支持身份聯(lián)邦的一些重要新功能,但BEA WebLogic Server 9.x支持的是SAML1.1,因此本文將重點(diǎn)介紹SAML1.1。
一個基本的SAML示例
我們來看一個非?;镜腟AML示例。顧名思義,SAML的核心元素是安全性斷言。斷言即無需證明的語句。安全性斷言是關(guān)于用戶身份的語句,只能通過接收斷言發(fā)布者的站點(diǎn)信任獲得支持。在SAML中,發(fā)布斷言的站點(diǎn)叫“發(fā)布者”、“斷言方”、或“源站點(diǎn)”。接收斷言并信任它們的站點(diǎn)叫“信任方”或“目標(biāo)站點(diǎn)”。
在本示例場景中,用戶使用用戶名和口令登錄源站點(diǎn)。然后,用戶希望無需再次驗(yàn)證即可訪問目標(biāo)站點(diǎn)。圖1顯示了源站點(diǎn)和目標(biāo)站點(diǎn)之間能使用戶通過單點(diǎn)登錄訪問雙方站點(diǎn)的交互。
<!-- This request would be wrapped in a SOAP envelope --> <samlp:Request xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" MajorVersion="1" MinorVersion="1" RequestID="_216.27.61.137.103896224111" IssueInstant="2005-03-19T17:04:21.022Z"> <samlp:AssertionArtifact> AAGZE1RNQJEFzYNCGAGPjWvtDIRSZ4 </samlp:AssertionArtifact> </samlp:Request> |
該請求把自己標(biāo)識為來自SAML請求-應(yīng)答協(xié)議名稱空間的SAML 1.1請求(MajorVersion和MinorVersion)。SAML為請求-應(yīng)答協(xié)議元素定義了一個名稱空間,為斷言定義了另一個單獨(dú)的名稱空間。Request擁有基于請求者IP地址的惟一ID。請求的準(zhǔn)確時間也包括在內(nèi)。
該請求中最有趣的部分是標(biāo)記中令人費(fèi)解的字符串。目標(biāo)站點(diǎn)從用戶HTTP請求的查詢字符串中得到該值。由于它用于標(biāo)識瀏覽器,所以也叫“瀏覽器憑證”。注意,該請求沒有要求提交特定用戶的驗(yàn)證。該請求創(chuàng)建時,目標(biāo)方并沒有用于提交請求的用戶名。該信息將在應(yīng)答中得到。瀏覽器憑證告訴可能正在同時向目標(biāo)站點(diǎn)發(fā)送很多用戶的源站點(diǎn),應(yīng)該在此應(yīng)答中發(fā)送哪個用戶的斷言。下面是一個應(yīng)答示例:
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0protocol" ResponseID="huGxcDQc4cNdDyocphmi6CxEMngaÓ InResponseTo="_216.27.61.137.103896224111"? MajorVersion="1" MinorVersion="1" IssueInstant="2004-06-19T17:05:37.795Z"> <samlp:Status> <samlp:StatusCode Value="samlp:Success" /> </samlp:Status> <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" MajorVersion="1" MinorVersion="1" AssertionID="buGxcG4gILg5NlocyLccDz6iXrUa" Issuer="www.example.com" IssueInstant="2004-06-19T17:05:37.795Z"> <saml:Conditions NotBefore="2004-06-19T17:00:37.795Z" NotOnOrAfter="2004-06-19T17:10:37.795Z"/> <saml:AuthenticationStatement AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password" AuthenticationInstant="2004-06-19T17:05:17.706Z"> <saml:Subject> <saml:NameIdentifier>JSmith</saml:NameIdentifier> <saml:SubjectConfirmation> <saml:ConfirmationMethod> urn:oasis:names:tc:SAML:1.0:cm:artifact-01 </saml:ConfirmationMethod> </saml:SubjectConfirmation> </saml:Subject> </saml:AuthenticationStatement> </saml:Assertion> </samlp:Response> |
假設(shè)源站點(diǎn)是JSmith的老板MegaBank。JSmith使用他在MegaBank的賬號訪問他工作必需的三個不同外部宿主的應(yīng)用程序。一天,MegaBank雇傭的安全顧問建議在JSmith所在部門啟用指紋驗(yàn)證。如果沒有SSO和SAML,MegaBank就必須到三個應(yīng)用程序提供商那里請求他們支持指紋驗(yàn)證。應(yīng)用程序提供商不得不權(quán)衡提供該支持的成本和不提供該支持可能丟失客戶的風(fēng)險。MegaBank可能必須等待提供商發(fā)布他們軟件的新版本,所有的改動或許將昂貴又費(fèi)時。通過SAML,MegaBank只需改變自己的驗(yàn)證過程,在JSmith和其同事登錄時檢查指紋即可。作為SAML目標(biāo)站點(diǎn)的宿主應(yīng)用程序無需清楚在MegaBank所做的更改,因?yàn)榈讓拥腟AML斷言是保持不變的。
使用SAML對用戶Web站點(diǎn)或Web服務(wù)的設(shè)計與實(shí)現(xiàn)有一些影響,但僅限于在處理Web窗口中的用戶名和口令時,或在處理方法簽名時。例如,下面的Web services API方法不能與SAML很好地協(xié)同工作:
public void makeSomeSystemChange(String username, String password, String[] params); |
該方法假設(shè)用戶能夠提供用戶名和口令。如果Web服務(wù)的宿主是SAML目標(biāo)站點(diǎn),就沒有Web服務(wù)實(shí)現(xiàn)可以驗(yàn)證的口令。有少數(shù)方式可以改進(jìn)或擴(kuò)展這些接口,使其與SAML協(xié)同工作,這取決于所需的向后兼容性的水平。同樣,如果在Web頁包含了具有用戶名和口令字段的表單,那么為經(jīng)過SAML驗(yàn)證的用戶禁用口令字段是非常重要的。
安全的SAML
由于SAML在兩個擁有共享用戶的站點(diǎn)間建立了信任關(guān)系,所以安全性是需考慮的一個非常重要的因素。SAML中的安全弱點(diǎn)可能危及用戶在目標(biāo)站點(diǎn)的個人信息。SAML依靠一批制定完善的安全標(biāo)準(zhǔn),包括SSL和X.509,來保護(hù)SAML源站點(diǎn)和目標(biāo)站點(diǎn)之間通信的安全。源站點(diǎn)和目標(biāo)站點(diǎn)之間的所有通信都經(jīng)過了加密。為確保參與SAML交互的雙方站點(diǎn)都能驗(yàn)證對方的身份,還使用了證書。
BEA WebLogic Server中的SAML
BEA WebLogic Server 9.0是第一個包含了對SAML支持的WebLogic Server版本。WebLogic Server 9.1中進(jìn)一步加強(qiáng)了對SAML的支持。WebLogic Server把SAML作為WebLogic Security Service的一部分使用。SAML用來為WebLogic Web services和跨WebLogic域共享驗(yàn)證信息提供SSO支持。除SAML外,WebLogic Server也為Windows桌面SSO支持Simple and Protected Negotiate (SPNEGO)協(xié)議。SAML可用來提供訪問Web應(yīng)用程序和Web service的權(quán)限。
對于一些應(yīng)用程序,您僅需付出很少甚至無需付出額外的程序設(shè)計努力,就能使用WebLogic Server中的SAML支持。如果用戶應(yīng)用程序使用配置為WebLogic 安全域一部分的安全設(shè)置,那么集成SAML是一個首要的系統(tǒng)管理任務(wù)。WebLogic server可配置作為SAML源站點(diǎn)或SAML目標(biāo)站點(diǎn)。要使服務(wù)器成為SAML源站點(diǎn),需配置一個SAML Credential Mapper。要使服務(wù)器成為SAML目標(biāo)站點(diǎn),需配置一個SAML Identity Asserter.
如果用戶應(yīng)用程序安全模式為與WebLogic Security Service進(jìn)行交互,包含了自己的特定于WebLogic的代碼,可以使用WebLogic的SAML API把該定制擴(kuò)展到SAML。該API提供對WebLogic SAML服務(wù)主要組件的編程式訪問。用戶可以使用應(yīng)用程序自身的業(yè)務(wù)邏輯來擴(kuò)展諸如SAMLCredentialNameMapper和SAMLIdentityAssertionNameMapper這樣的類。一旦用戶有了自己的定制類,WebLogic管理控制臺就允許用戶配置其SAML Credential Mapper(源站點(diǎn))或SAML Identity Asserter(目標(biāo)站點(diǎn)),以便使用那些類。惟一的要求是用戶的定制類需要在系統(tǒng)類路徑中,非常類似于WebLogic啟動類,這可能對用戶部署策略產(chǎn)生影響。
最后,如果應(yīng)用程序安全模式完全獨(dú)立于WebLogic Security Service,用戶將不能從WebLogic的SAML工具中獲益。用戶要使其應(yīng)用程序支持SAML就需要做更多工作,要么實(shí)現(xiàn)WebLogic所提供的某些服務(wù)的簡化版本,要么集成那些服務(wù)的第三方版本。但是,用戶仍將受益于可在任何J2EE應(yīng)用服務(wù)器或在如Tomcat這樣的Java Web服務(wù)器應(yīng)用程序上使用SAML。有商業(yè)和開源的SAML支持可供選擇。開源的選擇中有OpenSAML和相關(guān)的Shibboleth項目。OpenSAML是一個SAML工具包,可用來建立用戶自己的SAML源站點(diǎn)和目標(biāo)站點(diǎn)。Shibboleth更進(jìn)一步,它提供了一個構(gòu)建在OpenSAML之上的“基于SAML 1.1的跨域Web單點(diǎn)登錄平臺”。SourceID為Java 和.NET中的SAML 1.1提供了一套開源工具包。在Apache項目下沒有完整的SAML工具包,但WSS4J項目包含了對OpenSAML的一些支持。
結(jié)束語
SAML對企業(yè)應(yīng)用程序開發(fā)越來越重要。隨著大公司內(nèi)部系統(tǒng)的不斷擴(kuò)展,合并身份信息對系統(tǒng)的成功管理來說非常關(guān)鍵。SAML也為依賴外部宿主應(yīng)用程序的企業(yè)提供了巨大好處。對最終用戶來說,單點(diǎn)登錄能同時提供安全性和便利性。WebLogic Server 9.x的SAML支持是對WebLogic Security Service最重要的新補(bǔ)充之一。無論它是否為用戶應(yīng)用程序安全模式的一部分,用戶都有許多選擇以使其應(yīng)用程序與SAML協(xié)同工作。