熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

企業內部網中使用Policy文件來設置Java的安全策略

2013-11-23 19:41:54  來源: Java高級技術 

   眾所周知Java語言具有完善的安全框架從編程語言編譯器解釋程序到Java虛擬機都能確保Java系統不被無效的代碼或敵對的編譯器暗中破壞基本上它們保證了Java代碼按預定的規則運作但是當我們需要逾越這些限制時例如讀寫文件監聽和讀寫Socket退出Java系統等就必須使用數字簽名或安全策略文件(*Policy)
  
   在企業內部網中本文提出了使用安全策略文件來設置java程序權限的一種簡單的方法由於企業內部網中各台計算機的位置用途和安全性明確更適於使用安全策略文件來設置java的權限軟件的安裝設置升級和遷移都非常的方便並且還可以和數字簽名配合使用更重要的是可以細分每個java程序的權限使用起來靈活方便
  
  一 Java中安全策略的概念
   Java應用程序環境的安全策略詳細說明了對於不同的代碼所擁有的不同資源的許可它由一個Policy對象來表達為了讓applet(或者運行在SecurityManager下的一個應用程序)能夠執行受保護的行為例如讀寫文件applet(或Java應用程序)必須獲得那項操作的許可安全策略文件就是用來實現這些許可
  
   Policy對象可能有多個實體雖然任何時候只能有一個起作用當前安裝的Policy對象在程序中可以通過調用getPolicy方法得到也可以通過調用setPolicy方法改變Policy對象評估整個策略返回一個適當的Permissions對象詳細說明那些代碼可以訪問那些資源
  
   策略文件可以儲存在無格式的ASCII文件或Policy類的二進制文件或數據庫中本文僅討論無格式的ASCII文件的形式
  
  二 Policy文件的格式
   為了能夠更好地理解下面的內容建議在閱讀時參照\jdk\jre\lib\security\javapolicy文件和\jdk\jre\lib\security\javasecurity文件的內容
  
   . 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
  };
   keystore記錄
  
   一個keystore是一個私有密鑰(private keys)數據庫和相應的數字簽名例如X證書Policy文件中可能只有一條keystore記錄(也可能不含有該記錄)它可以出現在文件中grant記錄以外的任何地方Policy配置文件中指定的keystores用於尋找grant記錄中指定的簽名者的公共密鑰(public keys)如果任何grant記錄指定簽名者(signer_names)那麼keystore記錄必須出現在policy配置文件中
  
   some_keystore_url是指keystore的URL位置keystore_type是指keystore的類型第二個選項是可選項如果沒有指定該類型則假定由安全屬性文件(javasecurity)中的keystoretype屬性來確定keystore類型定義了keystore信息的存儲和數據格式用於保護keystore中的私有密鑰和keystore完整性的算法Sun Microsystems支持的缺省類型為JKS
  
   grant記錄
  
   在Policy文件中的每一個grant記錄含有一個CodeSource(一個指定的代碼)及其permission(許可)
  
   Policy文件中的每一條grant記錄遵循下面的格式以保留字grant開頭表示一條新的記錄的開始Permission是另一個保留字在記錄中用來標記一個新的許可的開始每一個grant記錄授予一個指定的代碼(CodeBase)一套許可(Permissions)
  
   permission_class_name必須是一個合格並存在的類名例如javaioFilePermission不能使用縮寫(例如FilePermission)
  
   target_name用來指定目標類的位置action用於指定目標類擁有的權限
  
   target_name可以直接指定類名(可以是絕對或相對路徑)目錄名也可以是下面的通配符
  
  directory/* 目錄下的所有文件
  *當前目錄的所有文件
  directory/目錄下的所有文件包括子目錄
   當前目錄下的所有文件包括子目錄
  《ALL FILES》文件系統中的所有文件
  對於javaioFilePermissionaction可以是
  read write delete和execute
  對於SocketPermissionaction可以是
  listenacceptconnectreadwrite
   Policy文件中的屬性擴展(Property Expansion)
  
   屬性擴展與shell中使用的變量擴展類似它的格式為
  
  ${someproperty}
  實際使用的例子為
  permission javaioFilePermission
  ${userhome} read;
  ${userhome}的值為d:\Project
  因此下面的語句和上面的語句是一樣的
  permission javaioFilePermission
   d:\Project read;
  三 實例
   當初始化Policy時首先裝載系統Policy然後再增加用戶Policy如果兩者都不存在則使用缺省的Policy即原始的沙箱模型
  
   系統Policy文件的缺省位置為
  
  {javahome}/lib/security/javapolicy (Solaris)
  {javahome}\lib\security\javapolicy (Windows)
  用戶Policy文件的缺省位置為
  {userhome}/javapolicy (Solaris)
  {userhome}\javapolicy (Windows)
   其實在實際使用中我們可能不會象上面介紹的那麼復雜特別是在不使用數字簽名時這時我們完全可以借鑒JDK 提供給我們的現成的\jdk\jre\lib\security\javapolicy文件根據我們的需要作相應的修改本文就針對不使用數字簽名情況詳細說明安全策略文件的用法
  
   下面是一個完整的在Windows //NT下使用的javapolicy文件在文件中分別使用注釋的形式說明了每個permission記錄的用途
  
  // For LanServerTalkjava and LanClientTalkjava
  
  grant {
  //對系統和用戶目錄的權限
  permission javautilPropertyPermission
  userdir read;
  permission javautilPropertyPermission
  userhome read;
  permission javautilPropertyPermission
  javahome read;
  permission javautilPropertyPermission
  javaclasspath read;
  permission javautilPropertyPermission
  username read;
  
  //對線程和線程組的操作權限
  permission javalangRuntimePermission
   modifyThread;
  permission javalangRuntimePermission
   modifyThreadGroup;
  
   //操作Socket端口的各種權限
   permission SocketPermission
   listen;
   permission SocketPermission
   accept;
   permission SocketPermission
   connect;
   permission SocketPermission read;
   permission SocketPermission write;
  
   //讀寫文件的權限
   permission javaioFilePermission read;
   permission javaioFilePermission write;
  
   //退出系統的權限例如Systemexit()
   permission javalangRuntimePermission exitVM;
  };
  四 javapolicy文件的使用
   對於windows //NT使用javapolicy文件的方法主要有下面兩種
  
   . 使用缺省目錄
  
   我們可以簡單地將編輯好的javapolicy文件拷貝到windows //NT的HOME目錄這時所有的applet(或Java應用程序)可能都擁有某些相同的權限使用起來簡單但不靈活(例如對於javaioFilePermission 其目標類的target_name必須使用絕對路徑)如果不是在企業內部網中使用還可能存在一定安全隱患
  
   . 在命令行中指定
  
   在命令行如果我們希望傳遞一個Policy文件給appletviewer還可以使用JDjavasecuritypolicy參數來指定policy的位置
  
  appletviewer JDjavasecurity
  policy=pURL myApplet
   pURL為Policy文件的位置下面是一個實際的例子以當前目錄的javapolicy文件所指定的安全策略運行當前目錄的l(文件中裝載並運行LanServerTalkjava)
  
  appletviewer JDjavasecuritypolicy
  =javapolicy l
   這種方法使用靈活特別是作為一個軟件包在企業內部網中發布時安裝設置和遷移軟件基本無須修改Policy文件的內容使用起來相當簡單而且安全許可的范圍控制較精細
  
  

From:http://tw.wingwit.com/Article/program/Java/gj/201311/27317.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.