Маскирование конфиденциальных данных перед регистрацией - log4j

В целях ведения журнала вместо использования метода toString() в проекте, над которым я работал, использовался метод Джексона writeValueAsString(object).

LOGGER.info(mapper.writeValueAsString(object));

Теперь я получил требование маскировать конфиденциальную информацию, такую ​​как пароли и номера кредитных карт, в журналах. Если используется toString(), я мог бы удалить эти конфиденциальные данные из метода toString(). Но в моем случае я не смог найти такого простого, но правильного способа решения моей проблемы. Я не в ситуации, когда я могу изменить все, чтобы использовать toString().

Я прочитал, что, используя метод %replace, я могу заменить данные, которые мне не нужно регистрировать, используя предопределенный шаблон. Но все конфиденциальные данные, которые необходимо замаскировать, не будут следовать единому шаблону.

Я попытался перехватить событие журнала, найти конкретную информацию и замаскировать ее (используя класс, реализующий LogEventFactory). Несмотря на то, что это рабочее решение, я не думаю, что это хорошее решение, поскольку поиск данных в больших строках каждый раз будет стоить дорого.

Есть ли способ, с которым я еще не сталкивался, чтобы решить мою проблему? Является ли подход с %replace правильным? Если да, то как?


person vigamage    schedule 07.03.2018    source источник
comment
Меня это интересует. Вы нашли хороший способ решить свою проблему?   -  person disklosr    schedule 10.07.2018
comment
попробуйте этот способ stackoverflow.com/a/61360391/7697901   -  person Aliaksandr Kavalenka    schedule 22.04.2020


Ответы (1)


Я думаю, что есть три способа решить вашу проблему, которые вы все рассмотрели. Самый эффективный способ - предотвратить регистрацию конфиденциальных данных в регистраторе, для чего вам потребуется много работы.

И второй способ - изменить Appender. Расширяя log4j Appenders, вы изменяете файл LogEvent.

И последний способ - изменить PatternLayout. Вот пример.

public class CardNumberFilteringLayout extends PatternLayout {
    private static final String MASK = "$1++++++++++++";
    private static final Pattern PATTERN = Pattern.compile("([0-9]{4})([0-9]{9,15})");

    @Override
    public String format(LoggingEvent event) {
        if (event.getMessage() instanceof String) {
            String message = event.getRenderedMessage();
            Matcher matcher = PATTERN.matcher(message);

            if (matcher.find()) {
                String maskedMessage = matcher.replaceAll(MASK);
                @SuppressWarnings({ "ThrowableResultOfMethodCallIgnored" })
                Throwable throwable = event.getThrowableInformation() != null ? 
                        event.getThrowableInformation().getThrowable() : null;
                LoggingEvent maskedEvent = new LoggingEvent(event.fqnOfCategoryClass,
                        Logger.getLogger(event.getLoggerName()), event.timeStamp, 
                        event.getLevel(), maskedMessage, throwable);

                return super.format(maskedEvent);
            }
        }
        return super.format(event);
    }
}
person einverne    schedule 21.12.2018
comment
Привет! Предположим, я хочу получить поле MASK из application.properties с аннотацией atValue. Как только я добавляю atValue, поля не загружаются. Есть идеи, как загрузить свойства? - person dasun_001; 04.02.2021