摘要:應用程序安全是一個綜合性的課題,它需要在權衡各方面的因素之后,再作出安全策略。因此,本文研究了 Java 應用程序安全,分析了 Java 平臺自身的安全體系結構,并且還說明了安全策略的具體實施辦法。通過本文的分析,使我們不但從總體上對 Java 應用程序的安全體系有比較清晰的認識,而且對安全思想也有比較深入的分析和理解。
關鍵詞:JAVA;安全體系;安全策略
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)27-1943-01
1 JAVA 安全體系結構
Java 的安全模型是由安全策略、訪問許可、保護域、訪問控制檢查、權限操作以及類加載和解析等部分組成。安全策略和訪問許可定義了哪些動作是允許的,而保護域和訪問控制檢查則提供了執行的功能,權限操作、類加載和解析則對整個保護機制是很有幫助的。
因此,Java2 安全體系結構的優勢體現在以下幾方面:
1) 安全策略的內容和安全機制的實現徹底分開,也和安全接口分離開來,這為以后的升級和發展提供了最大的空間。它讓策略配置和運行時環境完全分離開來,從而減少系統管理的復雜性。
2) 訪問控制算法和其檢查許可語義清晰地分離開來。與此同時,訪問控制許可既能靜態表示也能動態表示,并且每個許可權限類可以定義它自己的語義。
3) 安全類加載機制和委托機制擴展了 Java 應用程序安全覆蓋,這就使得對于所有 Java 代碼,不管它們來自哪里以及狀態如何,都采用了統一的安全體系結構和策略。
2 安全策略
Java 運行時環境的安全行為由安全策略來指定,安全策略是一個典型的訪問控制矩陣,即什么樣的系統資源、用哪種形式、在哪些環境下可以被訪問。一個安全策略是從描述運行代碼的一系列特征到代碼允許的訪問許可權限之間的映射。
2.1 許可權限
許可權限(Permissions)描述了系統資源和系統資源所支持的操作,每個許可權限有一個名字,也有一個操作列表,如:名字為“/resourec/temp.txt”,操作為“read”,表明文件/resourec/temp.txt的讀權限。許可權限被用于指定一個策略所允許的訪問資源,同時又表明在運行時進行安全敏感操作前需要什么樣的許可權限。如果安全策略中有權限,就可以說授予了權限,如果沒有權限則意味著權限的拒絕。
許可權限類(Permission)的根類是java.security.Permission,這是一個抽象類,它的子類用來代表特定的訪問控制。新的許可權限或者是 Permission 類的子類,或者是它的子類的子類。
常見的許可權限類有:BasicPermission類、AllPermission類以及UnresolvedPermission 類。BasicPermission類也是一個抽象類,它的操作只能由它的子類來實現。AllPermission 類用來描述所有的許可權限,它隱含所有的許可權限,而且,任意兩個 AllPermission 對象總是被認為相等的。另外UnresolvedPermission 類用來控制“未決的(unresolved)”許可權限,但系統從不認為一個 UnresolvedPermission 隱含有另一個許可權限。最后,為了能一次處理多個許可權限,定義了特定類型許可權限集合(PermissionCollection),從而,對同類型的多個 Permission 對象一次處理。
2.2 保護域
保護域(ProtectionDomain)是當前 Java 安全模型的核心概念,它提供了更加細粒度的安全控制。這里的域指的是操作環境中要保護的部分,是用來對組件分組或對被保護資源分組的一個抽象概念,它將具有同樣權限的類歸在一個組里面。在安全策略中定義了保護域,但它實際上是將各種技術、API和基本的Java體系結構組合在一起保護應用程序的集合。
在 Java 的安全體系結構中將保護域分為系統保護域與應用保護域。前者對文件系統或網絡套接字(socket)等系統資源的訪問加以控制。而后者對各種組件或應用程序某部分的訪問進行控制,它是針對具體應用程序的。應用保護域涉及到商業邏輯的執行,允許應用程序代碼中敏感部分的執行,從而常常與商業應用的安全規則密切相關。應用保護域使用應用安全(例如,使用 AS 包或 J2EE 的容器管理安全機制)增強了當前的安全策略。然而,應用安全通常使用定制的權限來限制對特權代碼的訪問。通過 BasicPermission 的子類可以創建這些定制權限,這些權限和對這些權限進行檢查的代碼一起用于建立應用保護域。
2.3 策略配置
可以為 Java 應用程序配置三種類型的安全策略文件:系統安全策略文件、放有用戶根目錄下的用戶策略文件,以及應用程序選擇加載的應用安全策略文件。
(下轉第1949頁)
(上接第1943頁)
安全策略文件指定了允許從特定代碼來源和所有人的代碼訪問許可權限,這些許可權限主要指系統資源訪問的類型。為了能讓一個程序獲得安全運行的許可權,比如讀寫一個文件,它必須被授予這個特定動作的權限。當采用默認的Policy實現時,必須在許可文件中通過許可條目來授予其權限。由默認 Policy 實現讀取的策略配置文件的語法包括一個條目表。
3 執行安全策略
安全策略執行環境由SecurityManager、AccessControlContext、DomainCombiner和AccessController四個類構成。
3.1 SecurityManager類
Java.lang.SecurityManager 從 JDK1.0 中引入,它是訪問控制的關鍵。當需要決定是否授予或者拒絕安全敏感資源的訪問時,都要調用安全管理器(SecurityManager)。Sun.applet.AppletSecurity 類是 SecurityManager 類的一個例子,也是 SecurityManager 類的子例,它實現了 JDK1.0 版本中的砂盒安全模型。根據這一模型,本地文件系統上的應用程序類具有所有的系統訪問權,而 applets(即通過網絡加載的遠程類)除了具有特殊授予權限之外全部會被拒絕。
3.2 AccessControlContext 類
AccessControlContext 依據其所封裝的上下文來決定對系統資源的訪問,它封裝了一個上下文及一個與 AccessController 類中的 checkPermission 方法等價的 checkPermission 方 法。不同之處在于,AccessController 類 中 的checkPermission 方法根據自身所封裝的上下文而不是當前執行線程的上下文來作出訪問決策。因此,AccessControlContext 是專門針對那些應該給定上下文內進行安全檢查,卻需要從其它上下文中執行的情況,例如在工作者線程內。
3.3 DomainCombiner 類
java.Security.DomainCombiner 接口使得外來執行類可以增加并動態升級與當前 AccessControlContext有關的ProtectionDomain,它還增加了對AccessControlContext和AccessController的更改,以支持基于身份(principal)的訪問控制。
3.4 AccessController 類
java.security.AccessController作為訪問控制算法的一個完整默認實現,具有足夠的通用性,可以為大多數應用程序所使用。開發者可以自由地使用它的實現方式,而且用戶也可以獲得跨不同應用程序和平臺的相互兼容的行為。AccessController 中定義的默認 checkPermission 方法調用 SecurityManager 的checkPermission 方法,然后 SecurityManager 委托 AccessController 進行安全決策。
4 結束語
人們從很多安全事件和專家的警告中,漸漸地認識到應用程序安全性的重要性。現在,它也成為信息安全中的一個重要課題,成為大家關注的一個焦點。本文對 Java 應用程序安全性進行了深入的研究和探討,介紹了Java自身的安全機制,對Java應用程序安全性進行了分析和研討。Java 通過安全策略保證應用程序在自身的平臺上安全運行。
參考文獻:
[1] Marc Fleury, Scott Stark, Norman Richards. JBoss 4.0 The Office Guide[M]. 劉凡,賈順林,鄧一凡,譯. 北京:電子工業出版社,2006.
[2] Art Taylor, Randy Layman, Brian Buege. Haking Exposed J2EE Java[M]. 張偉,張華平,趙金東,譯. 北京:清華大學出版社,2003.
[3] Rima Patel Sriganesh, Gerald Brose.Mastering Enterprise JavaBeans[M]. Third Edition,羅時飛,譯. 北京:電子工業出版社,2005.
[4] Mary Hall, Larry Brown.Core Servlets and JavaServer Pages[M]. Second Edition. 趙學良,譯. 北京:清華大學出版社,2004.