Java安全管理——策略文件介紹

    策略管理器要讀取相應的策略文件,這些文件包含了將代碼來源映射爲權限的指令。下面是一個典型的策略文件: html

         grant codeBase "http://www.horstmann.com/classes" { java

        permission java.security.FilePermission "/tmp/*", "read,write"; sql

}; 安全

該文件給全部下載自http://www.horstmann.com/classes的代碼授予在/tmp目錄下讀取和寫入文件的權限。 app

 

能夠將策略文件安裝在標準位置上。默認狀況下,有兩個位置能夠安裝策略文件: dom

<JAVA_HOME>/lib/security/java.security<JAVA_HOME> 引用 java.home 系統屬性的值,並指定 JRE 的安裝目錄。 socket

l  用戶主目錄的 .java.policy 文件。 ide

能夠在java.security配置文件中修改這些文件的位置,默認位置設定爲: 測試

policy.url.1=file:${java.home}/lib/security/java.policy url

policy.url.2=file:${user.home}/.java.policy

若是你將策略文件存儲到文件系統以外,那麼能夠去實現Policy類的一個子類,讓其去收集所容許的權限。而後在java.security配置文件中更改下面這行:

policy.provider=sun.security.provider.PolicyFile

 

在測試期間,咱們不喜歡常常地修改標準策略文件。所以,咱們更願意爲每個應用程序配置顯式的策略文件,這樣將權限寫入一個獨立的文件(好比MyApp.policy)中便可。要將這個策略文件添加到其餘有效的策略中,能夠有兩個選擇。

l  在應用程序的main方法內部設置系統屬性:

System.setProperty("java.security.policy", "MyApp.policy");

l  像下面這樣啓動虛擬機:

Java –Djava.security.policy=MyApp.policy MyApp

對於applet,則能夠用以下的啓動命令:

appletviewer –J-Djava.security.policy=MyApp.policy MyApp MyApplet.html

可使用appletviewer-J選項將任何命令行參數傳遞給虛擬機。

         若是要只是用指定的策略文件,忽略標準策略文件,那麼須要在命令行中添加第二個等號:

Java –Djava.security.policy==MyApp.policy MyApp

         警告:在測試期間,一個容易犯的錯誤是在當前用戶中留下了一個.java.policy文件,該文件授予了許許多多的權限。若是你發現你的應用程序彷佛沒有應用策略文件中的規定,就應該檢查當前目錄下的.java.policy文件。

 

         在默認狀況下,Java應用程序是不安裝安全管理器的。所以,在安裝安全管理器以前,看不到策略文件的做用。有兩種方法來安裝安全管理器:

l  在main方法中添加下面這行代碼:

System.setSecurityManager(new SecurityManager());

l  在啓動虛擬機的時候添加命令行選項-Djava.security.manager

java –Djava.security.manager –Djava.security.policy=MyApp.policy MyApp

 

         下面介紹整個策略文件的格式(不包含代碼證書部分)。

         一個策略文件包含一系列grant項。每一項都具備如下的形式:

         grant codesource

         {

                   permission1;

                   permission2;

                   …

}

         代碼來源包含一個代碼基(若是某一項適用於全部來源的代碼,則代碼基能夠省略)和值得信賴的用戶特徵(principal)與證書籤名者的名字(若是不要求對該項簽名,則能夠省略)。

 

         代碼基能夠設定爲:

         codebase "url"

         若是URL以「/」結束,那麼它是一個目錄。不然,它將被視爲一個JAR文件的名字。該URL老是以「/」做爲文件分隔符,即便是Windows中的文件URL

         注意:策略文件閱讀器接受兩種格式的file URL,即file://localFilefile:localFile。此外,Windows驅動器名前面的斜槓是無關緊要的。例如:

         file:C:/dir/filename.ext

         file:/C:/dir/filename.ext

         file://C:/dir/filename.ext

         file:///C:/dir/filename.ext

         file:////C:/dir/filename.ext

 

         權限採用下面的結構:

         permission className targetName, actionList;

className 類名是權限類的全限定類名(好比java.io.FilePermission)。

targetName目標名是個與權限相關的值,例如,文件權限中的目錄名或者文件名,或者是socket權限中的主機和端口。

