保护 Log4j 日志中的敏感数据,两步搞定!
👉 这是一个或许对你有用的社群
🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:
《项目实战(视频)》:从书中学,往事上“练” 《互联网高频面试题》:面朝简历学习,春暖花开 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题 《精进 Java 学习指南》:系统学习,互联网主流技术栈 《必读 Java 源码专栏》:知其然,知其所以然
👉这是一个或许对你有用的开源项目
国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。
功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:
Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud 视频教程:https://doc.iocoder.cn
介绍
我们可以通过实现自定义日志附加程序并使用正则表达式来识别和屏蔽敏感信息,从而屏蔽 Spring Boot 应用程序的 log4j 日志中的敏感数据。以下是具体方法实战:
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/
第1步:创建自定义日志 Appender
创建一个扩展 log4j 提供的 AppenderSkeleton
的类。这个自定义appender将在日志消息写入日志之前拦截它们,并应用必要的屏蔽。
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
public class MaskingAppender extends AppenderSkeleton {
@Override
protected void append(LoggingEvent loggingEvent) {
String message = loggingEvent.getMessage().toString();
String maskedMessage = maskSensitiveData(message);
loggingEvent.setMessage(maskedMessage);
super.append(loggingEvent);
}
@Override
public void close() {
// Cleanup resources, if any
}
@Override
public boolean requiresLayout() {
return false;
}
private String maskSensitiveData(String message) {
// Implement your logic to mask sensitive data using regular expressions
// For demonstration purposes, let's assume we want to mask credit card numbers
return message.replaceAll("\\d{4}-\\d{4}-\\d{4}-\\d{4}", "****-****-****-****");
}
}
log4j中的一个appender负责将日志消息写入各种输出中。通过扩展AppenderSkeleton
类,我们创建了一个自定义appender,它可以在将日志消息写入日志之前对其进行修改。
正则表达式(regex)是用于模式匹配和操作字符串的强大模式。在maskSensitiveData()
方法中,我们使用regex来识别和替换敏感数据。在示例中,我们使用模式\\d{4}-\\d{4}-\\d{4}-\\d{4}
匹配格式为“xxxx-xxxx
”的信用卡号,并将其替换为“-
”。
append()方法
log4j在准备添加日志消息时调用此方法。在MaskingAppender
类中,我们覆盖这个方法来拦截日志消息,使用maskSensitiveData()
方法对敏感数据应用masking,然后将修改后的消息传递给超类的append()
方法。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/yudao-cloud 视频教程:https://doc.iocoder.cn/video/
第2步:配置Log4j
在 Spring Boot 应用程序的配置文件中,我们需要配置 log4j 以使用自定义 Appender。我们还需要根据您的要求指定日志级别和其他设置。这是使用 application.properties 配置 log4j 的示例:
# Log4j configuration
log4j.rootLogger=INFO, maskedAppender
log4j.appender.maskedAppender=com.example.MaskingAppender
log4j.appender.maskedAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.maskedAppender.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
第3步:包含 Log4j
确保在Spring Boot应用的构建文件中有必要的log4j依赖项(例如,Maven的pom.xml):
<!-- log4j dependencies -->
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
第4步::测试日志屏蔽
现在,当我们在 Spring Boot 应用程序中使用 log4j 记录消息时,敏感数据将被自动屏蔽。例如:
import org.apache.log4j.Logger;
public class SomeService {
private static final Logger logger = Logger.getLogger(SomeService.class);
public void processSensitiveData(String data) {
logger.info("Processing sensitive data: " + data); // Sensitive data will be masked in the logs
}
}
在应用程序代码中,可以使用log4j提供的Logger来记录消息。在本例中,我们使用logger.info()
记录一条消息。包含敏感数据的日志消息作为字符串连接传递。MaskingAppender拦截此消息并在将其写入日志之前应用掩码。
在上面的例子中,如果数据参数中包含类似“1234—5678—9012—3456
”的信用卡号,那么它将在日志输出中被屏蔽为“正在处理敏感数据:——
”
结论
通过遵循这些步骤和概念,可以有效地屏蔽Spring Boot应用程序log4j日志中的敏感数据。请记住根据我们的特定需求和敏感数据模式调整maskSensitiveData()
方法中的掩码逻辑。
欢迎加入我的知识星球,全面提升技术能力。
👉 加入方式,“长按”或“扫描”下方二维码噢:
星球的内容包括:项目实战、面试招聘、源码解析、学习路线。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
微信扫码关注该文公众号作者