Intranet中用Policy文件設置Java的安全策略

          Intranet中用Policy文件設置Java的安全策略

          建設銀行云南省保山地區分行 楊紹方


          --------------------------------------------------------------------------------

            本文提出了使用安全策略文件來設置Java程序權限的一種簡單的方法。由于企業內部網中各臺計算機的位置、用途和安全性明確,更適于使用安全策略文件來設置Java的權限,軟件的安裝、設置、升級和遷移都非常方便,并且,還可以和數字簽名配合使用,更重要的是,可以細分每個Java程序的權限,使用起來靈活方便。?

          一、Java中安全策略的概念
            Java應用程序環境的安全策略,詳細說明了對于不同的代碼所擁有的不同資源的許可,它由一個Policy對象來表達。為了讓applet(或者運行在?SecurityManager下的一個應用程序)能夠執行受保護的行為,例如讀寫文件,applet(或?Java應用程序)必須獲得那項操作的許可,安全策略文件就是用來實現這些許可。?
            Policy對象可能有多個實體,雖然任何時候只能有一個起作用。當前安裝的Policy對象,在程序中可以通過調用getPolicy方法得到,也可以通過調用setPolicy方法改變。Policy對象評估整個策略,返回一個適當的Permissions對象,詳細說明哪些代碼可以訪問哪些資源。?
            策略文件可以儲存在無格式的ASCII文件或Policy類的二進制文件或數據庫中。本文僅討論無格式的ASCII文件的形式。?

          二、Policy文件的格式
            為了能夠更好地理解下面的內容,建議在閱讀時參照?\jdk1.2\jre\lib\security\java.policy文件和\jdk1.2\jre\lib\security\java.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}\lib\security\java.policy?(Windows)?
            用戶Policy文件的缺省位置為:
          {user.home}/.java.policy?(Solaris)
          {user.home}\.java.policy?(Windows)?
            其實,在實際使用中,我們可能不會像上面介紹的那么復雜,特別是在不使用數字簽名時。這時,我們完全可以借鑒JDK?1.2提供給我們的現成的?\jdk1.2\jre\lib\security\java.policy文件,根據我們的需要做相應的修改,本文就針對不使用數字簽名情況詳細說明安全策略文件的用法。?
            下面,是一個完整的在Windows?95/98/NT下使用的.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文件的內容,使用起來相當簡單,而且,安全許可的范圍控制較精細。

          posted on 2007-01-24 10:43 liujg 閱讀(434) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          boddiy

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 淮安市| 延寿县| 潮州市| 社旗县| 故城县| 宁河县| 沁水县| 五家渠市| 元氏县| 瓦房店市| 门源| 夏邑县| 彩票| 深圳市| 海门市| 甘洛县| 杭州市| 同德县| 沾化县| 大理市| 长乐市| 云浮市| 岢岚县| 玉环县| 武陟县| 泸州市| 犍为县| 玛曲县| 且末县| 秦皇岛市| 金寨县| 奉新县| 茌平县| 石狮市| 台前县| 双鸭山市| 河西区| 巩留县| 华坪县| 天峨县| 杭州市|