Apache DolphinScheduler日志脱敏配置:敏感信息保护与合规实践

Apache DolphinScheduler日志脱敏配置:敏感信息保护与合规实践

【免费下载链接】dolphinscheduler Apache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code 【免费下载链接】dolphinscheduler 项目地址: https://gitcode.com/gh_mirrors/dolp/dolphinscheduler

在数据密集型工作流平台中,日志记录着系统运行的关键信息,但也可能包含数据库密码、API密钥等敏感数据。Apache DolphinScheduler通过内置的日志脱敏机制,在不影响调试能力的前提下保护敏感信息,满足相关法律法规要求。本文将从配置实践、原理分析到自定义扩展,全面介绍日志脱敏方案的实施路径。

日志脱敏核心组件与工作原理

DolphinScheduler的日志脱敏功能通过两大核心模块实现:敏感数据转换器日志切面处理器,形成覆盖日志产生、流转、输出的全链路防护。

脱敏转换器架构

核心处理类SensitiveDataConverter实现了Logback的MessageConverter接口,通过正则匹配对日志消息进行实时转换。其工作流程如下:

  1. 日志拦截:通过Logback框架拦截所有格式化日志消息
  2. 模式匹配:使用预编译正则表达式识别敏感字段(如password=开头的键值对)
  3. 替换处理:将匹配到的敏感值替换为等长星号(*)字符

关键实现代码位于org/apache/dolphinscheduler/server/log/SensitiveDataConverter.java

@Override
public String convert(ILoggingEvent event) {
    // 获取原始日志
    String requestLogMsg = event.getFormattedMessage();
    // 脱敏处理
    return convertMsg(requestLogMsg);
}

private String convertMsg(final String oriLogMsg) {
    String tempLogMsg = oriLogMsg;
    if (!StringUtils.isEmpty(tempLogMsg)) {
        // 应用密码脱敏规则
        tempLogMsg = passwordHandler(pwdPattern, tempLogMsg);
    }
    return tempLogMsg;
}

API请求日志防护

针对REST API接口的输入输出数据,系统通过AccessLogAspect切面类实现请求参数脱敏。该切面会拦截所有标注@AccessLogAnnotation的控制器方法,对请求参数中的敏感字段进行掩码处理。核心逻辑见org/apache/dolphinscheduler/api/aspect/AccessLogAspect.java

protected String handleSensitiveData(String originalData) {
    Matcher matcher = sensitiveDataPattern.matcher(originalData.toLowerCase());
    IntStream stream = IntStream.builder().build();
    boolean exists = false;
    while (matcher.find()) {
        if (matcher.groupCount() == 3) {
            // 标记敏感数据位置
            stream = IntStream.concat(stream, IntStream.range(matcher.end(1),matcher.end(2)));
            exists = true;
        }
    }
    if (exists) {
        char[] chars = originalData.toCharArray();
        stream.forEach(idx -> chars[idx] = '*');
        return new String(chars);
    }
    return originalData;
}

默认脱敏规则与配置方法

DolphinScheduler默认提供了密码字段的脱敏保护,用户可通过修改日志配置文件和正则表达式实现基础防护。

配置文件位置

系统各模块使用独立的Logback配置文件,均位于对应模块的src/main/resources目录下:

启用脱敏转换器

在日志配置文件中,通过converterClass参数指定脱敏转换器:

<appender name="TASKLOGFILE" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator>
        <key>taskAppId</key>
        <defaultValue>default</defaultValue>
    </discriminator>
    <sift>
        <appender name="FILE-${taskAppId}" class="ch.qos.logback.core.FileAppender">
            <file>${log.base}/${taskAppId}.log</file>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
                <!-- 配置敏感数据转换器 -->
                <converter class="org.apache.dolphinscheduler.server.log.SensitiveDataConverter" />
            </encoder>
        </appender>
    </sift>
</appender>

默认脱敏规则

系统默认通过Constants.DATASOURCE_PASSWORD_REGEX定义密码匹配规则,其正则表达式为:

// 匹配形式如 "password=123456" 或 "password:'abc'" 的字符串
public static final String DATASOURCE_PASSWORD_REGEX = "(password=|password=')([^&']+)(&|')";

该规则会匹配以下格式的敏感数据:

  • password=123456 → 转换为 password=******
  • password:'abc123' → 转换为 password:'******'
  • jdbc:mysql://host/db?user=root&password=secret → 转换为 jdbc:mysql://host/db?user=root&password=******

自定义脱敏规则实践

当默认规则无法满足业务需求(如需要脱敏手机号、身份证号等)时,可通过扩展正则表达式和转换器实现定制化防护。

