CI pre-commit Release Codecov License

Masking library for 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"

Реализация

Для маскирования логов используется плагин MaskingConverter.

Для его подключения используется annotation processor org.apache.logging.log4j:log4j-core, который собирает плагины в $buildDir/tmp/kapt3/classes/main/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat.

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


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

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

Тип поля:

  • email –> romanowalex@mail.ru -> r**********@mail.ru.
  • firstName –> не маскируется.
  • lastName, middleName –> if (name.length > 7) Ab*****c else A*****.
  • text –> в зависимости от длины:
    • 1 -> *;
    • 1..4 -> 1234 -> 1***;
    • 5..9 -> 123456789 -> 1******89 (length * 60%);
    • 10..15 -> 12345678901 -> 12*******01 (length * 60%);
    • 16 + -> 12345678901234567 -> 123***********567 (length * 60%);

Правила описаны в 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