大数跨境
0
0

保护 Log4j 日志中的敏感数据,两步搞定!

保护 Log4j 日志中的敏感数据,两步搞定! 终码一生
2023-10-09
0

点击“终码一生”,关注,置顶公众号

每日技术干货,第一时间送达!

介绍

我们可以通过实现自定义日志附加程序并使用正则表达式来识别和屏蔽敏感信息,从而屏蔽 Spring Boot 应用程序的 log4j 日志中的敏感数据。以下是具体方法实战:

第 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()方法。

第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()方法中的掩码逻辑。

来源:https://medium.com


END


PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦。



往期推荐



牢记这16个SpringBoot 扩展接口,写出更加漂亮的代码

别再使用 RestTemplate了,来了解一下官方推荐的 WebClient !

轻松搞定 Spring 集成缓存,让你的应用程序飞起来!

停止在 SpringBoot 中使用字段注入!

SELECT COUNT(*) 会造成全表扫描?回去等通知吧

Excel 数据导入,如何更优雅的进行数据校验?

面试中的难题:try-catch 异常处理的性能考量


【声明】内容源于网络
0
0
终码一生
开发者聚集地。分享Java相关开发技术(JVM,多线程,高并发,性能调优等),开源项目,常见开发问题和前沿科技资讯!
内容 1876
粉丝 0
终码一生 开发者聚集地。分享Java相关开发技术(JVM,多线程,高并发,性能调优等),开源项目,常见开发问题和前沿科技资讯!
总阅读481
粉丝0
内容1.9k