Назначение
Проект предоставляет расширение для 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 |