試想一下,如果你的JSP頁面中包含一句代碼“System.exit(1);”,你的web應用通路到該JSP時,會發生什麼? 一般使用tomcat可能都沒有注意到這個問題,本篇主要講述tomcat 6中SecurityManager的管理機制,盡量使用簡單明了的圖檔表示其中關系。
Java是一門安全性很高的語言,是以也會考慮到使用者代碼對整個系統的侵入性。試想一下,如果你引用了一個jar包,裡面包含了依據system.exit(),每次執行到這裡都直接退出,會不會很蛋疼!
Java開發者肯定想過如此的問題,是以引入了java安全政策機制,利用一個配置檔案來管理所有的代碼權限。
JDK中就有這樣的檔案,就是 jre/lib/security/java.policy ,參考下該檔案,就能了解其中的關系:
上面給出了基本的權限,例如任何人都可以監聽動态端口,以及一些讀操作。
基本過程如下面的圖所示:
使用者如果啟用了安全管理,即在執行時添加了-Djava.security.manager, 就會在執行某些操作前 先讀取 權限檔案java.policy,檢查是否具體相應權限。
當然也可以自己定義安全檔案,一般有兩種方式:
一種是自己建立SecuirtyManager類,建立一些checkXXX的方法,進行驗證;
另一種就是建立my.policy檔案(名字随意),按照規定的文法配置權限,然後啟動時添加-Djava.security.manager-Djava.security.policy=xxxx/my.policy參數。
關于java本身的安全管理不是本篇的重點,下面介紹下tomcat中的安全政策。
Tomcat中的安全管理原理基本與前面JDK中的security類似,隻是啟動時需要在start後面添加-security參數,tomcat會自動讀取 conf/catalina.policy 檔案中的權限配置。啟動指令如下:
catalina.policy中預設已經配置了很多的安全政策,這裡就不多說明了,下個部分會針對某一特定檔案進行說明:
View Code
這裡需要注意的是其配置文法:
都要按照上面的格式進行配置。其中:
codeBase 是通過URL的方式指定檔案,可以使用變量
或者java.home或者{catalina.home}來表示JDK和tomcat的根目錄。
class 指定了相應的操作
[name,[,action]] name指定具體的操作或者檔案,action指定可選的動作(比如read write等等)。
具體的配置樣例,可以參考上面的預設檔案。
另外要說明的就是都可以配置哪些操作,也就是permission後面都可以跟哪些類,他們的作用都是什麼?
上面清單中,最常用的java.io.FilePermission用于檔案的操作、java.lang.RuntimePermission(可以通過禁用該權限達到防止system.exit(1)的目的)等等。
在tomcat中配置security,可以按照下面幾個步驟:
1 在樣例代碼中執行特殊權限操作:
當通路該頁面時,會自動執行下面的代碼,如果不具有相應的權限,會直接報錯:
2 配置安全政策檔案catalina.policy:
隻需要在catalina.policy末尾添加如下的配置即可:
3 在指令行中添加-security啟動
通路JSP執行代碼,樣例中通路 http://localhost:8080/JSPTest/securityTest.jsp
可以看到控制台正常輸出:
對比下正常啟動的輸出,SecurityManager會輸出null(此時,如果JSP中有system.exit(1);程式就會直接退出):
如果沒有配置讀寫檔案的權限,會報錯(注釋掉安全配置的第一句):
如果沒有配置擷取檔案屬性權限,則會報錯:
是以,如果在安全管理模式下,進行了越權的操作,就會報錯有的甚至直接導緻程式退出。
通過報錯資訊,可以快速的知道缺乏什麼權限,根絕該報錯就可以友善的配置安全政策。
【1】Java.security.policy檔案:http://www.tmser.com/post-187.html
【2】Java安全管理器:http://bubuko.com/infodetail-306759.html
【3】tomcat 6.0 security manager:http://tomcat.apache.org/tomcat-6.0-doc/security-manager-howto.html
http://www.cnblogs.com/xing901022/p/4565730.html