国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

探索Java應(yīng)用程序的安全需求

2019-11-17 05:59:15
字體:
供稿:網(wǎng)友

  我們知道,維護(hù)應(yīng)用程序的安全并不簡單。不過我們也清楚,完全可以采取一些措施來緩解安全缺陷帶來的風(fēng)險。假如我們是網(wǎng)絡(luò)工程師,就可以將精力投入網(wǎng)絡(luò)分區(qū)和包過濾器方面的知識。假如用C語言編程,我們就保護(hù)程序以防止緩沖區(qū)溢出。 假如用java編程,我們就考慮在安全治理器的保護(hù)之下運行應(yīng)用程序。每種情況下,我們都用最佳實踐中獲得的知識來戰(zhàn)勝無意造成的系統(tǒng)故障。

  Java應(yīng)用程序的安全條款,是本文所討論內(nèi)容的依據(jù)。我們的討論把重點放在Java安全治理器方面,這是Java安全架構(gòu)主題中的一個很小的子集。

  安全治理器是 java.lang.SecurityManager類或擴展自該類的一個類,且它在運行時檢查某些應(yīng)用程序操作的權(quán)限。一旦受到安全治理器的控制,應(yīng)用程序就只能執(zhí)行那些由相關(guān)安全策略非凡準(zhǔn)許的操作。默認(rèn)情況下,該策略是在純文本 策略文件 中指定的。所涉及的操作包括:將文件寫入特定目錄、寫協(xié)同屬性、建立到特定主機的網(wǎng)絡(luò)連接,這里列出的只是其中的一小部分。僅用一個簡單的JVM命令行選項即可迫使Java應(yīng)用程序在一個安全治理器下運行,而且安全策略文件可以由任何文本編輯器輕松創(chuàng)建。

  雖然編輯這樣一個安全策略文件并添加各種相關(guān)規(guī)則并不難,不過獲得策略制訂權(quán)會更具有挑戰(zhàn)性。而且盡管沒人可以為我們提供這樣的策略制訂權(quán),但工具能幫助我們理解那個策略應(yīng)該是什么。開發(fā)并使用這樣的工具是我們即將著手的工作。一旦我們有了它所發(fā)現(xiàn)的更寬泛、更細(xì)粒度的策略,就可以在開發(fā)產(chǎn)品運行時策略時將其作為起點,或者為了更好地理解和熟悉應(yīng)用程序的安全需求而研究它。

  本文的核心代碼是一個通用的安全治理器,要使用它就需要有Sun的JSE 5 JVM。 為了從特定的Java系統(tǒng)類中獲得私有成員數(shù)據(jù),從安全治理器對Java Reflecition API的依靠性中派生JSE 5(Java Standard Edition)的需求。由于缺乏對治理器運行所需的某有成員數(shù)據(jù)的公共訪問,因而需要使用Reflection API。使用私有成員反射的后果就是治理器與其運行所在的的JVM內(nèi)部緊密相關(guān)。但這算不上什么嚴(yán)重的后果,因為治理器是一個開發(fā)工具,而不是產(chǎn)品組件。一旦治理器提出一個策略制訂起點,我們就可以采用那個策略,并在任何現(xiàn)代JVM上運行遵從它的應(yīng)用程序。

默認(rèn)Java安全治理器

  現(xiàn)代文獻(xiàn)中所編寫、討論及引用的絕大多數(shù)Java代碼都代表著在不受安全治理器限制的情況下運行的應(yīng)用程序。因而這種應(yīng)用程序?qū)λ械臋C器資源包括磁盤、網(wǎng)絡(luò)和應(yīng)用程序關(guān)閉等有完全訪權(quán)限。不過這種寬泛的訪問權(quán)限很輕易受到限制。僅通過在JVM命令行上設(shè)置Djava.security.manager 選項,就可以迫使應(yīng)用程序在默認(rèn)的Java安全治理器下運行。

  看一下下面這個簡單的應(yīng)用程序,其目的是讀取和打印用戶的主目錄

public class PRintHome {   public static void main(String[] argv) {      System.out.println(System.getProperty("user.home"));   }}

  編譯代碼,并讓它在默認(rèn)安全治理器的限制下運行

$ cd $HOME/Projects/CustomSecurityManager$ javac PrintHome.java$ java -Djava.security.manager PrintHomeException in thread "main" java.security.accessControlException: access denied (java.util.PropertyPermission user.home read)...at PrintHome.main(PrintHome.java:5)

  上面的應(yīng)用程序中未能獲得并打印 user.home屬性,而且出于代碼可讀性方面的考慮,我們省略了棧跟蹤中的絕大部分。該應(yīng)用程序未能執(zhí)行是因為隨著缺省安全策略運行的缺省安全治理器禁止訪問user.home屬性。這個特權(quán)必須在運行策略文件中具體給出。

  創(chuàng)建一個包含單一規(guī)則的策略文件policy.txt

