Open Source

log4j2-masking-lib

Плагин для Log4j2 для маскирования чувствительных данных в логах с поддержкой гибких правил по полям и регулярным выражениям.

Назначение

Проект предоставляет расширение для Log4j2, которое автоматически применяет правила маскирования к полям и регулярным выражениям в тексте лога. Это снижает риск утечки персональных данных и токенов доступа в журналы событий.

Подключение

Maven

<dependency>
    <groupId>ru.romanow-alex</groupId>
    <artifactId>log4j2-masking-lib</artifactId>
    <version>${log-masking-lib.version}</version>
</dependency>

Gradle

testImplementation "ru.romanow-alex:log4j2-masking-lib:$logMaskingVersion"

Конфигурация правил

Базовые правила задаются в resources/logging/rules.yml.

Дополнительные правила можно определить в resources/logging/additional-rules.yml.

masking:
  - field: 'fullName'
    type: FULL_NAME
  - field: 'lastName'
    type: NAME
  - field: 'email'
    type: EMAIL
  - field: 'JWT'
    type: TEXT
  - regex: '(?:JWT|Authorization)\s*(?::|=)\s*(.+)'
    type: TEXT

Интеграция с Log4j2

Маскирование реализовано через плагин MaskingConverter. Для регистрации плагина используется annotation processor org.apache.logging.log4j:log4j-core, формирующий Log4j2Plugins.dat.

В шаблоне логирования конвертер вызывается через шаблон %mask{ %msg }:

<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %mask{ %msg }%n"/>

Правила маскирования

Тип правила Поведение Пример
EMAIL Сохраняется первый символ локальной части и домен, остальное маскируется.
Входная строка: "email":"romanowalex@mail.ru"
Результат: "email":"r**********@mail.ru"
NAME Для длинных значений сохраняются первые символы и хвост; короткие маскируются почти полностью.
Входная строка: "lastName":"Скалозубов"
Результат: "lastName":"Ск***в"
FULL_NAME Маскирование применяется к фамилии и отдельным частям ФИО с учетом формата записи.
Входная строка: "fullName":"Романов Алексей Сергеевич"
Результат: "fullName":"Р****** Алексей Се***ч"
TEXT Стратегия зависит от длины строки (от полного скрытия коротких значений до частичного скрытия длинных).
Входная строка: "code":"12345678901234567"
Результат: "code":"123***********567"
TEXT (regex) Маскирование чувствительных сегментов по регулярному выражению, например для Authorization/JWT.
Входная строка: Authorization : Bearer eyJ...
Результат: Authorization : Bea**************************R5cCI6IkpXVCJ9