Maske sensible Daten in Protokollen, die mit logback
Ich muss in der Lage zu suchen, ein event für eine Reihe von mustern und ersetzen Sie den text in das Muster mit einem maskierten Wert. Dies ist eine Funktion, die in unserem Antrag vorgesehen, um zu verhindern, dass vertrauliche Informationen fallen in den logs. Die Informationen können aus einer Vielzahl an Quellen ist es nicht praktisch, Filter anwenden auf alle Eingänge. Daneben gibt es Anwendungen für toString() über die Protokollierung und ich will nicht, toString() auf einheitlich Maske für alle Anrufe (nur logging).
Habe ich versucht, mit den %replace-Methode in logback.xml:
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %replace(%msg){'f k\="pin">(.*?)</f','f k\="pin">**********</f'}%n</pattern>
Dieser erfolgreich war (nach dem ersetzen der Spitzen Klammern mit Zeichen-Entitäten), aber es kann nur ersetzen Sie ein einzelnes Muster. Ich möchte auch ausführen, das äquivalent von
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %replace(%msg){'pin=(.*?),','pin=**********,'}%n</pattern>
zur gleichen Zeit, aber nicht kann. Es gibt keinen Weg, zu maskieren beiden Muster in der ein %ersetzen.
Den anderen Weg, dass wurde Locker besprochen interblags baut etwas auf der appender/encoder - /layout-Hierarchie, aber jeder Versuch zum abfangen des ILoggingEvent hat zu einem Zusammenbruch des gesamten Systems, in der Regel durch Instanziierung Fehler oder UnsupportedOperationException.
Zum Beispiel, ich habe versucht, die Erweiterung PatternLayout:
@Component("maskingPatternLayout")
public class MaskingPatternLayout extends PatternLayout {
@Autowired
private Environment env;
@Override
public String doLayout(ILoggingEvent event) {
String message=super.doLayout(event);
String patternsProperty = env.getProperty("bowdleriser.patterns");
if( patternsProperty != null ) {
String[] patterns = patternsProperty.split("|");
for (int i = 0; i < patterns.length; i++ ) {
Pattern pattern = Pattern.compile(patterns[i]);
Matcher matcher = pattern.matcher(event.getMessage());
matcher.replaceAll("*");
}
} else {
System.out.println("Bowdleriser not cleaning! Naughty strings are getting through!");
}
return message;
}
}
und dann einstellen logback.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<layout class="com.touchcorp.touchpoint.utils.MaskingPatternLayout">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</layout>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/touchpoint.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>logs/touchpoint.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<encoder>
<layout class="com.touchcorp.touchpoint.utils.MaskingPatternLayout">
<pattern>%date{YYYY-MM-dd HH:mm:ss} %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</layout>
</encoder>
</appender>
<logger name="com.touchcorp.touchpoint" level="DEBUG" />
<logger name="org.springframework.web.servlet.mvc" level="TRACE" />
<root level="INFO">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
Ich habe versucht, viele andere Einfügungen, so war ich Frage mich, ob jemand tatsächlich das erreicht, was ich bin versucht, und wenn Sie könnten, bieten keine Hinweise oder eine Lösung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie wrap-layout mit
LayoutWrappingEncoder
. Und auch ich glaube, dass Sie nicht verwenden können, der Frühling hier wie logback ist nicht gelungen, bis zum Frühjahr.Hier ist die aktualisierte Klasse.
- Und sample-logback.xml
UPDATE
Hier den besseren Ansatz, Muster, beim init selbst. so dass wir vermeiden können, Neuerstellung Muster wieder und wieder und diese Umsetzung ist in der Nähe von realistischen Anwendungsfall.
public class MaskingPatternLayout erstreckt PatternLayout {
Und die aktualisierte Konfigurationsdatei.
Ausgabe
@Component
. Muss die Klasse einen Standard-Konstruktor und ein@Autowired
Konstruktor. Die autowired Konstruktor kann dann festlegen, statische Eigenschaften der Klasse, um füllen Sie die erforderlichen Informationen ein. Oder Sie könnenorg.springframework.core.io.support.PathMatchingResourcePatternResolver
zu untersuchen claspath. Dies ist nicht mit Spring-Verzeichnis, sondern ermöglicht es Ihnen, für Dinge zu sehen, wie annotierten Klassen.Aus der Dokumentation:
Muster
p
können beliebig Komplex sein und können insbesondere enthalten Sie mehrere conversion-keywords.Zugewandt gleiche problem mit ersetzen von 2 Muster in einer Nachricht, ich habe gerade versucht
chain
sop
ist nur einen Aufruf ersetzen, in meinem Fall:Super geklappt, obwohl ich Frage mich, wenn ich drücken Sie es ein bisschen und
p
kann ja sein, dass beliebig komplexe.Habe ich Zensoren in https://github.com/tersesystems/terse-logback, die es Ihnen erlauben, zu definieren, eine Zensur in einem Ort und dann finden Sie es in mehrere appenders.
Einen sehr ähnlichen, aber etwas anderen Ansatz entwickelt sich um customizing CompositeConverter, und definieren Sie einen
<conversionRule ...>
innerhalb der logback, die auf die benutzerdefinierte Konverter.In einem meiner tech-demo-Projekte, die ich definiert MaskingConverter - Klasse definiert eine Reihe von mustern, die Protokollierung Ereignis analysiert und auf ein match aktualisiert, die innerhalb meiner logback-Konfiguration.
Als link-nur die Antworten sind es nicht, die Geliebte, die hier SO poste ich die wichtigen Teile des Codes hier und erklären, was es tut und warum er es so eingerichtet. Beginnend mit der Java-basierten benutzerdefinierten Konverter-Klasse:
Diese Klasse definiert eine Reihe von RegEx-Muster der jeweiligen log-Zeile sollte verglichen werden und auf übereinstimmung führen zu einem update der Veranstaltung durch die Maskierung der Passwörter.
Beachten Sie, dass in diesem code-Beispiel wird davon ausgegangen, dass eine log-Zeile enthält nur eine Art Passwort. Sie sind natürlich frei anpassen der bahvior, um Ihre Bedürfnisse in den Fall, Sie wollen zu prüfen, jede Zeile für mehrere Muster entspricht.
Gelten diese Konverter, muss man einfach die folgende Zeile hinzufügen, um die logback-Konfiguration:
definiert eine neue Funktion
mask
die verwendet werden können, in einem Muster, um die Maske alle log-events passend zu jedem definierte Muster in der benutzerdefinierte Konverter. Diese Funktion kann nun dazu verwendet werden, innerhalb eines Musters zu sagen, Logback zum ausführen der Logik auf jedes Ereignis protokollieren. Die jeweiligen Muster könnte etwas entlang der Linien unten:wo
%mask(%msg)
wird, nehmen Sie die original-log-Zeile als Eingabe und führen Sie die Passwort-Maskierung auf jede der Zeilen übergeben, die Funktion.Als probing jede Zeile für einen oder mehrere Muster entspricht, können teuer werden, der Java-code oben enthält Marker, die verwendet werden können, die in den log-Anweisungen zu senden, die bestimmte meta-Informationen über den log-Anweisung selbst zu Logback/SLF4J. Basierend auf diesen Markern unterschiedliche Verhalten könnte erreichbar sein. In dem Szenario präsentiert, ein marker-interface kann verwendet werden, um zu sagen, Logback, dass die jeweiligen log-Zeile enthält vertrauliche Informationen und daher ist Maskierung, wenn es passt. Jede log-Zeile, die nicht als vertraulich gekennzeichnet sind, werden ignoriert von diesem Konverter, der hilft, Pumpen die Linien schneller, da kein pattern matching durchgeführt werden muss auf diesen Linien.
In Java eine solche Markierung kann Hinzugefügt werden, um eine log-Anweisung wie folgt aus:
die möglicherweise erzeugen eine Protokoll-Zeile, die ähnlich
Received basic auth header: Basic QlRXXXlQ=
für die oben genannten benutzerdefinierten Konverter, die Blätter der ersten und letzten der Zeichen im Takt, aber verbirgt die mittleren bits mitXXX
.Ich verwendet habe, zensieren basierend auf RegexCensor aus der Bibliothek https://github.com/tersesystems/terse-logback.
In logback.xml
wo ich die Liste regex-Ersetzungen.
in logback.xml wie diese