Java安全管理器
總的來(lái)說(shuō),Java安全應(yīng)該包括兩方面的內(nèi)容,一是Java平臺(tái)(即是Java運(yùn)行環(huán)境)的安全性;二是Java語(yǔ)言開(kāi)發(fā)的應(yīng)用程序的安全性。由于我們不是Java本身語(yǔ)言的制定開(kāi)發(fā)者,所以第一個(gè)安全性不需要我們考慮。其中第二個(gè)安全性是我們重點(diǎn)考慮的問(wèn)題。
一般我們可以通過(guò)安全管理器機(jī)制來(lái)完善安全性,安全管理器SecurityManager是安全的實(shí)施者,可對(duì)此類進(jìn)行擴(kuò)展,它提供了加在應(yīng)用程序上的安全措施,通過(guò)配置安全策略文件達(dá)到對(duì)網(wǎng)絡(luò)、本地文件和程序其它部分的訪問(wèn)限制的效果。
Java在應(yīng)用層為我們提供了安全管理器,每個(gè)Java應(yīng)用都可以擁有自己的安全管理器,它會(huì)在運(yùn)行階段檢查需要保護(hù)的資源的訪問(wèn)權(quán)限及其它規(guī)定的操作權(quán)限,保護(hù)系統(tǒng)免受惡意操作攻擊,以達(dá)到系統(tǒng)的安全策略。如圖展示了安全管理器的工作機(jī)制,當(dāng)運(yùn)行Java程序時(shí),安全管理器會(huì)根據(jù)policy文件所描述的策略給程序不同模塊分配權(quán)限,假設(shè)把應(yīng)用程序分成了三塊,每塊都有不同的權(quán)限,第一塊有讀取某文件的權(quán)限,第二塊同時(shí)擁有讀取某文件跟內(nèi)存的權(quán)限,第三塊有監(jiān)聽(tīng)socket的權(quán)限。通過(guò)這個(gè)機(jī)制就能很好地控制程序各個(gè)部分的各種操作權(quán)限,從應(yīng)用層上為我們提供了安全管理策略。
下圖為安全管理器對(duì)文件操作進(jìn)行管理的工作過(guò)程,當(dāng)應(yīng)用程序要讀取本地文件時(shí),securitymanager就會(huì)在讀取前進(jìn)行攔截,判斷是否有讀取此文件的權(quán)限,如果有則順利讀取,否則將拋出訪問(wèn)異常。SecurityManager類中提供了很多檢查權(quán)限的方法,例如checkPermission方法會(huì)根據(jù)安全策略文件描述的權(quán)限對(duì)操作進(jìn)行判斷是否有操作權(quán)限,而checkRead方法則用于判斷對(duì)文件訪問(wèn)權(quán)限。一旦發(fā)現(xiàn)沒(méi)有權(quán)限都會(huì)拋出安全異常。
一般而言,Java程序啟動(dòng)時(shí)并不會(huì)自動(dòng)啟動(dòng)安全管理器,可以通過(guò)以下兩種方法啟動(dòng)安全管理器:
- 一種是隱式,啟動(dòng)默認(rèn)的安全管理器最簡(jiǎn)單的方法就是:直接在啟動(dòng)命令中添加-Djava.security.manager參數(shù)即可。
- 一種是顯式,實(shí)例化一個(gè)java.lang.SecurityManager或繼承它的子類的對(duì)象,然后通過(guò)System.setSecurityManager()來(lái)設(shè)置并啟動(dòng)一個(gè)安全管理器。
在啟動(dòng)安全管理器時(shí)可以通過(guò)-Djava.security.policy選項(xiàng)來(lái)指定安全策略文件。如果沒(méi)有指定策略文件的路徑,那么安全管理器將使用默認(rèn)的安全策略文件,它位于%JAVA_HOME%/jre/lib/security目錄下面的java.policy。需要說(shuō)明一下的是,=表示這個(gè)策略文件將和默認(rèn)的策略文件一同發(fā)揮作用;==表示只使用這個(gè)策略文件。policy文件包含了多個(gè)grant語(yǔ)句,每一個(gè)grant描述某些代碼擁有某些操作的權(quán)限。在啟動(dòng)安全管理器時(shí)會(huì)根據(jù)policy文件生成一個(gè)Policy對(duì)象,任何時(shí)候一個(gè)應(yīng)用程序只能有一個(gè)Policy對(duì)象。
那么如何才能實(shí)現(xiàn)自己的安全管理器,并且配置權(quán)限呢?下面將通過(guò)一個(gè)簡(jiǎn)單的例子闡明實(shí)現(xiàn)步驟,一般可以分為以下兩步:
1. 創(chuàng)建一個(gè)SecurityManager子類,并根據(jù)需要重寫(xiě)一些方法。
2. 根據(jù)應(yīng)用程序代碼的權(quán)限需要配置策略文件。如果使用默認(rèn)安全管理器則省略第一步,下面用個(gè)例子說(shuō)明安全管理器的使用:
分下面幾種情況運(yùn)行程序:
- 假如不添加啟動(dòng)參數(shù)直接運(yùn)行,則相當(dāng)于沒(méi)有啟動(dòng)安全管理器,SecurityManager打印出來(lái)為null,且能正確讀取protect.txt文件跟file.encoding屬性。
- 添加啟動(dòng)參數(shù)-Djava.security.manager-Djava.security.policy=c:/protect.policy,倆參數(shù)分別代表啟動(dòng)默認(rèn)安全管理器和指明策略配置文件路徑。此時(shí)SecurityManager打印出來(lái)為不為null,但由于此時(shí)protect.policy里面并沒(méi)有做任何授權(quán),所以在讀取文件的時(shí)就拋出AccessControlExcepti on異常。
- 在protect.policy文件添加以下授權(quán)語(yǔ)句,此時(shí)SecurityManager不為空,并且有權(quán)限讀取protect.txt文件,但最終還是會(huì)拋一個(gè)AccessControlException異常,因?yàn)椴](méi)有權(quán)限讀取file.encoding系統(tǒng)屬性。
- 將protect.policy授權(quán)語(yǔ)句改為如下,這次讀取文件跟讀取系統(tǒng)屬性的權(quán)限都有了,程序正常運(yùn)行,不再拋出安全異常。
由上面幾種情況我們清晰了解安全管理器的使用,通過(guò)簡(jiǎn)單地配置策略文件能達(dá)到應(yīng)用安全的管理。Java的Permission類是用來(lái)定義類所擁有的權(quán)限,Java本身包括了一些 Permission類,如下:
| java.security.AllPermission | 所有權(quán)限的集合 |
| java.util.PropertyPermission | 系統(tǒng)/環(huán)境屬性權(quán)限 |
| java.lang.RuntimePermission | 運(yùn)行時(shí)權(quán)限 |
| java.net.SocketPermission | Socket權(quán)限 |
| java.io.FilePermission | 文件權(quán)限,包括讀寫(xiě),刪除,執(zhí)行 |
| java.io.SerializablePermission | 序列化權(quán)限 |
| java.lang.reflect.ReflectPermission | 反射權(quán)限 |
| java.security.UnresolvedPermission | 未解析的權(quán)限 |
| java.net.NetPermission | 網(wǎng)絡(luò)權(quán)限 |
| java.awt.AWTPermission | AWT權(quán)限 |
| java.sql.SQLPermission | 數(shù)據(jù)庫(kù)sql權(quán)限 |
| java.security.SecurityPermission | 安全控制方面的權(quán)限 |
| java.util.logging.LoggingPermission | 日志控制權(quán)限 |
| javax.net.ssl.SSLPermission | 安全連接權(quán)限 |
| javax.security.auth.AuthPermission | 認(rèn)證權(quán)限 |
| javax.sound.sampled.AudioPermission | 音頻系統(tǒng)資源的訪問(wèn)權(quán)限 |
========廣告時(shí)間========
鄙人的新書(shū)《Tomcat內(nèi)核設(shè)計(jì)剖析》已經(jīng)在京東銷售了,有需要的朋友可以到 https://item.jd.com/12185360.html 進(jìn)行預(yù)定。感謝各位朋友。
為什么寫(xiě)《Tomcat內(nèi)核設(shè)計(jì)剖析》
=========================
歡迎關(guān)注:
總結(jié)
- 上一篇: 关于选择排序和快速排序--2017-09
- 下一篇: java美元兑换,(Java实现) 美元