Защита веб-приложений Tomcat

tomcat превращает WAR в самодостаточную базу Tomcat. Используются компоненты Tomcat, встроенные в упаковщик; установленный на вашей машине Tomcat не затрагивается.

1. В графическом интерфейсе

  1. На странице типа приложения выберите Tomcat WAR.

    Выбор пункта «Tomcat WAR»

  2. Выберите входной WAR, поставляемую версию Java и целевые платформы, затем укажите простой или расширенный режим.

    Выбор ввода, версии Java, целевой платформы и режима

  3. В расширенном режиме выберите Tomcat 9 или 10.1 либо оставьте автоопределение и при необходимости задайте контекстный путь, параметры запуска JVM и правила исключения. В простом режиме версия Tomcat определяется по результатам сканирования совместимости. Значение каждого параметра описано в разделе Настройки расширенного режима Protector4J.

    Настройка версии Tomcat, контекстного пути и правил исключения

  4. Выберите каталог вывода, просмотрите сводку и нажмите Запустить защиту.

    Выбор каталога вывода и запуск защиты

2. Примеры для командной строки

Указание контекстного пути:

p4j tomcat app.war dist --context /app

Сканирование совместимости и автоматическое применение рекомендаций:

p4j tomcat app.war --compat-scan
p4j tomcat app.war dist --compat-apply --context /app

Эти два параметра нельзя использовать вместе. Различие такое:

ПараметрЧто делаетКогда применять
--compat-scanСканирует входной WAR, выводит риски и рекомендации по настройке и завершает работу. Ничего не кодируется и dist не создаётся, поэтому каталог вывода не нужен.Сначала прочитайте отчёт при первой защите, после обновления связанных с Tomcat зависимостей, после изменения области защиты или настроек JSP, а также при поиске проблем совместимости.
--compat-applyСканирует, применяет осторожные рекомендации и продолжает кодирование с записью результата, поэтому каталог вывода обязателен.Используйте для завершения сборки, когда вы уже прочли результаты сканирования и приняли рекомендации. Подходит и для повторных сборок и конвейеров CI с проверенными правилами.

Для tomcat параметр --compat-apply может добавить правила исключения по результатам сканирования и изменить версию Tomcat, ZIP-слой и суффикс архива. Для этих трёх пунктов приоритет имеет значение, заданное явно в командной строке. Рекомендованные исключения по умолчанию объединяются с вашими шаблонами --exclude; если это не нужно, добавьте --no-compat-excludes. Сканер выполняет только статический эвристический анализ, поэтому проблемы, требующие правки кода, --compat-apply не устраняет, и собранное приложение всё равно нуждается в регрессионном тестировании на целевой платформе.

Остальные команды, полный список параметров, переменные окружения и примеры автоматизации приведены в Справочнике по командной строке.

Значение --tomcat-version по умолчанию — auto. Задайте 9 или 10.1, если нужно указать версию явно:

p4j tomcat app.war dist --context /app --tomcat-version 10.1

3. Структура вывода

dist/
├── bin/
│   ├── catalina.sh
│   ├── startup.sh
│   ├── shutdown.sh
│   └── *.bat
├── conf/p4jx/
│   ├── contexts.list
│   ├── protected-classes.list
│   └── allowed-prefixes.list
├── protected/
│   └── app.p4jx
├── lib/
│   ├── p4jx-tomcat-runtime.jar
│   └── tomcat-runtime-deps.jar
├── vlxjre/
├── run.sh
└── run.bat

Физический WAR по умолчанию не создаётся. Файл web.xml, статические ресурсы, незащищённые классы, заготовки метаданных и защищённые реализации находятся в protected/<контекст>.p4jx и передаются Tomcat через WebResourceSet из P4JX.

4. Запуск и остановка

На переднем плане:

./run.sh

В фоне, как принято в Tomcat:

./bin/startup.sh
./bin/shutdown.sh

В Windows используются соответствующие файлы .bat. Журналы пишутся в каталог logs/ внутри вывода.

Для целей Windows можно дополнительно создать нативное средство запуска, которое поднимает встроенный Tomcat на переднем плане — см. Создание средства запуска Windows EXE.

Параметры запуска JVM

При сборке вводите по одному параметру в строке в поле Параметры запуска JVM графического интерфейса либо задайте их в командной строке:

p4j tomcat app.war dist \
  --context /app \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

Чтобы изменить их в уже развёрнутом пакете:

  • macOS и Linux: отредактируйте bin/catalina.sh и добавьте JVM_OPTS+=("-Xms1g" "-Xmx2g") после строки JVM_OPTS=(...) внутри run_java(). Это действует и при работе на переднем плане, и при запуске через startup.sh.
  • Windows, передний план: отредактируйте bin\catalina.bat и добавьте set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g" после существующей строки set "JVM_OPTS=...".
  • Windows, фон: добавьте set "APP_JAVA_OPTS=-Xms1g -Xmx2g" в bin\startup.bat перед вызовом catalina.bat. Если нужен единый постоянный набор параметров для обоих случаев, проще пересобрать пакет через интерфейс или командную строку.

Можно также поставить APP_JAVA_OPTS перед командой — тогда параметры подействуют только на один запуск. Полные примеры для CMD, PowerShell и сценариев приведены в разделе Параметры запуска JVM.

5. Выбор версии Tomcat

Пространство имён API в WARTomcatТребуемая Java
javax.servlet.*Tomcat 9Java 8, 11, 17, 21 или 25
jakarta.servlet.*Tomcat 10.1Java 11, 17, 21 или 25

Автоопределение сначала выясняет пространство имён по классам приложения и дескрипторам развёртывания; имена JAR служат лишь косвенным признаком. Если используются и javax, и jakarta, средство отказывается угадывать.

6. JSP

Если в WAR есть файлы JSP, при кодировании они предварительно компилируются в классы сервлетов и сопоставления URL. Компиляция JSP во время выполнения создавала бы новые классы из рабочего каталога Tomcat — за пределами границы, в которой защищённая среда выполнения разрешает определять классы.

Этим можно управлять явно:

--precompile-jsp
--no-precompile-jsp

В промышленной среде оставьте предварительную компиляцию включённой. Без неё страницы приложения на JSP могут перестать открываться.

7. Область защиты и правила исключения

По умолчанию защищаются классы приложения в WEB-INF/classes, а WEB-INF/lib остаётся вне защиты. Классы, обращённые к вебу, можно исключить:

p4j tomcat app.war dist \
  --context /app \
  --exclude 'com.example.web.**,com.example.dto.**'

В первую очередь исключите сервлеты, фильтры и слушатели, а также DTO, классы конфигурации, сущности, мосты JNI и всё, что должен дополнять контейнер. Сканирование совместимости предложит осторожные рекомендации.

8. Добавление ещё одного приложения в тот же пакет Tomcat

p4j tomcat second.war dist \
  --append-app \
  --context /second

Ограничения:

  • контекстный путь не должен совпадать с путём уже имеющегося приложения;
  • существующее и новое приложения должны использовать одну и ту же основную версию Tomcat, одну версию Java и одну целевую платформу;
  • без --append-app средство откажется писать в существующий пакет Tomcat;
  • в графическом интерфейсе отметьте Добавить приложение в существующую папку Tomcat и укажите уже созданный каталог.

9. Замечание о Java 8

Для целей Java 8 ZIP-слой включается автоматически, чтобы WebResourceSet из Tomcat смог открыть защищённый архив.