Java安全管理器――SecurityManager
生活随笔
收集整理的這篇文章主要介紹了
Java安全管理器――SecurityManager
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
總的來說,Java安全應該包括兩方面的內容,一是Java平臺(即是Java運行環境)的安全性;二是Java語言開發的應用程序的安全性。由于我們不是Java本身語言的制定開發者,所以第一個安全性不需要我們考慮。其中第二個安全性是我們重點考慮的問題,一般我們可以通過安全管理器機制來完善安全性,安全管理器是安全的實施者,可對此類進行擴展,它提供了加在應用程序上的安全措施,通過配置安全策略文件達到對網絡、本地文件和程序其它部分的訪問限制的效果。
Java從應用層給我們提供了安全管理機制――安全管理器,每個Java應用都可以擁有自己的安全管理器,它會在運行階段檢查需要保護的資源的訪問權限及其它規定的操作權限,保護系統免受惡意操作攻擊,以達到系統的安全策略。圖3-1-5-1展示了安全管理器的工作機制,當運行Java程序時,安全管理器會根據policy文件所描述的策略給程序不同模塊分配權限,假設把應用程序分成了三塊,每塊都有不同的權限,第一塊有讀取某文件的權限,第二塊同時擁有讀取某文件跟內存的權限,第三塊有監聽socket的權限。通過這個機制就能很好地控制程序各個部分的各種操作權限,從應用層上為我們提供了安全管理策略。圖3-1-5-2為安全管理器對文件操作進行管理的工作過程,當應用程序要讀取本地文件時,securitymanager就會在讀取前進行攔截,判斷是否有讀取此文件的權限,如果有則順利讀取,否則將拋出訪問異常。SecurityManager類中提供了很多檢查權限的方法,例如checkPermission方法會根據安全策略文件描述的權限對操作進行判斷是否有操作權限,而checkRead方法則用于判斷對文件訪問權限。一旦發現沒有權限都會拋出安全異常。 Java安全管理器――SecurityManager 圖3-1-5-1 安全管理機制 Java安全管理器――SecurityManager 圖3-1-5-2 檢查操作權限 一般而言,Java程序啟動時并不會自動啟動安全管理器,可以通過以下兩種方法啟動安全管理器: ① 一種是隱式,啟動默認的安全管理器最簡單的方法就是:直接在啟動命令中添加-Djava.security.manager參數即可。 ② 一種是顯式,實例化一個java.lang.SecurityManager或繼承它的子類的對象,然后通過System.setSecurityManager()來設置并啟動一個安全管理器。 在啟動安全管理器時可以通過-Djava.security.policy選項來指定安全策略文件。如果沒有指定策略文件的路徑,那么安全管理器將使用默認的安全策略文件,它位于%JAVA_HOME%/jre/lib/security目錄下面的java.policy。需要說明一下的是,=表示這個策略文件將和默認的策略文件一同發揮作用;==表示只使用這個策略文件。policy文件包含了多個grant語句,每一個grant描述某些代碼擁有某些操作的權限。在啟動安全管理器時會根據policy文件生成一個Policy對象,任何時候一個應用程序只能有一個Policy對象。 那么如何才能實現自己的安全管理器,并且配置權限呢?下面將通過一個簡單的例子闡明實現步驟,一般可以分為以下兩步:①創建一個SecurityManager子類,并根據需要重寫一些方法。②根據應用程序代碼的權限需要配置策略文件。如果使用默認安全管理器則省略第一步,下面用個例子說明安全管理器的使用: public class SecurityManagerTest { public static void main(String[] args)throws FileNotFoundException { System.out.println("SecurityManager: " + System.getSecurityManager()); FileInputStreamfis = new FileInputStream("c://protect.txt"); System.out.println(System.getProperty("file.encoding")); 分下面幾種情況運行程序: (1) 假如不添加啟動參數直接運行,則相當于沒有啟動安全管理器,SecurityManager打印出來為null,且能正確讀取protect.txt文件跟file.encoding屬性。 (2) 添加啟動參數-Djava.security.manager-Djava.security.policy=c:/protect.policy,倆參數分別代表啟動默認安全管理器和指明策略配置文件路徑。此時SecurityManager打印出來為不為null,但由于此時protect.policy里面并沒有做任何授權,所以在讀取文件的時就拋出AccessControlExcepti on異常。 啟動參數在eclipse里面的配置,在右擊run configu里面的arguments的vm模塊設置?
(3) 在protect.policy文件添加以下授權語句, grant { permissionjava.io.FilePermission "c:/protect.txt", "read"; }; 此時SecurityManager不為空,并且有權限讀取protect.txt文件,但最終還是會拋一個AccessControlException異常,因為并沒有權限讀取file.encoding系統屬性。 (4) 將protect.policy授權語句改為如下: grant { permission java.io.FilePermission "c:/protect.txt", "read"; permission java.util.PropertyPermission "file.encoding", "read"; }; 這次讀取文件跟讀取系統屬性的權限都有了,程序正常運行,不再拋出安全異常。 由上面幾種情況我們清晰了解安全管理器的使用,通過簡單地配置策略文件能達到應用安全的管理。Java的Permission類是用來定義類所擁有的權限,Java本身包括了一些 Permission類,如下: java.security.AllPermission 所有權限的集合 java.util.PropertyPermission 系統/環境屬性權限 java.lang.RuntimePermission 運行時權限 java.net.SocketPermission Socket權限 java.io.FilePermission 文件權限,包括讀寫,刪除,執行 java.io.SerializablePermission 序列化權限 java.lang.reflect.ReflectPermission 反射權限 java.security.UnresolvedPermission 未解析的權限 java.net.NetPermission 網絡權限 java.awt.AWTPermission AWT權限 java.sql.SQLPermission 數據庫sql權限 java.security.SecurityPermission 安全控制方面的權限 java.util.logging.LoggingPermission 日志控制權限 javax.net.ssl.SSLPermission 安全連接權限 javax.security.auth.AuthPermission 認證權限 javax.sound.sampled.AudioPermission 音頻系統資源的訪問權限?
轉載于:https://www.cnblogs.com/handsome1013/p/9890785.html
總結
以上是生活随笔為你收集整理的Java安全管理器――SecurityManager的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#单例模式的懒汉与饿汉
- 下一篇: 洛谷1226快速幂模板