我想使用 slf4j 框架屏蔽用户名/密码等敏感数据。立即帮助表示赞赏。提前致谢。
问问题
11828 次
4 回答
4
试试这个。1.首先,我们应该创建一个类来处理我们的日志(每一行)
public class PatternMaskingLayout extends PatternLayout {
private Pattern multilinePattern;
private List<String> 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);
}
}
第二步是我们应该为 logback 创建 appender 到 logback.xml
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="com.bpcbt.micro.utils.PatternMaskingLayout"> <maskPattern>creditCard=\d+</maskPattern> <!-- SourcePan pattern --> <pattern>%d{dd/MM/yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%ex</pattern>--> </layout> </encoder>
现在我们可以在代码中使用 logger
log.info("信用卡上下文设置为 creditCard={}", creditCard);
结果,我们将看到
日志中的一行
为 creditCard=11111******111 设置的卡上下文
如果没有这些选项,我们的日志将像这一行
card context set for creditCard=1111111111111
于 2020-04-22T08:19:27.740 回答
2
也许这个库会有所帮助:owasp-security-logging
它与OWASP 安全日志记录项目相关, 并提供相关功能:
LOGGER.info("userid={}", userid);
LOGGER.info(SecurityMarkers.CONFIDENTIAL, "password={}", password);
目的是在日志中产生以下输出:
2014-12-16 13:54:48,860 [main] INFO - userid=joebob
2014-12-16 13:54:48,860 [main] [CONFIDENTIAL] INFO - password=***********
您可以在Wiki中找到更多信息
于 2019-07-23T13:30:14.263 回答
1
假设您使用的是 Java/Groovy。在您的 log4j2.xml 中,添加如下内容:
<PatternLayout pattern="%mm"/>
然后采用该模式并为其创建一个转换器:
@Plugin(name = 'maskLog', category = 'Converter')
@ConverterKeys(['mm'])
class MaskLogConverter extends LogEventPatternConverter {
private static final String NAME = 'mm'
private MaskLogConverter(String[] options) {
super(NAME, NAME)
}
static LogMaskingConverter newInstance(final String[] options) {
return new LogMaskingConverter(options)
}
@Override
void format(LogEvent event, StringBuilder outputMessage) {
String message = event.message//.formattedMessage
// Do your masking logic here
outputMessage.append(message)
}
}
在该类中,您可以相应地屏蔽、转换、解析等。
于 2017-05-19T18:35:30.923 回答
-9
框架本身不会进行屏蔽,您也不应该期望它这样做。将机密信息传递给报告系统是一种非常糟糕的做法。在您的log.info()
通话中,请确保将密码替换为星号。屏蔽用户名是没有意义的,因为您可能不记录任何内容。
log.info("Successful login: {0} ********", username);
于 2013-05-27T16:05:25.543 回答