我使用的是爲Ubuntu Karmic打包的Tomcat 6.0.24。 Ubuntu的Tomcat包的默認安全策略非常嚴格,但看起來很簡單。在/var/lib/tomcat6/conf/policy.d
中,有多種文件可以建立默認策略。如何在Tomcat中合理配置安全策略6
值得注意的開始:
- 我沒有改變股票的tomcat安裝在所有 - 沒有新的罐子到其共同的lib目錄(IES),無
server.xml
變化等把。webapps
目錄中的war文件是唯一的部署操作。 - 我正在部署的Web應用程序失敗,在此默認策略下有數千個訪問拒絕(由於系統屬性爲
-Djava.security.debug="access,stack,failure"
,因此被報告給日誌)。 - 完全關閉安全管理導致沒有錯誤無論如何,和適當的應用功能
我希望做的是應用特定的安全策略文件添加到policy.d
目錄,這似乎是建議的做法。我說這policy.d/100myapp.policy
(作爲起點 - 我想授予權限,最終修剪回只什麼應用程序的實際需要):
grant codeBase "file:${catalina.base}/webapps/ROOT.war" {
permission java.security.AllPermission;
};
grant codeBase "file:${catalina.base}/webapps/ROOT/-" {
permission java.security.AllPermission;
};
grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/-" {
permission java.security.AllPermission;
};
grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/lib/-" {
permission java.security.AllPermission;
};
grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/classes/-" {
permission java.security.AllPermission;
};
注意顛簸各地試圖找到合適的codeBase
聲明。我認爲這可能是我的根本問題。
無論如何,以上(真的只有前兩個贈款似乎有任何效果)幾乎作品:成千上萬的訪問拒絕消失了,我剩下的只有一個。有關堆棧跟蹤:
java.security.AccessControlException: access denied (java.io.FilePermission /var/lib/tomcat6/webapps/ROOT/WEB-INF/classes/com/foo/some-file-here.txt read)
java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
java.security.AccessController.checkPermission(AccessController.java:546)
java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
java.lang.SecurityManager.checkRead(SecurityManager.java:871)
java.io.File.exists(File.java:731)
org.apache.naming.resources.FileDirContext.file(FileDirContext.java:785)
org.apache.naming.resources.FileDirContext.lookup(FileDirContext.java:206)
org.apache.naming.resources.ProxyDirContext.lookup(ProxyDirContext.java:299)
org.apache.catalina.loader.WebappClassLoader.findResourceInternal(WebappClassLoader.java:1937)
org.apache.catalina.loader.WebappClassLoader.findResource(WebappClassLoader.java:973)
org.apache.catalina.loader.WebappClassLoader.getResource(WebappClassLoader.java:1108)
java.lang.ClassLoader.getResource(ClassLoader.java:973)
我敢確信,多數民衆贊成觸發拒絕的實際文件是不相關的 - 它只是一些配置文件,我們檢查可選的配置參數。有趣的是:
- 它不會在這方面
- 的事實,文件不存在,最終拋出一個安全異常,而不是
java.io.File.exists()
簡單地返回false(雖然我認爲這只是存在這是讀取權限的語義問題)。
另一個解決方法(除了剛剛禁止Tomcat中的安全管理器)是一個開放式的許可添加到我的政策文件:
grant {
permission java.security.AllPermission;
};
我想這是功能上等同於關閉安全管理器。
我想我必須在我的贈款中獲得codeBase
聲明微妙的錯誤,但我目前沒有看到它。
是的,所有有問題的文件(包括.war文件和分解的應用程序目錄)都由tomcat6:tomcat6擁有,這是tomcat服務器運行的同一個用戶。 – cemerick 2010-04-19 11:24:47