Java安全管理器
總的來說,Java安全應該包括兩方面的內容,一是Java平臺(即是Java運行環境)的安全性;二是Java語言開發的應用程序的安全性。由于我們不是Java本身語言的制定開發者,所以第一個安全性不需要我們考慮。其中第二個安全性是我們重點考慮的問題。
一般我們可以通過安全管理器機制來完善安全性,安全管理器SecurityManager是安全的實施者,可對此類進行擴展,它提供了加在應用程序上的安全措施,通過配置安全策略文件達到對網絡、本地文件和程序其它部分的訪問限制的效果。
Java在應用層為我們提供了安全管理器,每個Java應用都可以擁有自己的安全管理器,它會在運行階段檢查需要保護的資源的訪問權限及其它規定的操作權限,保護系統免受惡意操作攻擊,以達到系統的安全策略。如圖展示了安全管理器的工作機制,當運行Java程序時,安全管理器會根據policy文件所描述的策略給程序不同模塊分配權限,假設把應用程序分成了三塊,每塊都有不同的權限,第一塊有讀取某文件的權限,第二塊同時擁有讀取某文件跟內存的權限,第三塊有監聽socket的權限。通過這個機制就能很好地控制程序各個部分的各種操作權限,從應用層上為我們提供了安全管理策略。
下圖為安全管理器對文件操作進行管理的工作過程,當應用程序要讀取本地文件時,securitymanager就會在讀取前進行攔截,判斷是否有讀取此文件的權限,如果有則順利讀取,否則將拋出訪問異常。SecurityManager類中提供了很多檢查權限的方法,例如checkPermission方法會根據安全策略文件描述的權限對操作進行判斷是否有操作權限,而checkRead方法則用于判斷對文件訪問權限。一旦發現沒有權限都會拋出安全異常。
一般而言,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對象。
那么如何才能實現自己的安全管理器,并且配置權限呢?下面將通過一個簡單的例子闡明實現步驟,一般可以分為以下兩步:
1. 創建一個SecurityManager子類,并根據需要重寫一些方法。
2. 根據應用程序代碼的權限需要配置策略文件。如果使用默認安全管理器則省略第一步,下面用個例子說明安全管理器的使用:
分下面幾種情況運行程序:
- 假如不添加啟動參數直接運行,則相當于沒有啟動安全管理器,SecurityManager打印出來為null,且能正確讀取protect.txt文件跟file.encoding屬性。
- 添加啟動參數-Djava.security.manager-Djava.security.policy=c:/protect.policy,倆參數分別代表啟動默認安全管理器和指明策略配置文件路徑。此時SecurityManager打印出來為不為null,但由于此時protect.policy里面并沒有做任何授權,所以在讀取文件的時就拋出AccessControlExcepti on異常。
- 在protect.policy文件添加以下授權語句,此時SecurityManager不為空,并且有權限讀取protect.txt文件,但最終還是會拋一個AccessControlException異常,因為并沒有權限讀取file.encoding系統屬性。
- 將protect.policy授權語句改為如下,這次讀取文件跟讀取系統屬性的權限都有了,程序正常運行,不再拋出安全異常。
由上面幾種情況我們清晰了解安全管理器的使用,通過簡單地配置策略文件能達到應用安全的管理。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 | 音頻系統資源的訪問權限 |
========廣告時間========
鄙人的新書《Tomcat內核設計剖析》已經在京東銷售了,有需要的朋友可以到 https://item.jd.com/12185360.html 進行預定。感謝各位朋友。
為什么寫《Tomcat內核設計剖析》
=========================
歡迎關注:
總結
- 上一篇: 关于选择排序和快速排序--2017-09
- 下一篇: 很多女生都这么干!效果就是可以很快换电脑