Подтвердить что ты не робот

Как безопасно настроить политику безопасности в Tomcat 6

Я использую 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 в моих грантах тонко неправильно, но я не вижу ее в данный момент.

4b9b3361

Ответ 1

Используете ли вы версию Ubuntu с пакетом? Недавно у нас был кошмар с материалами безопасности, но выяснилось, что, загружая Tomcat отдельно и используя это, проблемы безопасности ушли.

Подтверждение:

http://www.howtogeek.com/howto/linux/installing-tomcat-6-on-ubuntu/

Если вы используете Ubuntu и хотите использовать контейнер сервлетов Tomcat, вы не должны использовать версию из репозиториев, поскольку она просто не работает правильно. Вместо этого вам нужно будет использовать ручной процесс установки, который здесь обозначается Im.

Ответ 2

Tomcat работает со своим собственным пользователем tomcat. Файлы войны должны быть видны этому пользователю - возможно, стоит сначала проверить это?

Ответ 3

Вы непосредственно развертываете в каталоге ROOT?

Обычно, когда вы кладете войну в папку webapps, скажем 100myapp.war, она распаковывается в папку с именем 100myapp. Разве не следует делать гранты в этой новой папке, а не в папке ROOT?

Ответ 4

Возможно, вам необходимо предоставить разрешения на доступ к файлам отдельно. Попробуйте изменить грант для своего приложения:

grant codeBase "file:${catalina.base}/webapps/ROOT.war" {
  permission java.security.AllPermission;
  permission java.io.FilePermission "file:${catalina.base}/webapps/ROOT/-", "read, write";
}

Если это не сработает, то может быть, что какой-то код за пределами того, что покрывает ваши существующие гранты, обращается к этим файлам свойств (например, сервлет или другой код библиотеки).

В качестве обходного пути и для подтверждения, если это так, вы можете сделать прямой грант на .properties, которые вызывают проблему:

grant {
  permission java.io.FilePermission "file:${catalina.base}/webapps/ROOT/WEB-INF/classes/com/foo/some-file-here.txt", "read, write";
}

Похоже, что последнее может иметь место, поскольку трассировка стека показывает код в загрузчике контекста Tomcat. Если выполняется прямое предоставление свойств .properties, вы можете заблокировать грант до org.apache.naming.resources.FileDirContext.

Есть ли у вас трассировки стека, специфичные для вашего собственного кода?