grant codeBase "file:/home/cid/Projects/CustomSecurityManager/"{   permission java.util.PropertyPermission "user.home", "read";

  重新運行該應(yīng)用程序,對策略文件的引用解決了對user.home的讀訪問問題

$ java -Djava.security.policy=policy.txt -Djava.security.manager PrintHome /home/cid

  注重到,我們通過設(shè)置系統(tǒng)屬性java.security.policy=policy.txt來將JVM引用到策略文件中。我們還假定PrintHome類位于/home/cid/Projects/CustomSecurityManager目錄中。policy.txt 文件中的規(guī)則答應(yīng)任何包含在那個目錄中文件的代碼去讀取系統(tǒng)屬性user.home。結(jié)果,規(guī)則答應(yīng)PrintHome像預(yù)期的那樣運行。包含代碼的文件就稱其為代碼庫。因此代碼庫就是一個類文件或jar文件

安全策略剖析工具:ProfilingSecurityManager

  正如我們前面提到的,創(chuàng)建一個安全策略文件并不難,即使像 策略池 這樣的實用工具可提供協(xié)助。而且在策略文件中答應(yīng)有很強大的 語法快捷方式,它答應(yīng)創(chuàng)建有表現(xiàn)力的、高效的規(guī)則。使用這種高級規(guī)則符號,我們可以指定,比如說,遞歸引用整個目錄樹的代碼庫URL。這種遞歸 URL 規(guī)范不僅非常有用、方便,而且能夠向代碼閱讀者屏蔽掉應(yīng)用程序?qū)Y源需求的真實、細(xì)粒度的深度。這正是我們尋求的細(xì)節(jié)。

  因此我們的目標(biāo)是雙方面的:首先,我們希望在安全策略的限制下運行應(yīng)用程序,或者至少說,我們希望確定該應(yīng)用程序的安全需求。其次,我們需要一種程序性的方法來確定那些需求。

  帶著這些目標(biāo),我們來介紹定制的安全治理器secmgr.ProfilingSecurityManager。這個類擴展了java.lang.SecurityManager,但未實施本文至此所討論的安全策略。不過,據(jù)說它會實施此類安全策略假如應(yīng)用程序可以獲得在運行時訪問它所請求的一切內(nèi)容的權(quán)利。那么我們可接受這種說法,將其轉(zhuǎn)換成運行時安全策略的起點。這樣一來,我們的兩個目標(biāo)就都可以實現(xiàn)。

  為了使用ProfilingSecurityManager,首先編譯并有策略地將其放在自己的jar文件中(源代碼可以在 資源 這一節(jié)找到)。單獨將ProfilingSecurityManager放到它自己的jar文件中將答應(yīng)我們過濾并取消由一些源于它自己jar文件代碼庫的活動所產(chǎn)生的輸出規(guī)則。ProfilingSecurityManager通過以下代碼可以知道自己獨有的代碼庫,

if( url.toString().equals(thisCodeSourceURLString) ) {   return null;}

  從而可以避免自身報告。同時編譯該工具,并將其制成 jar:

$ mkdir -p classes lib$ rm -rf classes/* lib/*$ javac -d classes ProfilingSecurityManager.java$ jar cf lib/psm.jar -C classes secmgr/manager$ rm -rf classes/secmgr/manager

  在我們繼續(xù)講下去之前,應(yīng)該講一下如何激活ProfilingSecurityManager ,使之成為應(yīng)用程序安全治理器。回想前面,我們通過設(shè)置一個無對應(yīng)屬性值的系統(tǒng)屬性Djava.security.manager來促使應(yīng)用程序在缺省的Java安全治理器限制下運行。我們需要進(jìn)一步推廣這種措施,并通過給系統(tǒng)屬性賦值將定制安全治理器指定為安全治理器:Djava.security.manager=secmgr.ProfingSecurityManager。因此被激活之后,ProfilingSecurityManager將寫入System.out,策略文件中需要的這些規(guī)則答應(yīng)應(yīng)用程序在無需拋出安全違反異常的情況下運行。然而,這些規(guī)則不能被處理成最終可用的形式,直到應(yīng)用程序在ProfilingSecurityManager下完成其運行為止。為什么呢?因為我們知道僅在那時應(yīng)用程序才完成了以檢查資源為目的的請求訪問。所以為了使應(yīng)用程序在ProfilingSecurityManager下完成運行時處理并整理這些規(guī)則,我們提供了一個簡單的Perl腳本parsecodebase.pl(見 示例代碼),以便以易于閱讀的格式聚集、格式化、輸出由代碼庫分類并組合的規(guī)則。

  好了,我們現(xiàn)在用指定為安全治理器的ProfilingSecurityManager 和由parsecodebase.pl處理的規(guī)則輸出來運行簡單的 PrintHome 程序,會產(chǎn)生如下結(jié)果:

$ java -cp .:lib/psm.jar -Djava.security.manager=secmgr.ProfilingSecurityManager


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 青川县| 岳阳市| 海原县| 册亨县| 双桥区| 河北区| 安宁市| 宁陕县| 阿拉善左旗| 十堰市| 漳浦县| 会昌县| 喀喇沁旗| 辽源市| 永昌县| 盖州市| 延安市| 庄浪县| 鹿泉市| 上犹县| 长子县| 通海县| 中宁县| 舞钢市| 莱西市| 永新县| 伽师县| 昭通市| 拜城县| 德格县| 和龙市| 桐梓县| 铜梁县| 天镇县| 揭西县| 宜春市| 芜湖县| 集贤县| 岳普湖县| 翁牛特旗| 平江县|