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">(.*?)&lt;/f','f k\="pin">**********&lt;/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.

Schreibe einen Kommentar