Защита приложений Spring Boot

springboot защищает приложения Spring Boot и обрабатывает BOOT-INF/classes, BOOT-INF/lib, загрузчик Spring Boot и обход фреймворка.

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

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

    Выбор пункта «Spring Boot»

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

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

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

    Настройка расширенных параметров Spring Boot

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

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

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

Самая короткая форма:

p4j springboot app.jar dist

По умолчанию используется макет p4jx-fat. Чтобы выбрать другой явно:

p4j springboot app.jar dist --layout fat
p4j springboot app.jar dist --layout separate

Защита только части приложения:

p4j springboot app.jar dist \
  --protect 'com.example.service.impl.**' \
  --exclude 'com.example.dto.**,com.example.config.**'

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

p4jx-fat: макет по умолчанию, единый защищённый архив

dist/
├── app.p4jx              # с суффиксом jar становится app.jar
├── vlxjre/
├── run.sh
├── run.command
└── run.bat

Особенности:

  • всё приложение поставляется одним архивом P4JX;
  • физический файл по умолчанию не является ZIP;
  • ресурсы Spring Boot, вложенные зависимости и метаданные предоставляются через виртуальное представление JAR;
  • область защиты самая широкая; подходит приложениям, не полагающимся на сторонние сканеры пути классов.

fat: макет совместимости со Spring Boot

dist/
├── app.jar
├── app.p4jx              # с суффиксом jar становится app-protected.jar
├── vlxjre/
└── run.*

Особенности:

  • app.jar сохраняет стандартную физическую структуру BOOT-INF;
  • настоящие реализации защищённых классов находятся в соседнем архиве P4JX;
  • подходит приложениям, которым нужно обходить физическую структуру JAR Spring Boot, например при использовании ClassGraph или Reflections;
  • файлы зависят друг от друга, их нужно обновлять и поставлять вместе.

separate: раздельный макет совместимости

dist/
├── plain-launcher.jar
├── app.p4jx
├── lib/
├── vlxjre/
└── run.*

Особенности:

  • загрузчик Spring Boot, незащищённые классы и зависимости разнесены;
  • подходит старым средам интеграции, где нужен плоский путь классов lib/*;
  • созданное средство запуска предварительно загружает защищённые классы;
  • для новых проектов предпочтителен p4jx-fat либо тот из p4jx-fat и fat, который рекомендует сканер.

Как выбрать макет

СитуацияРекомендуемый макет
Обычная служба Spring Bootp4jx-fat
Приложение действительно использует сканер вроде ClassGraph или Reflectionsfat
Нужен плоский каталог внешних зависимостей или их отдельное шифрованиеseparate
СомневаетесьСначала выполните --compat-scan

ZIP-слой помогает только средствам, читающим центральный каталог ZIP напрямую. Он не заменяет физическую структуру Spring Boot, необходимую ClassLoader и сканерам пути классов.

4. Запуск

./run.sh --spring.profiles.active=prod

В Windows:

run.bat --spring.profiles.active=prod

Не заменяйте каталог vlxjre в выводе системной JRE.

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

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

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

p4j springboot app.jar dist \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

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

APP_JAVA_OPTS="-Duser.timezone=Europe/Moscow" ./run.sh

Можно и напрямую отредактировать развёрнутый сценарий:

  • macOS и Linux: в run.sh добавьте JVM_OPTS+=("-Xms1g" "-Xmx2g") после созданных строк JVM_OPTS=(...) и JVM_OPTS+=(...).
  • Windows: в run.bat добавьте set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g" после созданной строки set "JVM_OPTS=...".

Не удаляйте параметры, созданные упаковщиком для Spring Boot или JavaFX, например --add-opens и путь модулей. Повторная сборка затирает любые ручные правки — подробности в разделе Параметры запуска JVM.

5. Область защиты

По умолчанию защищаются классы приложения в BOOT-INF/classes. Следующие связанные со Spring классы обычно лучше оставить незащищёнными:

  • классы @Controller, @RestController и @ControllerAdvice;
  • классы @Configuration, классы автоконфигурации и классы, дополненные AOT или CGLIB;
  • DTO для Jackson, сущности JPA, record-классы и модели валидации;
  • точка входа приложения и любые классы, которые фреймворк создаёт или оборачивает в прокси напрямую;
  • классы, требующие изменения байт-кода во время выполнения.

Защищайте реализации служб и обращайтесь к ним через публичный фасад или интерфейс. Правила принимают точные имена классов, а также pkg.* и pkg.**.

6. Защита JAR зависимостей

--protect-lib защищает подходящие зависимости в BOOT-INF/lib и работает со всеми тремя макетами.

p4j springboot app.jar dist \
  --protect-lib 'company-core-*.jar,pricing-*.jar'

Защищайте только собственные зависимости с закрытым исходным кодом. Не шифруйте сторонние фреймворки — Spring, Tomcat, библиотеки журналирования, драйверы баз данных — из соображений «защитить побольше».

7. Сканирование совместимости

p4j springboot app.jar --compat-scan
p4j springboot app.jar dist --compat-apply

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

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

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

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