0 Java安全體系概述
從JDK 1.0開始Java就實現了一套安全架構,主要用於Applet. 在這種體系下Java Code的執行環境被嚴格劃分為兩個部分,本地代碼可以訪問電腦的所有資源,而遠端代碼(Romote Code: 主要是Applet)只能運行在嚴格限制的沙箱裡面.安全管理器(Security
Manager)作為一個子系統來決定哪些資源允許沙箱中的程式訪問.
JDK 1.1引入了"簽名Applet"的概念,一個被信任簽名的Applet被當作和本地代碼具有同等許可權,可以訪問全部的本地資源.
JDK 1.2做了很多改進.首先,無論本地代碼還是遠端代碼(remote code)現在都服從於安全性原則.安全性原則為各種簽名者和來源定義了一組許可(permission),可以由使用者和系統管理員來配置各種許可.每個許可(permission)指定允許訪問只用特定的資源,例如讀或寫一個特定的檔案/目錄或者可以串連到指定的地址和連接埠...
運行時系統將程式碼群組織為不同的域(domain),每個域對應一組許可,在這個域中的類的執行個體都受這個域指定的許可的限制.
1. 控制你的Application
首先要明確的是,本地應用程式啟動並執行時候,安全管理器(security manager)並沒有被安裝.所以,對於應用程式來說,預設是可以訪問所有的資源,這一點和Applet不同.要啟動安全管理器就是在啟動命令列加上 -Djava.security.manager.預設載入的系統策略檔案授予了所有代碼訪問一些通用屬性的許可.這個檔案是${jre_home}\lib\security\java.policy.在命令列上給定
-Djava.security.manager 啟動應用程式,系統會首先載入${jre_home}\lib\security\java.security 在這個檔案中搜尋policy.url可以看到如下的兩行
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
在這兩行載入了預設的策略檔案,我們也可以編輯自己的策略檔案然後添加到java.security中使應用程式應用我們的安全性原則.除此以外還有另一種指定我們自己的安全性原則檔案的方法,就是在命令列上使用 -Djava.security.policy=mypolicy 選項.
如果熟悉策略檔案的文法,可以自己用文字編輯器編輯,推薦使用工具policytool,這是jre提供的一個專門用來編輯策略檔案的工具.
2. 可信(Secure)代碼和分頁檔需要使用的API和工具
為了保證代碼的安全性,需要確定代碼或檔案的來源,需要提供者進行數位簽章.可以使用keytool或者security API來產生公開金鑰/私密金鑰對.為了驗證公開金鑰的確來自發行者,需要數位憑證(certificate),數位憑證由被信任的第三方提供.公開金鑰/私密金鑰對和憑證存放區在一個密碼保護的資料庫裡,叫做keystores.
2.1 對程式碼簽署並賦予許可
2.2 分頁檔
2.3 產生和校正簽名
3. 實現你自己的許可
本節中有一個例子,參見http://java.sun.com/docs/books/tutorial/security1.2/userperm/index.html
在代碼中檢查是否具有某種許可:
1. 調用System.getSecurityManager()來得到當前安裝的security manager.
2. 如果返回結果不為null,可以進一步查詢是否具有需要的許可.java.security.AccessController有個方法叫做doPrivileged,可以臨時的提高某種許可權來獲得特定資源的訪問許可,從而可以將對於特定資源的訪問限定在某個類,並不對整個應用放開,只有調用特定的類才能訪問特定的資源,詳見New
Privileged Block API相關文檔.
3. java.security.Permission和java.security.BasePermission這兩個類對於控制資源存取權限很重要.java.security.SecurityManager的方法checkPermission()接受的參數就是Permission極其子類.具體參見Java文檔的java.security包部分.
4. 這個例子最後還詳細描述了三個角色(架構開發人員,資源訪問類開發人員和使用者)需要做的事情.
參考文獻: http://java.sun.com/docs/books/tutorial/security1.2/TOC.html