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

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

1. Работа с интерфейсом GUI

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

    Выберите Spring Boot

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

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

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

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

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

    Выберите каталог выхода и выполните процедуру защиты

2. Примеры использования CLI

Минимальная команда:

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;
  • Обеспечивает максимальный уровень защиты, подходит для приложений, не зависящих от сканеров classpath от сторонних поставщиков.

fat: компоновка, совместимая с Spring Boot

dist/
├── app.jar
├── app.p4jx              # При использовании суффикса jar становится app-protected.jar
├── vlxjre/
└── run.*

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

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

separate: Раздельная схема совместимости

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

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

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

Как выбрать схему

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

ZIP overlay помогает только инструментам, которые напрямую читают центральную директорию ZIP, и не может заменить физическую структуру Spring Boot, необходимую сканерам ClassLoader/classpath.

4. Запуск

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

Windows:

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

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

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

При пакетировании параметры JVM можно закрепить с помощью JVM startup options в интерфейсе GUI (по одному на строку) или через CLI:

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

Для временного добавления при развертывании:

APP_JAVA_OPTS="-Duser.timezone=Asia/Shanghai" ./run.sh

Также можно напрямую изменить текущий скрипт развертывания:

  • macOS/Linux: Добавьте JVM_OPTS+=("-Xms1g" "-Xmx2g") после уже сгенерированных JVM_OPTS=(...)/JVM_OPTS+=(...) в run.sh.
  • Windows: Добавьте set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g" после уже сгенерированных set "JVM_OPTS=..." в run.bat.

Не удаляйте внутренние параметры, автоматически сгенерированные Spring Boot или JavaFX, такие как --add-opens и module path. Перепакетирование перезапишет ручные изменения; подробности см. в Настройка параметров запуска JVM.

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

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

  • @Controller, @RestController, @ControllerAdvice;
  • Классы @Configuration, автоматическая настройка, классы с улучшениями AOT/CGLIB;
  • Jackson DTO, JPA Entity, 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 overlay, JavaFX и суффиксы архивов. Для этих параметров, кроме классов исключения, имеют приоритет значения, явно указанные в командной строке; рекомендуемые классы исключения по умолчанию объединяются с явно указанными в --exclude. Если не хотите, чтобы классы исключения добавлялись автоматически, можно передать также --no-compat-excludes. Сканер выполняет только статический эвристический анализ; проблемы, требующие изменения кода, не будут автоматически исправлены --compat-apply, и после генерации всё равно необходимо провести тестирование на целевой платформе.

Для сведений о других командах CLI, всех параметрах, переменных среды и примерах автоматизации см. Справка по параметрам CLI.