java.policy 檔案格式及使用方法

來源:互聯網
上載者:User

一、Java中安全性原則的概念

    Java應用程式環境的安全性原則,詳細說明了對於不同的代碼所擁有的不同資源的許可,它由一個 Policy對象來表達。為了讓applet(或者運行在 SecurityManager下的一個應用程式)能夠執行受保護的行為,例如讀寫檔案,applet(或 Java應用程式)必須獲得那項操作的許可,安全性原則檔案就是用來實現這些許可。

    Policy對象可能有多個實體,雖然任何時候只能有一個起作用。當前安裝的Policy對象,在程式中可以通過調用getPolicy方法得到,也可以通過調用setPolicy方法改變。Policy對象評估整個策略,返回一個適當的Permissions對象,詳細說明哪些代碼可以訪問哪些資源。

    策略檔案可以儲存在無格式的ASCII檔案或Policy類的二進位檔案或資料庫中。本文僅討論無格式的ASCII檔案的形式。

二、Policy檔案的格式

    為了能夠更好地理解下面的內容,建議在閱讀時參照 jdk1.2jrelibsecurityjava.policy檔案和jdk1.2jrelibsecurityjava.security檔案的內容。

    Policy檔案的文法格式與說明

    一個Policy檔案實質上是一個記錄列表,它可能含有一個 “keystore”記錄,以及含有零個或多個“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"記錄

    一個keystore是一個私人密鑰(private keys)資料庫和相應的數位簽章,例如X.509認證。Policy檔案中可能只有一條keystore記錄(也可能不含有該記錄),它可以出現在檔案中grant記錄以外的任何地方。Policy設定檔中指定的 keystores用於尋找grant記錄中指定的、簽名者的公用密鑰(public keys),如果任何grant 記錄指定簽名者(signer_names),那麼,keystore記錄必須出現在policy設定檔中。

    “some_keystore_url" 是指keystore的URL位置, “keystore_type"是指keystore的類型。第二個選項是可選項,如果沒有指定,該類型則假定由安全屬性檔案(java.security)中的“keystore.type"屬性來確定。keystore類型定義了 keystore資訊的儲存和資料格式,用於保護keystore中的私人密鑰和keystore完整性的演算法。 Sun Microsystems支援的預設類型為“JKS”。

    (2)“grant"記錄

    在Policy檔案中的每一個grant記錄含有一個CodeSource (一個指定的代碼)及其permission(許可)。

    Policy 檔案中的每一條grant記錄遵循下面的格式,以保留字“grant”開頭,表示一條新的記錄的開始,“Permission”是另一個保留字,在記錄中用來標記一個新的許可的開始。每一個grant記錄授予一個指定的代碼(CodeBase)、一套許可(Permissions)。

    permission_class_name必須是一個合格並存在的類名,例如java.io.FilePermission,不能使用縮寫(例如,FilePermission)。

    target_name用來指定目標類的位置,action用於指定目標類擁有的許可權。

    target_name可以直接指定類名(可以是絕對或相對路徑)、目錄名,也可以是下面的萬用字元:

        directory/* 目錄下的所有檔案

        * 目前的目錄的所有檔案

        directory/- 目錄下的所有檔案,包括子目錄

        - 目前的目錄下的所有檔案,包括子目錄

        << ALL FILES >>檔案系統中的所有檔案

    對於java.io.FilePermission,action可以是:read, write, delete和execute。

    對於java.net.SocketPermission,action可以是:listen, accept,connect,read,write。

     (3)Policy檔案中的屬性擴充(Property Expansion)屬性擴充與shell中使用的變數擴充類似,它的格式為:“${some.property}"

    實際使用的例子為:

        permission java.io.FilePermission

        “${user.home}", “read";

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

三、實 例

    當初始化Policy時,首先裝載系統Policy,然後再增加使用者Policy,如果兩者都不存在,則使用預設的Policy,即原始的沙箱模型。

    系統Policy檔案的預設位置為:

        {java.home}/lib/security/java.policy (Solaris)

        {java.home}libsecurityjava.policy (Windows)

       

            使用者Policy檔案的預設位置為:

        {user.home}/.java.policy (Solaris)

        {user.home}.java.policy (Windows)

    其實,在實際使用中,我們可能不會像上面介紹的那麼複雜,特別是在不使用數位簽章時。這時,我們完全可以借鑒JDK 1.2提供給我們的現成的 jdk1.2jrelibsecurityjava.policy檔案,根據我們的需要做相應的修改,本文就針對不使用數位簽章情況詳細說明安全性原則檔案的用法。

    下面,是一個完整的在Windows下使用的.java.policy檔案。在檔案中,分別使用注釋的形式說明了每個“permission”記錄的用途。

 

    // For LanServerTalk.java and LanClientTalk.java

    grant {

    //對系統和使用者目錄“讀”的許可權

    

    

    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";

    //對線程和線程組的操作許可權

    permission java.lang.RuntimePermission “modifyThread";

    permission java.lang.RuntimePermission “modifyThreadGroup";

    //操作Socket連接埠的各種許可權

    permission java.net.SocketPermission “-", “listen";

    permission java.net.SocketPermission “-", “accept";

    permission java.net.SocketPermission “-", “connect";

    permission java.net.SocketPermission “-", “read";

    permission java.net.SocketPermission “-", “write";

    //讀寫檔案的許可權

    permission java.io.FilePermission “-", “read";

    permission java.io.FilePermission “-", “write";

    //退出系統的許可權,例如System.exit(0)

    permission java.lang.RuntimePermission “exitVM";

    };

四、.Java.policy檔案的使用

    對於Windows 95/98/NT,使用.Java.policy檔案的方法主要有下面兩種。

    1. 使用預設目錄

    我們可以簡單地將編輯好的.Java.policy檔案拷貝到 Windows 95/98/NT的HOME目錄,這時,所有的applet(或Java應用程式)可能都擁有某些相同的許可權,使用起來簡單,但不靈活(例如:對於 Java.io.FilePermission ,其目標類的 target_name必須使用絕對路徑),如果不是在企業內部網中使用,還可能存在一定安全隱患。

    2. 在命令列中指定

    在命令列,如果我們希望傳遞一個Policy檔案給 appletviewer,還可以使用“-J-Djava.security.policy"參數來指定policy的位置:

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

    pURL為Policy檔案的位置。下面,是一個實際的例子,以目前的目錄的.java.policy檔案所指定的安全性原則運行目前的目錄的LanServerTalk.html(檔案中裝載並運行LanServerTalk.Java):

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

    這種方法使用靈活,特別是作為一個軟體包在企業內部網中發布時,安裝、設定和遷移軟體,基本無須修改Policy檔案的內容,使用起來相當簡單,而且,安全許可的範圍控制較精細

    grant {
      permission java.security.AllPermission;
    };

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.