Mask sensitive data in logs with logback

后端 未结 6 2088
难免孤独
难免孤独 2020-11-30 04:05

I need to be able to search an event for any one of a number of patterns and replace the text in the pattern with a masked value. This is a feature in our application intend

6条回答
  •  时光说笑
    2020-11-30 04:51

    Here is my approach, maybe it can help somebody

    Try this one. 1. First of all, we should create a class for handling our logs (each row)

    public class PatternMaskingLayout extends PatternLayout {
    
    private Pattern multilinePattern;
    private List maskPatterns = new ArrayList<>();
    
    public void addMaskPattern(String maskPattern) { // invoked for every single entry in the xml
        maskPatterns.add(maskPattern);
        multilinePattern = Pattern.compile(
                String.join("|", maskPatterns), // build pattern using logical OR
                Pattern.MULTILINE
        );
    }
    
    @Override
    public String doLayout(ILoggingEvent event) {
        return maskMessage(super.doLayout(event)); // calling superclass method is required
    }
    
    private String maskMessage(String message) {
        if (multilinePattern == null) {
            return message;
        }
        StringBuilder sb = new StringBuilder(message);
        Matcher matcher = multilinePattern.matcher(sb);
        while (matcher.find()) {
            if (matcher.group().contains("creditCard")) {
                maskCreditCard(sb, matcher);
            } else if (matcher.group().contains("email")) {
                // your logic for this case
            }
        }
        return sb.toString();
    }
    private void maskCreditCard(StringBuilder sb, Matcher matcher) {
        //here is our main logic for masking sensitive data
        String targetExpression = matcher.group();
        String[] split = targetExpression.split("=");
        String pan = split[1];
        String maskedPan = Utils.getMaskedPan(pan);
        int start = matcher.start() + split[0].length() + 1;
        int end = matcher.end();
        sb.replace(start, end, maskedPan);
    }
    

    }

    1. The second step is we should create appender for logback into logback.xml

      
      
          
              creditCard=\d+ 
              %d{dd/MM/yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%ex-->
          
      
      

    2. Now we can use logger into our code

      log.info("card context set for creditCard={}", creditCard);

    3. As a result, we will see

      one row from logs

      card context set for creditCard=11111******111

    without these options, our logs would be like this row

    card context set for creditCard=1111111111111
    

提交回复
热议问题