Маскировать пароли с помощью Logback?

В настоящее время мы обычно регистрируем все XML-документы, входящие и исходящие из нашей системы, и некоторые из них содержат пароли в открытом виде. Мы хотели бы иметь возможность настроить logback logger/appender, который делает это, чтобы выполнять сопоставление с образцом или что-то подобное, и если он обнаружит пароль, чтобы заменить его (скорее всего, со звездочками). Обратите внимание, что мы не хотим отфильтровывать запись журнала, мы хотим замаскировать ее часть. Я был бы признателен за совет о том, как это будет сделано с помощью logback. Спасибо.


person SingleShot    schedule 05.01.2011    source источник


Ответы (2)


Версия logback 0.9.27 представила возможность замены. Замены поддерживают регулярные выражения. Например, если зарегистрированное сообщение было «userid=alice, pswd='my secret'», а шаблон вывода был

  "%d [%t] $logger - %msg%n",

вы просто изменяете шаблон на

 "%d [%t] $logger - %replace(%msg){"pswd='.*'", "pswd='xxx'"}%n"

Обратите внимание, что в приведенном выше примере используется цитирование параметров.

Предыдущее сообщение журнала будет выводиться как "userid=alice, pswd='xxx'"

Для максимальной производительности вы также можете пометить оператор журнала как КОНФИДЕНЦИАЛЬНО и указать %replace выполнять замену только для операторов журнала, помеченных как КОНФИДЕНЦИАЛЬНО. Пример,

 Marker confidential = MarkerFactory.getMarker("CONFIDENTIAL");
 logger.info(confidential, "userid={}, password='{}'", userid, password);

К сожалению, текущая версия logback еще не поддерживает условные замены (на основе маркеров или иным образом). Однако вы можете легко написать свой собственный код замены, расширив ReplacingCompositeConverter. Пишите в список рассылки logback-user, если вам нужна дополнительная помощь.

person Ceki    schedule 07.01.2011
comment
Здорово! Я знал, что что-то подобное должно быть в вашем превосходном продукте. Спасибо за ваш вклад в мир Java! - person SingleShot; 07.01.2011
comment
@Ceki Знаете ли вы, работает ли %replace(%msg){...} в сочетании с выражениями оценщика? т.е. если я определяю что-то вроде <evaluator name="CONFIDENTIAL"><expression>message.contains("pw=") || message.contains("password=")</expression></evaluator>, могу ли я применять правила замены только к строкам журнала, которые соответствуют оценщику выражений CONFIDENTIAL? т.е. что-то вроде %replace(%msg{CONFIDENTIAL}){'(pw|password)=.*?(%amp;|$)', '$1=XXX$2'} операторы журнала маскируются правильно, хотя кажется, что замена предпринимается для каждой строки журнала в зависимости от времени выполнения - person Roman Vottner; 22.06.2017
comment
%amp;, конечно, должно быть &amp; опечатка с моей стороны, но я больше не могу редактировать комментарий - person Roman Vottner; 22.06.2017

Я считаю, что маскировка — это аспект вашего бизнеса, а не аспект какой-либо технологии или системы регистрации. Бывают ситуации, когда пароли, национальные идентификаторы и т. д. должны быть замаскированы при их хранении в БД, в том числе по юридическим причинам. Вы должны иметь возможность замаскировать xml, прежде чем передать его регистратору.

Один из способов сделать это - запустить XML через XSLT, который делает это, а затем передать его регистратору для регистрации.

Если вы не хотите этого делать, LogBack имеет поддержку фильтров, которая является одной из вариант (хотя и не правильный).

Но имейте в виду, что любое стандартное готовое решение, которое вы пытаетесь найти на уровне инфраструктуры ведения журналов, будет неоптимальным, поскольку каждое сообщение журнала будет проверяться на маскировку.

person Aravind Yarram    schedule 05.01.2011
comment
Спасибо. Я согласен, хотя в этом случае я бы предпочел использовать Logback, если у него есть такая возможность. Притворись, что это не пароль или XML, и я просто хочу заменить некоторый записываемый текст. Вот что я хочу знать, как это сделать. - person SingleShot; 06.01.2011
comment
Фильтры предназначены для отбрасывания нежелательных событий журнала. Я не хочу отбрасывать события журнала, но хочу фильтровать/заменять/маскировать сообщения о событиях журнала, если они соответствуют определенным критериям. - person SingleShot; 06.01.2011
comment
Я согласен, но просто хотел поделиться тем, что если вы не нашли подходящих вариантов, то это может быть одним из подходящих вариантов. - person Aravind Yarram; 06.01.2011
comment
Спасибо за вашу помощь. Это неоптимально только на уровне конкретного экземпляра регистратора (или приложения) (регистратор/аппендер, который регистрирует XML-сообщения), но да. - person SingleShot; 06.01.2011