扩展敏感数据转换器

  1. 创建自定义转换器:继承SensitiveDataConverter并添加新的脱敏规则
public class ExtendedSensitiveDataConverter extends SensitiveDataConverter {
    // 添加手机号脱敏规则 (11位数字)
    private final Pattern phonePattern = Pattern.compile("1[3-9]\\d{9}");
    
    @Override
    protected String convertMsg(String oriLogMsg) {
        String processed = super.convertMsg(oriLogMsg);
        // 应用手机号脱敏
        processed = phoneHandler(phonePattern, processed);
        return processed;
    }
    
    private String phoneHandler(Pattern pattern, String logMsg) {
        Matcher matcher = pattern.matcher(logMsg);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            String phone = matcher.group();
            // 保留前3后4位,中间用*代替
            String masked = phone.substring(0,3) + "****" + phone.substring(7);
            matcher.appendReplacement(sb, masked);
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
}
  1. 更新Logback配置:在logback-*.xml中替换为自定义转换器
<converter class="com.company.dolphinscheduler.ExtendedSensitiveDataConverter" />

调整API请求脱敏规则

修改AccessLogAspect中的敏感数据正则表达式,添加新的脱敏模式:

// 原规则:仅匹配password字段
private static final String sensitiveDataRegEx = "(password=[\'\"]+)(\\S+)([\'\"]+)";

// 扩展规则:增加身份证号脱敏
private static final String sensitiveDataRegEx = 
    "(password=[\'\"]+)(\\S+)([\'\"]+)|" +  // 密码
    "([1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx])";  // 身份证号

脱敏效果验证与测试

单元测试验证

DolphinScheduler提供了脱敏功能的单元测试用例,可通过执行SensitiveDataConverterTest.java验证规则有效性:

@Test
public void testPasswordHandler() {
    String testLog = "Connecting to database with password=secret123 and user=admin";
    String expected = "Connecting to database with password=******** and user=admin";
    assertEquals(expected, SensitiveDataConverter.passwordHandler(
        Pattern.compile(Constants.DATASOURCE_PASSWORD_REGEX), testLog));
}

集成测试方法

  1. 启动服务:通过install.sh脚本部署测试环境
  2. 触发日志:提交包含敏感数据的工作流任务(如配置带有密码的数据源连接)
  3. 检查日志文件:查看对应服务的日志输出,确认敏感字段已被正确脱敏
# 查看API服务日志
tail -f dolphinscheduler-api/logs/dolphinscheduler-api.log
# 查看Worker任务日志
tail -f dolphinscheduler-server/logs/worker/xxx.log

最佳实践与注意事项

性能优化建议

  1. 正则表达式优化

    • 使用预编译Pattern(Pattern.compile())避免重复编译
    • 复杂规则拆分为多个简单正则,减少回溯
    • 对长日志进行长度限制,避免超长字符串匹配
  2. 日志分级处理

    • 生产环境使用INFO级别,减少冗余日志
    • 敏感操作单独记录审计日志,与普通日志分离存储

合规审计建议

  1. 日志留存策略

    • 脱敏后的日志需保留足够时长,满足相关要求
    • 使用logback-rolling.xml配置日志轮转
  2. 审计跟踪

    • 记录脱敏规则变更历史
    • 通过AccessLogAspect记录管理员操作,确保可追溯性

常见问题排查

  1. 脱敏不生效

    • 检查Logback配置是否正确引用转换器
    • 确认日志级别是否为INFO及以上(DEBUG级别可能绕过某些转换器)
    • 验证正则表达式是否与目标字符串格式匹配
  2. 过度脱敏

    • 通过单元测试覆盖边界场景(如包含password的正常单词)
    • 对非敏感字段使用排除规则,如(?i)(?<!non-sensitive-)password=...

总结与展望

Apache DolphinScheduler通过灵活的日志脱敏机制,为数据工作流平台提供了基础的敏感信息保护能力。通过本文介绍的配置方法,管理员可快速启用默认防护,并根据业务需求扩展自定义规则。未来版本可能会引入基于SPI的脱敏插件机制,允许用户通过配置文件定义脱敏规则,进一步降低定制化门槛。

合规之路永无止境,建议结合企业实际建立数据分级分类制度,对不同级别敏感数据实施差异化保护策略。定期查阅官方安全指南更新日志,及时获取安全补丁和功能增强信息。

【免费下载链接】dolphinscheduler Apache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code 【免费下载链接】dolphinscheduler 项目地址: https://gitcode.com/gh_mirrors/dolp/dolphinscheduler

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值