眾所周知
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\java
policy文件和\jdk
\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
};
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的類型
第二個選項是可選項
如果沒有指定
該類型則假定由安全屬性文件(java
security)中的
keystore
type
屬性來確定
keystore類型定義了keystore信息的存儲和數據格式
用於保護keystore中的私有密鑰和keystore完整性的算法
Sun Microsystems支持的缺省類型為
JKS
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
對於
SocketPermission
action可以是
listen
accept
connect
read
write
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
提供給我們的現成的\jdk
\jre\lib\security\java
policy文件
根據我們的需要作相應的修改
本文就針對不使用數字簽名情況詳細說明安全策略文件的用法
下面
是一個完整的在Windows
/
/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
SocketPermission
listen
;
permission
SocketPermission
accept
;
permission
SocketPermission
connect
;
permission
SocketPermission
read
;
permission
SocketPermission
write
;
//讀寫文件的權限
permission java
io
FilePermission
read
;
permission java
io
FilePermission
write
;
//退出系統的權限
例如System
exit(
)
permission java
lang
RuntimePermission
exitVM
;
};
四
java
policy文件的使用
對於windows
/
/NT
使用
java
policy文件的方法主要有下面兩種
. 使用缺省目錄
我們可以簡單地將編輯好的
java
policy文件拷貝到windows
/
/NT的HOME目錄
這時
所有的applet(或Java應用程序)可能都擁有某些相同的權限
使用起來簡單
但不靈活(例如
對於java
io
FilePermission
其目標類的target_name必須使用絕對路徑)
如果不是在企業內部網中使用
還可能存在一定安全隱患
. 在命令行中指定
在命令行
如果我們希望傳遞一個Policy文件給appletviewer
還可以使用
J
Djava
security
policy
參數來指定policy的位置
appletviewer
J
Djava
security
policy=pURL myApplet
pURL為Policy文件的位置
下面
是一個實際的例子
以當前目錄的
java
policy文件所指定的安全策略運行當前目錄的l(文件中裝載並運行LanServerTalk
java)
appletviewer
J
Djava
security
policy
=
java
policy l
這種方法使用靈活
特別是作為一個軟件包在企業內部網中發布時
安裝
設置和遷移軟件
基本無須修改Policy文件的內容
使用起來相當簡單
而且
安全許可的范圍控制較精細
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27317.html