2011-01-05 2 views
5

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

ответ

17

Ред. Версия 0.9.27 введено replacement capability. Замены поддерживают регулярные выражения. Например, если вошедшее сообщение было «Идентификатор_пользователь = алиса, PSWD =„моего секрета“», и шаблон вывода был

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

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

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

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

Предыдущее сообщение журнала будет выводиться как «идента = алиса, PSWD =„ххх“»

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

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

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

+1

Отлично! Я знал, что что-то вроде этого должно быть в вашем отличном продукте. Спасибо за ваш вклад в мир Java! – SingleShot

+0

@Ceki Знаете ли вы, что '% replace (% msg) {...}' работает в сочетании с выражениями оценщика? То есть если я определю что-то вроде '<имя оценщика =" CONFIDENTIAL "> сообщение.содержит ("pw =") || message.contains ("password =") 'Могу ли я применять правила замены только к лог-линиям, которые удовлетворяют CONFIDENTIAL оценке выражений? То есть что-то вроде '% replace (% msg {CONFIDENTIAL}) {'(pw | password) =. *? (% amp; | $)', '$ 1 = XXX $ 2'}' операторы журнала маскируются должным образом, например, попытка замены в каждой строке журнала на основании времени выполнения –

+0

'% amp;' должно быть, конечно, '&' typo с моей стороны, но больше не может редактировать комментарий –

1

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

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

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

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

+0

Спасибо. Я согласен, хотя в этом случае я бы предпочел использовать Logback, если у него есть эта возможность. Притворите его не паролем или XML, и я просто хочу заменить какой-либо текст, который регистрируется. Вот что я хочу знать, как это сделать. – SingleShot

+0

Обновлено мое сообщение (последняя строка) –

+0

Фильтры предназначены для отказа от нежелательных событий журнала. Я не хочу отбрасывать события журнала, но хочу фильтровать/заменять/маскировать сообщения журнала событий, если они отвечают определенным критериям. – SingleShot

Смежные вопросы