簡(jiǎn)介: 本文將詳細介紹 IBM WebSphere Application Server V8 在安全方面的新特性,包括審計服務(wù)提供者設置、使用 SAF 進(jìn)行 z/OS 上的分布式實(shí)體映射、安全強化特性、使用 JASPI 實(shí)現定制的認證服務(wù)提供者、對 Java Servlet 3.0 中安全新特性的支持、wsadmin 腳本中對 LTPA 的支持、多安全域、安全配置報告、安全方面的定制屬性、單點(diǎn)登錄的設置、使用 WebSphere Application Server API 實(shí)現基于 LtpaToken2 cookie 的 Web 單點(diǎn)登錄。
概述
安全性是指利用多種技術(shù)來(lái)防止對資源的非法訪(fǎng)問(wèn),是企業(yè)應用系統的一個(gè)關(guān)鍵因素。IBM WebSphere Application Server(后面簡(jiǎn)稱(chēng) WAS)提供了一系列的設施和機制來(lái)保護敏感的 Java 2 平臺、JEE 資源和管理資源,并解決企業(yè)中端到端的安全性需求,如認證、資源的訪(fǎng)問(wèn)控制、數據的完整性、保密性和隱私性、安全的互操作等。WAS 安全基于工業(yè)標準,并且在每個(gè)版本加入了一些新特性,較上一個(gè)版本有功能上的增強和發(fā)展。
本文將詳細介紹 WAS V8 在安全方面的新特性,包括審計服務(wù)提供者設置、使用 SAF 進(jìn)行 z/OS 上的分布式實(shí)體映射、安全強化特性、使用 JASPI 實(shí)現定制的認證服務(wù)提供者、對 Java Servlet 3.0 中安全新特性的支持、wsadmin 腳本中對 LTPA 的支持、多安全域、安全配置報告、安全方面的定制屬性、使用 WAS API 實(shí)現基于 LtpaToken2 cookie 的 Web 單點(diǎn)登錄。
安全新特性詳述
新特性一:審計服務(wù)提供者設置
WAS 提供了對安全設施的審計服務(wù),即報告并跟蹤可審計的事件(包括認證、授權、Principal/Credential 映射、審計策略管理、Delegation 等),來(lái)保證系統的完整性。審計數據首先要通過(guò)審計服務(wù)提供者,然后才能輸出到日志文件中。審計服務(wù)提供者用來(lái)對審計數據進(jìn)行格式化。
當審計日志寫(xiě)滿(mǎn)后,WAS V7 直接將最老的日志文件覆寫(xiě);而在 WAS V8 中,增加了一個(gè)新的設置“Behavior when maximum is reached”,以設置當日志文件寫(xiě)滿(mǎn)后的系統行為。
圖 1. 審計服務(wù)提供者設置
“Behavior when maximum is reached”設置有三個(gè)選項:Overwrite oldest:缺省選項,與 WAS V7 的行為一樣。當審計日志寫(xiě)滿(mǎn)時(shí),最老的審計日志文件會(huì )被覆寫(xiě),并且不會(huì )將這一行為通知給審計人員。
Stop server:審計日志寫(xiě)滿(mǎn)時(shí),不會(huì )覆寫(xiě)老的日志文件,而是停止審計服務(wù),并向 SystemOut.log 發(fā)一個(gè)通知,然后將應用服務(wù)器靜默掉(quiesce,允許處理完已在服務(wù)器中的請求,但不接收新的請求)。
Stop logging:該選項也不會(huì )覆寫(xiě)老的日志文件。當審計日志寫(xiě)滿(mǎn)時(shí),停止審計服務(wù),但是允許應用服務(wù)器繼續工作,并且不會(huì )向 SystemOut.log 發(fā)通知。
如果應用服務(wù)器是由于審計日志寫(xiě)滿(mǎn)而被停掉(Stop server 選項),在重啟該應用服務(wù)器之前,必須先將日志文件存檔。新特性二:使用 SAF 進(jìn)行 z/OS 上的分布式實(shí)體映射
WAS for z/OS 一般使用 SAF 來(lái)進(jìn)行授權。當用戶(hù)存儲庫為非本地操作系統時(shí),需要將外部的用戶(hù)實(shí)體(分布式實(shí)體)映射到 z/OS 本地的 SAF 用戶(hù)。在 WAS V7 及之前的版本中,我們需要使用 JAAS 登錄模塊來(lái)實(shí)現這一映射,這就需要用戶(hù)自己實(shí)現一個(gè) JAAS 登錄模塊,并在 WAS 中做相應配置以使用該登錄模塊,使用起來(lái)非常的不方便。在 WAS V8 中,用戶(hù)可以直接使用 SAF 命令 RACMAP 來(lái)完成該映射,從而省去了用戶(hù)編碼、調試和配置的工作。
為了使用 RACMAP 命令,z/OS 安全產(chǎn)品的版本有一定的要求。SAF 需要 7760 或以上的版本,RACF 需要 z/OS version 1.11 或以上的版本。
在使用 RACMAP 命令前,需要先進(jìn)行激活操作:
/*Activate the IDIDMAP class and enable it for RACLIST processing*/
SETROPTS CLASSACT(IDIDMAP) RACLIST(IDIDMAP)
下面是一個(gè) RACMAP 命令的使用示例,注意 WITHLABEL 最多 32 個(gè)字符:
RACMAP ID(WSADMIN) MAP USERDIDFILTER(NAME('cn=wsadmin,o=ibm')) REGISTRY(NAME('ldapserver.ibm.com:3389')) WITHLABEL('Mapping LDAP wsadmin to WSADMIN')
SETROPTS RACLIST(IDIDMAP) REFRESH
新特性三:安全強化特性
為了增強安全性,WAS V8 修改了一些缺省設置。CSIv2 transport 缺省設置改為“SSL-required”,保證進(jìn)出應用服務(wù)器的 CSIv2 連接都使用了安全的 SSL 連接。
圖 2. CSIv2 inbound transport
圖 3. CSIv2 outbound transport
Cookie 的 HttpOnly 屬性缺省值為 true,以防止客戶(hù)端程序如 Java Script 通過(guò)訪(fǎng)問(wèn) cookie 來(lái)進(jìn)行跨站點(diǎn)腳本攻擊。這一屬性在管理控制臺的兩個(gè)地方設置:
安全定制屬性 com.ibm.ws.security.addHttpOnlyAttributeToCookies 缺省值設為 true,以開(kāi)啟 LTPA cookie 和 session cookie 的 HttpOnly 屬性。在管理控制臺 Security > Global security > Custom properties
圖 4. 安全定制屬性 addHttpOnlyAttributeToCookies
在管理控制臺 Security > Global security > Single sign-on (SSO)。選項“Set security cookies to HTTPOnly to help prevent cross-site scripting attacks”缺省被選中。
圖 5. SSO 設置
集成 session 安全:只有認證過(guò)的用戶(hù)可以訪(fǎng)問(wèn)安全頁(yè)面中創(chuàng )建的 session。具體場(chǎng)景詳見(jiàn)下表:
表 1. Session 安全集成場(chǎng)景
Session ID 的類(lèi)型未認證的 HTTP 請求訪(fǎng)問(wèn)該 session認證身份為“FRED” 的 HTTP 請求訪(fǎng)問(wèn)該 session
請求中沒(méi)有傳入 session ID 或該 ID 指向的 session 已經(jīng)失效創(chuàng )建一個(gè)新的 session,用戶(hù)名為匿名用戶(hù)創(chuàng )建一個(gè)新的 session,用戶(hù)名為 FRED
請求中要訪(fǎng)問(wèn)的 session ID 有效,用戶(hù)名為匿名用戶(hù)返回該 session返回該 session,并將用戶(hù)名改為 FRED
請求中要訪(fǎng)問(wèn)的 session ID 有效,用戶(hù)名為 FRED不會(huì )返回該 session,會(huì )拋出 UnauthorizedSessionRequest-
Exception 異常返回該 session
請求中要訪(fǎng)問(wèn)的 session ID 有效,用戶(hù)名為 BOB不會(huì )返回該 session,會(huì )拋出 UnauthorizedSessionRequest-
Exception 異常不會(huì )返回該 session,會(huì )拋出 UnauthorizedSessionRequest-
Exception 異常
用戶(hù)可以通過(guò)下面的路徑設置 Session 安全集成:
在管理控制臺中,Servers > Server types > WebSphere application servers > <server1> > Session management,選中 Select the security integration。
圖 6. Session 安全集成
新特性四:使用 JASPI 實(shí)現定制的認證服務(wù)提供者
JASPI(或者叫 JASPIC),是 JSR196,Java Authentication SPI for Containers 的縮寫(xiě)。利用該技術(shù)可以實(shí)現我們自己的第三方 security provider,WAS 利用該 security provider 來(lái)處理 web 應用中的 HTTP 請求和響應的 Java EE 認證。
如果應用安全性被開(kāi)啟并使用 JASPI 認證,當 Web 資源(如 servlet 或 JSP 文件)被訪(fǎng)問(wèn),security 運行時(shí)就會(huì )檢查在安全配置中,該 Web 資源是否被映射到了一個(gè) JASPI provider。如果是,則使用該 JASPI provider 來(lái)處理對該 Web 資源的 HTTP 請求和相應的認證。
JSR 196 Java Authentication Service Provider Interface for Containers specification 中定義了 JASPI provider 需要實(shí)現的接口,讀者可以通過(guò)實(shí)現這些接口來(lái)開(kāi)發(fā)自己的 JASPI 認證 provider。
開(kāi)發(fā)完自己的 JASPI provider 后,需要在管理控制臺上對其進(jìn)行配置。
圖 7. 在管理控制臺上配置 JASPI provider
然后將 Web 應用或者 Web 應用模塊與 JASPI provider 進(jìn)行關(guān)聯(lián)。該關(guān)聯(lián)可以在應用安裝時(shí)進(jìn)行或者應用安裝后對應用的配置進(jìn)行修改完成。
圖 8. Web 應用安裝時(shí)進(jìn)行 JASPI provider 關(guān)聯(lián)
圖 9. Web 應用安裝后通過(guò)修改配置完成與 JASPI provider 的關(guān)聯(lián)
新特性五:對 Java Servlet 3.0 中安全新特性的支持
WAS V8 提供了對 Java Servlet 3.0 規范中安全方面新特性的支持,主要包括以下幾個(gè)方面:新的 servlet 安全注釋 @ServletSecurity,提供了訪(fǎng)問(wèn) servlet 是的一些安全方面的限制。
可以通過(guò)方法 setRunAsRole(),declareRoles() 和 setServletSecurity() 來(lái)動(dòng)態(tài)更新 @RunAs,@declareRoles 和 @ServletSecurity servlet 安全注釋的內容。
javax.servlet.http.HttpServletRequest 中新的安全編程接口boolean authenticate(HttpServletResponse response))
login(java.lang.String username, java.lang.String password)
logout()
新的安全定制屬性 com.ibm.websphere.security.displayRealm。如果在 web.xml 中沒(méi)有指定域名,該屬性指明了在 basic 登錄窗口上是否顯示域名。
如果該屬性值設為 false,即缺省設置,則顯示域名為 Default Realm。
如果該屬性值設為 true,當使用 LTPA 認證機制是,顯示 user registry 域名;當時(shí)有 Kerberos 認證機制是,顯示 Kerberos 域名。
新特性六:wsadmin 腳本中對 LTPA 的支持
在 WAS V8 以前,LTPA key 的導入導出都是通過(guò)管理控制臺完成的,從 WAS V8 開(kāi)始,我們可以使用 Jython 或 Jacl 腳本來(lái)進(jìn)行 LTPA key 的導入導出。
importLTPAKeys 命令用來(lái)將 LTPA key 從文件中導入并添加到安全配置和運行時(shí)中。exportLTPAKeys 命令將當前運行時(shí)中使用的 LTPA key 導出到文件中。
下面是兩個(gè)命令的使用方法:
importLTPAKeys
Jacl:wsadmin> $AdminTask importLTPAKeys {-ltpaKeyFile file:\temp\ltpa.key -password keypassword }
Jython:wsadmin> AdminTask.importLTPAKeys('[-ltpaKeyFile file:\temp\ltpa.key -password keypassword ]')
exportLTAPKeys
Jacl: wsadmin> $AdminTask exportLTPAKeys {-ltpaKeyFile file:\temp\writeltpa.key -password keypassword }
Jython: wsadmin> AdminTask.exportLTPAKeys('[-ltpaKeyFile file:\temp\writeltpa.key -password keypassword ]')
新特性七:多安全域
在 WAS V7 中,federated repositories 用戶(hù)存儲庫只能在全局安全級別上配置,并且每個(gè) cell 只能有一個(gè)實(shí)例,其他的安全域只能對其進(jìn)行引用,作為自己的活動(dòng)存儲庫。在 WAS V8 中,我們可以在每個(gè)安全域中配置一個(gè)唯一的 federated repository 實(shí)例。當某個(gè)安全域是從全局安全或者其他安全域復制過(guò)來(lái)的,復制源中定義的用戶(hù)和組都會(huì )被復制過(guò)來(lái)。
新特性八:安全配置報告
WAS 管理控制臺中提供了安全配置報告的功能,用來(lái)收集和展示當前應用服務(wù)器的安全設置。收集的信息包括核心安全設置、管理員用戶(hù)和組、CORBA naming roles 以及 cookie 保護等信息。從 WAS V8 開(kāi)始,安全配置報告新增加了關(guān)于 session 安全、web 屬性和 HttpOnly 設置的信息,使得報告信息更加完整。
用戶(hù)可以在管理控制臺上通過(guò)下面的路徑獲取當前應用服務(wù)器的安全配置報告:
Security > Global Security > Security Configuration Report
新特性九:安全方面的定制屬性
WAS V8 中,安全定制屬性 com.ibm.CSI.propagateFirstCallerOnly 的缺省值由以前的 false 改為了 true。當該屬性的值設為 true,并且安全屬性傳播被開(kāi)啟時(shí),當前線(xiàn)程的傳播令牌中,只有第一個(gè)調用者被記錄,因此不允許更改調用者列表(調用者列表中只有第一個(gè)調用者),也就避免了創(chuàng )建多個(gè)會(huì )話(huà)。當該屬性值設為 false 時(shí),調用者列表中會(huì )記錄所有切換的用戶(hù),這樣會(huì )對性能造成一定的影響。實(shí)際上,一般只對第一個(gè)調用者感興趣。
用戶(hù)可以通過(guò)管理控制臺Security > Global Security > Custom properties 來(lái)對該屬性進(jìn)行設置。
新特性十:使用 WAS API 實(shí)現基于 LtpaToken2 cookie 的 Web 單點(diǎn)登錄
WAS V8 中提供了新的 LTPA Cookie API,使得應用開(kāi)發(fā)人員可以通過(guò)編程的方式實(shí)現 downstream 單點(diǎn)登錄,而不需要應用本身來(lái)存儲和發(fā)送用戶(hù)憑據。一般來(lái)說(shuō),服務(wù)器產(chǎn)生的認證信息會(huì )通過(guò) cookie 發(fā)送給瀏覽器,通過(guò)將該 cookie 傳遞給下游的其他服務(wù)器,就可以完成傳播用戶(hù)認證信息的功能。這樣用戶(hù)在請求下游其他的服務(wù)器時(shí),就不用再次輸入用戶(hù)認證信息了,實(shí)現了單點(diǎn)登錄。
圖 10. LTPA Cookie API 下游認證流程圖
下面的代碼演示了如何使用 LtpaCookie 實(shí)現 Web 單點(diǎn)登錄。首先,從 SSOToken 中獲取 LTPACookie,然后將該 Cookie 放入請求頭部即可。
清單 1. 使用 LtpaCookie 實(shí)現 Web 單點(diǎn)登錄
Cookie ltpaCookie = WSSecurityHelper.getLTPACookieFromSSOToken();HttpMethod method =.; //new your HttpMethod based on the target URLif (ltpaCookie != null) method.setRequestHeader(“Cookie”, ltpaCookie.getName()+”=”+ltpaCookie.getValue());
總結
本文詳細介紹了 WAS V8 在安全方面的新特性,包括審計服務(wù)提供者設置、使用 SAF 進(jìn)行 z/OS 上的分布式實(shí)體映射、安全強化特性、使用 JASPI 實(shí)現定制的認證服務(wù)提供者、對 Java Servlet 3.0 中安全新特性的支持、wsadmin 腳本中對 LTPA 的支持、多安全域、安全配置報告、安全方面的定制屬性、使用 WAS API 實(shí)現基于 LtpaToken2 cookie 的 Web 單點(diǎn)登錄。希望對讀者使用 WAS V8 時(shí)有幫助。