From 38b876733c0ac30ebeeeb9c679687834bb2d6009 Mon Sep 17 00:00:00 2001 From: rickchengx <38122586+rickchengx@users.noreply.github.com> Date: Thu, 24 Nov 2022 14:54:54 +0800 Subject: [PATCH] [Feature-10498] Mask the password in the log of sqoop task (#11589) --- docs/docs/en/architecture/design.md | 2 +- docs/docs/zh/architecture/design.md | 2 +- .../common}/log/SensitiveDataConverter.java | 47 +++++++------------ .../log/SensitiveDataConverterTest.java | 27 +++-------- .../src/main/resources/logback-spring.xml | 2 +- .../src/main/resources/logback-spring.xml | 2 +- .../plugin/task/sqoop/SqoopConstants.java | 1 + .../plugin/task/sqoop/SqoopTask.java | 3 ++ .../plugin/task/sqoop/SqoopTaskTest.java | 38 +++++++++++++++ .../src/main/resources/logback-spring.xml | 2 +- 10 files changed, 70 insertions(+), 56 deletions(-) rename {dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service => dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common}/log/SensitiveDataConverter.java (70%) rename {dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service => dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common}/log/SensitiveDataConverterTest.java (68%) create mode 100644 dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/test/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopTaskTest.java diff --git a/docs/docs/en/architecture/design.md b/docs/docs/en/architecture/design.md index c174f79867..26f60d9761 100644 --- a/docs/docs/en/architecture/design.md +++ b/docs/docs/en/architecture/design.md @@ -197,7 +197,7 @@ In the early schedule design, if there is no priority design and use the fair sc - For details, please refer to the logback configuration of Master and Worker, as shown in the following example: ```xml - + diff --git a/docs/docs/zh/architecture/design.md b/docs/docs/zh/architecture/design.md index 14a7b91142..dbfb1c1613 100644 --- a/docs/docs/zh/architecture/design.md +++ b/docs/docs/zh/architecture/design.md @@ -195,7 +195,7 @@ - 详情可参考Master和Worker的logback配置,如下示例: ```xml - + diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/log/SensitiveDataConverter.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/SensitiveDataConverter.java similarity index 70% rename from dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/log/SensitiveDataConverter.java rename to dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/SensitiveDataConverter.java index 4bb486735c..57b2bcde59 100644 --- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/log/SensitiveDataConverter.java +++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/log/SensitiveDataConverter.java @@ -15,11 +15,15 @@ * limitations under the License. */ -package org.apache.dolphinscheduler.service.log; +package org.apache.dolphinscheduler.common.log; import org.apache.dolphinscheduler.common.constants.Constants; import org.apache.dolphinscheduler.common.constants.DataSourceConstants; +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.HashSet; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -33,10 +37,9 @@ import com.google.common.base.Strings; */ public class SensitiveDataConverter extends MessageConverter { - /** - * password pattern - */ - private final Pattern pwdPattern = Pattern.compile(DataSourceConstants.DATASOURCE_PASSWORD_REGEX); + private static Pattern multilinePattern; + private static HashSet maskPatterns = + new HashSet<>(Arrays.asList(DataSourceConstants.DATASOURCE_PASSWORD_REGEX)); @Override public String convert(ILoggingEvent event) { @@ -45,41 +48,25 @@ public class SensitiveDataConverter extends MessageConverter { String requestLogMsg = event.getFormattedMessage(); // desensitization log - return convertMsg(requestLogMsg); + return maskSensitiveData(requestLogMsg); } - /** - * deal with sensitive log - * - * @param oriLogMsg original log - */ - private String convertMsg(final String oriLogMsg) { + public static void addMaskPattern(String maskPattern) { + maskPatterns.add(maskPattern); + } - String tempLogMsg = oriLogMsg; - - if (!Strings.isNullOrEmpty(tempLogMsg)) { - tempLogMsg = passwordHandler(pwdPattern, tempLogMsg); + public static String maskSensitiveData(final String logMsg) { + if (StringUtils.isEmpty(logMsg)) { + return logMsg; } - return tempLogMsg; - } - - /** - * password regex - * - * @param logMsg original log - */ - static String passwordHandler(Pattern pwdPattern, String logMsg) { - - Matcher matcher = pwdPattern.matcher(logMsg); + multilinePattern = Pattern.compile(String.join("|", maskPatterns), Pattern.MULTILINE); StringBuffer sb = new StringBuffer(logMsg.length()); + Matcher matcher = multilinePattern.matcher(logMsg); while (matcher.find()) { - String password = matcher.group(); - String maskPassword = Strings.repeat(Constants.STAR, password.length()); - matcher.appendReplacement(sb, maskPassword); } matcher.appendTail(sb); diff --git a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/log/SensitiveDataConverterTest.java b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/log/SensitiveDataConverterTest.java similarity index 68% rename from dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/log/SensitiveDataConverterTest.java rename to dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/log/SensitiveDataConverterTest.java index 9f64b6ef95..8d7b4af2c4 100644 --- a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/log/SensitiveDataConverterTest.java +++ b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/log/SensitiveDataConverterTest.java @@ -15,13 +15,7 @@ * limitations under the License. */ -package org.apache.dolphinscheduler.service.log; - -import static org.apache.dolphinscheduler.service.log.SensitiveDataConverter.passwordHandler; - -import org.apache.dolphinscheduler.common.constants.DataSourceConstants; - -import java.util.regex.Pattern; +package org.apache.dolphinscheduler.common.log; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -32,11 +26,6 @@ public class SensitiveDataConverterTest { private final Logger logger = LoggerFactory.getLogger(SensitiveDataConverterTest.class); - /** - * password pattern - */ - private final Pattern pwdPattern = Pattern.compile(DataSourceConstants.DATASOURCE_PASSWORD_REGEX); - private final String logMsg = "{\"address\":\"jdbc:mysql://192.168.xx.xx:3306\"," + "\"database\":\"carbond\"," + "\"jdbcUrl\":\"jdbc:mysql://192.168.xx.xx:3306/ods\"," @@ -49,21 +38,17 @@ public class SensitiveDataConverterTest { + "\"user\":\"view\"," + "\"password\":\"*****\"}"; - @Test - public void convert() { - Assertions.assertEquals(maskLogMsg, passwordHandler(pwdPattern, logMsg)); - } - /** * mask sensitive logMsg - sql task datasource password */ @Test public void testPwdLogMsgConverter() { - logger.info("parameter : {}", logMsg); - logger.info("parameter : {}", passwordHandler(pwdPattern, logMsg)); + final String maskedLog = SensitiveDataConverter.maskSensitiveData(logMsg); - Assertions.assertNotEquals(logMsg, passwordHandler(pwdPattern, logMsg)); - Assertions.assertEquals(maskLogMsg, passwordHandler(pwdPattern, logMsg)); + logger.info("original parameter : {}", logMsg); + logger.info("masked parameter : {}", maskedLog); + + Assertions.assertEquals(maskLogMsg, maskedLog); } diff --git a/dolphinscheduler-master/src/main/resources/logback-spring.xml b/dolphinscheduler-master/src/main/resources/logback-spring.xml index 6b9f3a7b79..9926eff21d 100644 --- a/dolphinscheduler-master/src/main/resources/logback-spring.xml +++ b/dolphinscheduler-master/src/main/resources/logback-spring.xml @@ -28,7 +28,7 @@ + converterClass="org.apache.dolphinscheduler.common.log.SensitiveDataConverter"/> diff --git a/dolphinscheduler-standalone-server/src/main/resources/logback-spring.xml b/dolphinscheduler-standalone-server/src/main/resources/logback-spring.xml index 59da2de6d6..ee7c5414f4 100644 --- a/dolphinscheduler-standalone-server/src/main/resources/logback-spring.xml +++ b/dolphinscheduler-standalone-server/src/main/resources/logback-spring.xml @@ -48,7 +48,7 @@ + converterClass="org.apache.dolphinscheduler.common.log.SensitiveDataConverter"/> diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopConstants.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopConstants.java index f4861eb4fb..1a2ce19b9a 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopConstants.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopConstants.java @@ -72,4 +72,5 @@ public final class SqoopConstants { public static final String UPDATE_KEY = "--update-key"; public static final String UPDATE_MODE = "--update-mode"; + public static final String SQOOP_PASSWORD_REGEX = "(?<=(--password \")).+?(?=\")"; } diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopTask.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopTask.java index 4df286aeec..c2eb473ce7 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopTask.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/main/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopTask.java @@ -17,6 +17,7 @@ package org.apache.dolphinscheduler.plugin.task.sqoop; +import org.apache.dolphinscheduler.common.log.SensitiveDataConverter; import org.apache.dolphinscheduler.common.utils.JSONUtils; import org.apache.dolphinscheduler.plugin.task.api.AbstractYarnTask; import org.apache.dolphinscheduler.plugin.task.api.TaskExecutionContext; @@ -67,6 +68,8 @@ public class SqoopTask extends AbstractYarnTask { sqoopTaskExecutionContext = sqoopParameters.generateExtendedContext(taskExecutionContext.getResourceParametersHelper()); + + SensitiveDataConverter.addMaskPattern(SqoopConstants.SQOOP_PASSWORD_REGEX); } @Override diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/test/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopTaskTest.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/test/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopTaskTest.java new file mode 100644 index 0000000000..f978c2284f --- /dev/null +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-sqoop/src/test/java/org/apache/dolphinscheduler/plugin/task/sqoop/SqoopTaskTest.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dolphinscheduler.plugin.task.sqoop; + +import org.apache.dolphinscheduler.common.log.SensitiveDataConverter; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class SqoopTaskTest { + + @Test + public void testSqoopPasswordMask() { + final String originalScript = + "sqoop import -D mapred.job.name=sqoop_task -m 1 --connect \"jdbc:mysql://localhost:3306/defuault\" --username root --password \"mypassword\" --table student --target-dir /sqoop_test --as-textfile"; + + final String maskScript = + "sqoop import -D mapred.job.name=sqoop_task -m 1 --connect \"jdbc:mysql://localhost:3306/defuault\" --username root --password \"**********\" --table student --target-dir /sqoop_test --as-textfile"; + + SensitiveDataConverter.addMaskPattern(SqoopConstants.SQOOP_PASSWORD_REGEX); + Assertions.assertEquals(maskScript, SensitiveDataConverter.maskSensitiveData(originalScript)); + } +} diff --git a/dolphinscheduler-worker/src/main/resources/logback-spring.xml b/dolphinscheduler-worker/src/main/resources/logback-spring.xml index 7d0d9cd827..bd01f46502 100644 --- a/dolphinscheduler-worker/src/main/resources/logback-spring.xml +++ b/dolphinscheduler-worker/src/main/resources/logback-spring.xml @@ -29,7 +29,7 @@ + converterClass="org.apache.dolphinscheduler.common.log.SensitiveDataConverter"/>