В настоящее время мы обычно регистрируем все XML-документы, входящие и исходящие из нашей системы, и некоторые из них содержат пароли в открытом виде. Мы хотели бы иметь возможность настроить logback logger/appender, который делает это, чтобы выполнять сопоставление с образцом или что-то подобное, и если он обнаружит пароль, чтобы заменить его (скорее всего, со звездочками). Обратите внимание, что мы не хотим отфильтровывать запись журнала, мы хотим замаскировать ее часть. Я был бы признателен за совет о том, как это будет сделано с помощью logback. Спасибо.
Маскировать пароли с помощью Logback?
Ответы (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, если вам нужна дополнительная помощь.
%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
%amp;
, конечно, должно быть &
опечатка с моей стороны, но я больше не могу редактировать комментарий
- person Roman Vottner; 22.06.2017
Я считаю, что маскировка — это аспект вашего бизнеса, а не аспект какой-либо технологии или системы регистрации. Бывают ситуации, когда пароли, национальные идентификаторы и т. д. должны быть замаскированы при их хранении в БД, в том числе по юридическим причинам. Вы должны иметь возможность замаскировать xml, прежде чем передать его регистратору.
Один из способов сделать это - запустить XML через XSLT, который делает это, а затем передать его регистратору для регистрации.
Если вы не хотите этого делать, LogBack имеет поддержку фильтров, которая является одной из вариант (хотя и не правильный).
Но имейте в виду, что любое стандартное готовое решение, которое вы пытаетесь найти на уровне инфраструктуры ведения журналов, будет неоптимальным, поскольку каждое сообщение журнала будет проверяться на маскировку.