actionList 操做列表是一個操做方式的列表,好比readconnect等操做,用逗號分割。

有些權限類並不須要目標名和操做列表。

 

         下表列出了標準的權限和它們執行的操做:


權限

目標

操做

java.io.FilePermission

file 文件

directory 目錄

directory/ 目錄中的全部文件

* 當前目錄中的全部文件

directory/- 目錄和其子目錄中的全部文件

- 當前目錄和其子目錄中的全部文件

<<ALL FILES>> 文件系統中的全部文件

1. read 讀取指定的文件

2. write 對指定的文件進行寫操做

3. execute

4. delete 刪除指定的文件

java.net.SocketPermission

Socket權限的目標由主機和端口範圍組成。

1)主機的描述:

hostnameIPaddress 單個主機

localhost或字符串 本地主機

*.domainSuffix 以給定後綴結尾的域中的全部主機

* 全部主機

2)端口範圍的描述:

:n 單個端口

:n- 編號大於等於n的全部端口

:-n 編號小於等於n的全部端口

:n1-n2 位於給定範圍內的全部端口

1. accept 接收一個來自於指定主機和端口號的socket鏈接

2. connect 打開一個指定主機和端口號的socket鏈接

3. listen 在指定的本地端口號上等待鏈接

4. resolve

java.util.PropertyPermission

property 一個具體的屬性

propertyPrefix.* 帶有給定前綴的全部屬性

1. read 訪問指定的系統屬性

2. write 修改指定的系統屬性

java.lang.RuntimePermission

createClassLoader 建立一個新的類裝載器

getClassLoader

setContextClassLoader

enableContextClassLoaderOverride

createSecurityManager

exitVM 應用程序退出

getenv.variableName

shutdownHooks

setFactory 設置被ServerSocketSocket使用的socket類或者設置被URL使用的URL流處理器

setIO

modifyThread 改變一個線程(例如改變它的優先級,停止它等等)

stopThread

modifyThreadGroup 改變一個線程組(例如加入一個新的線程,設置守護進程等等)

getProtectionDomain

readFileDescriptor讀取指定的文件

writeFileDescriptor

loadLibrary.libraryName 安裝一個包含本地方法的動態庫

accessClassInPackage.packageName 訪問指定的包(被類加載器使用)中的類型

defineClassInPackage.packageName 在指定的包(被類加載器使用)中加入一個新的類

accessDeclaredMembers.className

queuePrintJob 初始化一個打印任務請求

getStackTrace

setDefaultUncaughtExceptionHandler

preferences

usePolicy

java.awt.AWTPermission

showWindowWithoutWarningBanner

accessClipboard

accessEventQueue

createRobot

fullScreenExclusive

listenToAllAWTEvents

readDisplayPixels

replaceKeyboardFocusManager

watchMousePointer

setWindowAlwaysOnTop

setAppletStub

java.net.NetPermission

setDefaultAuthenticator

specifyStreamHandler

requestPasswordAuthentication

setProxySelector

getProxySelector

setCookieHandler

getCookieHandler

setResponseCache

getResponseCache

java.lang.reflect.ReflectPermission

suppressAccessChecks

java.io.SerializablePermission

enableSubclassImplementation

enableSubstitution

java.security.SecurityPermission

createAccessControlContext

getDomainCombiner

getPolicy

setPolicy

getProperty.keyName

setProperty.keyName

insertProvider.providerName

setProvider. providerName

setSystemScope

setIdentityPublicKey

setIdentityInfo

addIdentityCertificate

removeIdentityCertificate

printIdentity

clearProviderProperties.providerName

putProviderProperties.providerName

removeProviderProperties.providerName

getSignerPrivateKey

setSignerKeyPair

java.security.AllPermission

javax.audio.AudioPermission

運行記錄

javax.security.auth.AuthPermission

doAs

doAsPrivileged

getSubject

getSubjectFromDomainCombiner

setReadOnly

modifyPrincipals

modifyPublicCredentials

modifyPrivateCredentials

refreshCredential

destroyCredentia

createLoginContext.contextName

getLoginConfiguration

setLoginConfiguration

refreshLoginConfiguration

java.util.logging.LoggingPermission

control

java.sql.SQLPermission

setLog

相關文章
相關標籤/搜索