Я использую Tomcat 6.0.24, как и для Ubuntu Karmic. Политика безопасности по умолчанию для пакета Ubuntu Tomcat довольно жесткая, но выглядит просто. В /var/lib/tomcat6/conf/policy.d
существует множество файлов, которые устанавливают политику по умолчанию.
Стоит отметить в начале:
- Я не изменил установку tomcat вообще - никаких новых банок в его общий каталог lib (ies), no
server.xml
и т.д. Ввод файла .war в каталогwebapps
является единственным развертывания. - Я использую развертывание веб-приложения с тысячами отказов доступа в соответствии с этой политикой по умолчанию (как сообщается в журнале благодаря системному свойству
-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
в моих грантах тонко неправильно, но я не вижу ее в данный момент.