隨筆-26  評(píng)論-111  文章-19  trackbacks-0

          一、Java中安全策略的概念
          ----Java應(yīng)用程序環(huán)境的安全策略,詳細(xì)說(shuō)明了對(duì)于不同的代碼所擁有的不同資源的許可,它由一個(gè)Policy對(duì)象來(lái)表達(dá)。為了讓applet(或者運(yùn)行在 SecurityManager下的一個(gè)應(yīng)用程序)能夠執(zhí)行受保護(hù)的行為,例如讀寫(xiě)文件,applet(或 Java應(yīng)用程序)必須獲得那項(xiàng)操作的許可,安全策略文件就是用來(lái)實(shí)現(xiàn)這些許可。
          ----Policy對(duì)象可能有多個(gè)實(shí)體,雖然任何時(shí)候只能有一個(gè)起作用。當(dāng)前安裝的Policy對(duì)象,在程序中可以通過(guò)調(diào)用getPolicy方法得到,也可以通過(guò)調(diào)用setPolicy方法改變。Policy對(duì)象評(píng)估整個(gè)策略,返回一個(gè)適當(dāng)?shù)腜ermissions對(duì)象,詳細(xì)說(shuō)明哪些代碼可以訪(fǎng)問(wèn)哪些資源。

          ---- 策略文件可以?xún)?chǔ)存在無(wú)格式的ASCII文件或Policy類(lèi)的二進(jìn)制文件或數(shù)據(jù)庫(kù)中。本文僅討論無(wú)格式的ASCII文件的形式。

          二、Policy文件的格式
          ----為了能夠更好地理解下面的內(nèi)容,建議在閱讀時(shí)參照 \jdk1.2\jre\lib\security\java.policy文件和\jdk1.2\jre\lib\security\java.security文件的內(nèi)容。
          ----Policy文件的語(yǔ)法格式與說(shuō)明

          ----一個(gè)Policy文件實(shí)質(zhì)上是一個(gè)記錄列表,它可能含有一個(gè) “keystore”記錄,以及含有零個(gè)或多個(gè)“grant”記錄。其格式如下:

          keystore “some_keystore_url", “keystore_type";

          grant [ SignedBy “signer_names" ] [ , CodeBase “URL" ] {
          Permission permission_class_name [ “target_name" ]
          [ , “action"] [, SignedBy “signer_names" ];
          Permission ...
          };

          ----(1)“keystore"記錄

          ----一個(gè)keystore是一個(gè)私有密鑰(private keys)數(shù)據(jù)庫(kù)和相應(yīng)的數(shù)字簽名,例如X.509證書(shū)。Policy文件中可能只有一條keystore記錄(也可能不含有該記錄),它可以出現(xiàn)在文件中g(shù)rant記錄以外的任何地方。Policy配置文件中指定的 keystores用于尋找grant記錄中指定的、簽名者的公共密鑰(public keys),如果任何grant 記錄指定簽名者(signer_names),那么,keystore記錄必須出現(xiàn)在policy配置文件中。

          ----“some_keystore_url"是指keystore的URL位置, “keystore_type"是指keystore的類(lèi)型。第二個(gè)選項(xiàng)是可選項(xiàng),如果沒(méi)有指定,該類(lèi)型則假定由安全屬性文件(java.security)中的“keystore.type"屬性來(lái)確定。keystore類(lèi)型定義了 keystore信息的存儲(chǔ)和數(shù)據(jù)格式,用于保護(hù)keystore中的私有密鑰和keystore完整性的算法。 Sun Microsystems支持的缺省類(lèi)型為“JKS”。

          ---- (2)“grant"記錄

          ----在Policy文件中的每一個(gè)grant記錄含有一個(gè)CodeSource (一個(gè)指定的代碼)及其permission(許可)。

          ----Policy文件中的每一條grant記錄遵循下面的格式,以保留字“grant”開(kāi)頭,表示一條新的記錄的開(kāi)始,“Permission”是另一個(gè)保留字,在記錄中用來(lái)標(biāo)記一個(gè)新的許可的開(kāi)始。每一個(gè)grant記錄授予一個(gè)指定的代碼(CodeBase)、一套許可(Permissions)。

          ----permission_class_name必須是一個(gè)合格并存在的類(lèi)名,例如java.io.FilePermission,不能使用縮寫(xiě)(例如,F(xiàn)ilePermission)。

          ----target_name用來(lái)指定目標(biāo)類(lèi)的位置,action用于指定目標(biāo)類(lèi)擁有的權(quán)限。

          ----target_name可以直接指定類(lèi)名(可以是絕對(duì)或相對(duì)路徑)、目錄名,也可以是下面的通配符:

          directory/* 目錄下的所有文件
          * 當(dāng)前目錄的所有文件
          directory/- 目錄下的所有文件,包括子目錄
          - 當(dāng)前目錄下的所有文件,包括子目錄
          << ALL FILES >>文件系統(tǒng)中的所有文件

          ----對(duì)于java.io.FilePermission,action可以是:read, write, delete和execute。

          ----對(duì)于java.net.SocketPermission,action可以是:listen, accept,connect,read,write。

          ---- (3)Policy文件中的屬性擴(kuò)展(Property Expansion)屬性擴(kuò)展與shell中使用的變量擴(kuò)展類(lèi)似,它的格式為:
          “${some.property}"

          ----實(shí)際使用的例子為:
          permission java.io.FilePermission
          “${user.home}", “read";

          ----“${user.home}"的值為“d:\Project",因此,下面的語(yǔ)句和上面的語(yǔ)句是一樣的:
          permission java.io.FilePermission “d:\Project ", “read";

          三、實(shí) 例
          ----當(dāng)初始化Policy時(shí),首先裝載系統(tǒng)Policy,然后再增加用戶(hù)Policy,如果兩者都不存在,則使用缺省的Policy,即原始的沙箱模型。
          ----系統(tǒng)Policy文件的缺省位置為:
          {java.home}/lib/security/java.policy (Solaris)
          {java.home}\lib\security\java.policy (Windows)

          ----用戶(hù)Policy文件的缺省位置為:
          {user.home}/.java.policy (Solaris)
          {user.home}\.java.policy (Windows)

          ----其實(shí),在實(shí)際使用中,我們可能不會(huì)像上面介紹的那么復(fù)雜,特別是在不使用數(shù)字簽名時(shí)。這時(shí),我們完全可以借鑒JDK 1.2提供給我們的現(xiàn)成的 \jdk1.2\jre\lib\security\java.policy文件,根據(jù)我們的需要做相應(yīng)的修改,本文就針對(duì)不使用數(shù)字簽名情況詳細(xì)說(shuō)明安全策略文件的用法。

          ----下面,是一個(gè)完整的在Windows 95/98/NT下使用的.java.policy文件。在文件中,分別使用注釋的形式說(shuō)明了每個(gè)“permission”記錄的用途。

          // For LanServerTalk.java and LanClientTalk.java

          grant {
          //對(duì)系統(tǒng)和用戶(hù)目錄“讀”的權(quán)限
          permission java.util.PropertyPermission “user.dir", “read";
          permission java.util.PropertyPermission “user.home", “read";
          permission java.util.PropertyPermission “java.home", “read";
          permission java.util.PropertyPermission “java.class.path", “read";
          permission java.util.PropertyPermission “user.name", “read";

          //對(duì)線(xiàn)程和線(xiàn)程組的操作權(quán)限
          permission java.lang.RuntimePermission “modifyThread";
          permission java.lang.RuntimePermission “modifyThreadGroup";

          //操作Socket端口的各種權(quán)限
          permission java.net.SocketPermission “-", “l(fā)isten";
          permission java.net.SocketPermission “-", “accept";
          permission java.net.SocketPermission “-", “connect";
          permission java.net.SocketPermission “-", “read";
          permission java.net.SocketPermission “-", “write";

          //讀寫(xiě)文件的權(quán)限
          permission java.io.FilePermission “-", “read";
          permission java.io.FilePermission “-", “write";

          //退出系統(tǒng)的權(quán)限,例如System.exit(0)
          permission java.lang.RuntimePermission “exitVM";
          };

          四、.Java.policy文件的使用
          ---- 對(duì)于Windows 95/98/NT,使用.Java.policy文件的方法主要有下面兩種。
          ----1. 使用缺省目錄

          ---- 我們可以簡(jiǎn)單地將編輯好的.Java.policy文件拷貝到 Windows 95/98/NT的HOME目錄,這時(shí),所有的applet(或Java應(yīng)用程序)可能都擁有某些相同的權(quán)限,使用起來(lái)簡(jiǎn)單,但不靈活(例如:對(duì)于Java.io.FilePermission ,其目標(biāo)類(lèi)的 target_name必須使用絕對(duì)路徑),如果不是在企業(yè)內(nèi)部網(wǎng)中使用,還可能存在一定安全隱患。

          ---- 2. 在命令行中指定

          ---- 在命令行,如果我們希望傳遞一個(gè)Policy文件給 appletviewer,還可以使用“-J-Djava.security.policy"參數(shù)來(lái)指定policy的位置:

          appletviewer -J-Djava.security.policy=pURL myApplet

          ----pURL為Policy文件的位置。下面,是一個(gè)實(shí)際的例子,以當(dāng)前目錄的.java.policy文件所指定的安全策略運(yùn)行當(dāng)前目錄的LanServerTalk.html(文件中裝載并運(yùn)行LanServerTalk.Java):

          appletviewer -J-Djava.security.policy
          =.Java.policy LanServerTalk.html

          ----這種方法使用靈活,特別是作為一個(gè)軟件包在企業(yè)內(nèi)部網(wǎng)中發(fā)布時(shí),安裝、設(shè)置和遷移軟件,基本無(wú)須修改Policy文件的內(nèi)容,使用起來(lái)相當(dāng)簡(jiǎn)單,而且,安全許可的范圍控制較精細(xì)。

          摘自《計(jì)算機(jī)世界》
          posted on 2005-10-14 17:48 snoics 閱讀(470) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 它山之石
          主站蜘蛛池模板: 钟山县| 丰台区| 分宜县| 永德县| 扎赉特旗| 天等县| 汾西县| 东至县| 晴隆县| 庄河市| 南平市| 凤翔县| 吉木乃县| 安国市| 毕节市| 和田县| 德化县| 清涧县| 翁源县| 秀山| 南汇区| 临颍县| 易门县| 潞城市| 桑植县| 贵港市| 万州区| 银川市| 安塞县| 哈密市| 汤阴县| 锡林浩特市| 资源县| 盘山县| 都匀市| 远安县| 华坪县| 大港区| 张家界市| 偃师市| 镇巴县|