diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java index 382451b1296c..344dd3e6ffcc 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java @@ -34,13 +34,16 @@ import java.util.Map; import java.util.Optional; import java.util.OptionalInt; +import java.util.TreeMap; +import org.apache.hadoop.conf.ConfigRedactor; import org.apache.hadoop.fs.CommonConfigurationKeysPublic; import org.apache.hadoop.hdds.annotation.InterfaceAudience; import org.apache.hadoop.hdds.annotation.InterfaceStability; import org.apache.hadoop.hdds.client.BlockID; import org.apache.hadoop.hdds.conf.ConfigurationException; import org.apache.hadoop.hdds.conf.ConfigurationSource; +import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos; import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerCommandRequestProtoOrBuilder; import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto.State; @@ -776,4 +779,25 @@ public static ContainerProtos.ContainerCommandResponseProto processForDebug( return msg; } + + /** + * Redacts sensitive configuration. + * Sorts all properties by key name + * + * @param conf OzoneConfiguration object to be printed. + * @return Sorted Map of properties + */ + public static Map processForLogging(OzoneConfiguration conf) { + Map ozoneProps = conf.getOzoneProperties(); + ConfigRedactor redactor = new ConfigRedactor(conf); + Map sortedOzoneProps = new TreeMap<>(); + for (Map.Entry entry : ozoneProps.entrySet()) { + String value = redactor.redact(entry.getKey(), entry.getValue()); + if (value != null) { + value = value.trim(); + } + sortedOzoneProps.put(entry.getKey(), value); + } + return sortedOzoneProps; + } } diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/StringUtils.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/StringUtils.java index 792a9d0d8407..ed8f410d0e65 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/StringUtils.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/StringUtils.java @@ -21,9 +21,11 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; +import java.util.Map; import com.google.common.base.Preconditions; import org.apache.commons.lang3.SystemUtils; +import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.utils.SignalLogger; import org.apache.hadoop.hdds.utils.VersionInfo; import org.apache.hadoop.net.NetUtils; @@ -105,12 +107,13 @@ public static String toStartupShutdownString(String prefix, String... msg) { } public static void startupShutdownMessage(VersionInfo versionInfo, - Class clazz, String[] args, Logger log) { + Class clazz, String[] args, Logger log, OzoneConfiguration conf) { final String hostname = NetUtils.getHostname(); final String className = clazz.getSimpleName(); + if (log.isInfoEnabled()) { log.info(createStartupShutdownMessage(versionInfo, className, hostname, - args)); + args, HddsUtils.processForLogging(conf))); } if (SystemUtils.IS_OS_UNIX) { @@ -135,7 +138,8 @@ public static void startupShutdownMessage(VersionInfo versionInfo, * @return a string to log. */ public static String createStartupShutdownMessage(VersionInfo versionInfo, - String className, String hostname, String[] args) { + String className, String hostname, String[] args, + Map conf) { return toStartupShutdownString("STARTUP_MSG: ", "Starting " + className, " host = " + hostname, @@ -146,7 +150,8 @@ public static String createStartupShutdownMessage(VersionInfo versionInfo, + versionInfo.getRevision() + " ; compiled by '" + versionInfo.getUser() + "' on " + versionInfo.getDate(), - " java = " + System.getProperty("java.version")); + " java = " + System.getProperty("java.version"), + " conf = " + conf); } public static String appendIfNotPresent(String str, char c) { diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/OzoneConfiguration.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/OzoneConfiguration.java index 91415c34ecce..450da59168c7 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/OzoneConfiguration.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/OzoneConfiguration.java @@ -275,6 +275,11 @@ public Properties getAllPropertiesByTag(String tag) { return props; } + public Map getOzoneProperties() { + String ozoneRegex = ".*(ozone|hdds|ratis|container|scm|recon)\\..*"; + return getValByRegex(ozoneRegex); + } + @Override public Collection getConfigKeys() { return getProps().keySet() diff --git a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java index 3dbee3efbdc3..dc192d358085 100644 --- a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java +++ b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java @@ -31,8 +31,10 @@ import org.apache.hadoop.hdds.scm.ScmConfigKeys; import org.apache.hadoop.ozone.ha.ConfUtils; import org.apache.ozone.test.LambdaTestUtils; +import org.apache.hadoop.fs.CommonConfigurationKeysPublic; import static org.apache.hadoop.hdds.HddsUtils.getSCMAddressForDatanodes; +import static org.apache.hadoop.hdds.HddsUtils.processForLogging; import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_ADDRESS_KEY; import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_DATANODE_PORT_DEFAULT; import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_DATANODE_PORT_KEY; @@ -50,6 +52,11 @@ */ public class TestHddsUtils { + private static final String REDACTED_TEXT = ""; + private static final String ORIGINAL_VALUE = "Hello, World!"; + private static final String SENSITIVE_CONFIG_KEYS = + CommonConfigurationKeysPublic.HADOOP_SECURITY_SENSITIVE_CONFIG_KEYS; + @Test public void testGetHostName() { assertEquals(Optional.of("localhost"), @@ -248,4 +255,24 @@ public void testGetNumberFromConfigKeys() { serviceId, nodeId), OZONE_SCM_PIPELINE_OWNER_CONTAINER_COUNT).orElse(0)); } + + @Test + public void testRedactSensitivePropsForLogging() { + OzoneConfiguration conf = new OzoneConfiguration(); + conf.set(SENSITIVE_CONFIG_KEYS, String.join("\n", + "password$", + "key$")); + /* Sensitive properties */ + conf.set("ozone.test.password", ORIGINAL_VALUE); + conf.set("hdds.test.secret.key", ORIGINAL_VALUE); + /* Non-Sensitive properties */ + conf.set("ozone.normal.config", ORIGINAL_VALUE); + Map processedConf = processForLogging(conf); + + /* Verify that sensitive properties are redacted */ + assertEquals(processedConf.get("ozone.test.password"), REDACTED_TEXT); + assertEquals(processedConf.get("hdds.test.secret.key"), REDACTED_TEXT); + /* Verify that non-sensitive properties retain their value */ + assertEquals(processedConf.get("ozone.normal.config"), ORIGINAL_VALUE); + } } diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java index a9cf1427455f..49784eabc8f0 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java @@ -162,11 +162,12 @@ public static Logger getLogger() { @Override public Void call() throws Exception { + OzoneConfiguration configuration = createOzoneConfiguration(); if (printBanner) { StringUtils.startupShutdownMessage(HddsVersionInfo.HDDS_VERSION_INFO, - HddsDatanodeService.class, args, LOG); + HddsDatanodeService.class, args, LOG, configuration); } - start(createOzoneConfiguration()); + start(configuration); ShutdownHookManager.get().addShutdownHook(() -> { try { stop(); diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManagerStarter.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManagerStarter.java index bf8c1f70e174..5c4e15a843cd 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManagerStarter.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManagerStarter.java @@ -156,7 +156,7 @@ private void commonInit() { String[] originalArgs = getCmd().getParseResult().originalArgs() .toArray(new String[0]); StringUtils.startupShutdownMessage(HddsVersionInfo.HDDS_VERSION_INFO, - StorageContainerManager.class, originalArgs, LOG); + StorageContainerManager.class, originalArgs, LOG, conf); } /** diff --git a/hadoop-ozone/csi/src/main/java/org/apache/hadoop/ozone/csi/CsiServer.java b/hadoop-ozone/csi/src/main/java/org/apache/hadoop/ozone/csi/CsiServer.java index 015f9f1b7d0d..3b0c8f3c20fd 100644 --- a/hadoop-ozone/csi/src/main/java/org/apache/hadoop/ozone/csi/CsiServer.java +++ b/hadoop-ozone/csi/src/main/java/org/apache/hadoop/ozone/csi/CsiServer.java @@ -52,7 +52,11 @@ public class CsiServer extends GenericCli implements Callable { @Override public Void call() throws Exception { + String[] originalArgs = getCmd().getParseResult().originalArgs() + .toArray(new String[0]); OzoneConfiguration ozoneConfiguration = createOzoneConfiguration(); + StringUtils.startupShutdownMessage(OzoneVersionInfo.OZONE_VERSION_INFO, + CsiServer.class, originalArgs, LOG, ozoneConfiguration); CsiConfig csiConfig = ozoneConfiguration.getObject(CsiConfig.class); OzoneClient rpcClient = OzoneClientFactory.getRpcClient(ozoneConfiguration); @@ -85,8 +89,6 @@ public Void call() throws Exception { } public static void main(String[] args) { - StringUtils.startupShutdownMessage(OzoneVersionInfo.OZONE_VERSION_INFO, - CsiServer.class, args, LOG); new CsiServer().run(args); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerStarter.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerStarter.java index af321199bdf2..42d657aecc98 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerStarter.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManagerStarter.java @@ -173,7 +173,7 @@ private void commonInit() { String[] originalArgs = getCmd().getParseResult().originalArgs() .toArray(new String[0]); StringUtils.startupShutdownMessage(OzoneVersionInfo.OZONE_VERSION_INFO, - OzoneManager.class, originalArgs, LOG); + OzoneManager.class, originalArgs, LOG, conf); } /** diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java index 124e48981d60..f571618b98c6 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/ReconServer.java @@ -91,10 +91,10 @@ public static void main(String[] args) { public Void call() throws Exception { String[] originalArgs = getCmd().getParseResult().originalArgs() .toArray(new String[0]); - StringUtils.startupShutdownMessage(OzoneVersionInfo.OZONE_VERSION_INFO, - ReconServer.class, originalArgs, LOG); configuration = createOzoneConfiguration(); + StringUtils.startupShutdownMessage(OzoneVersionInfo.OZONE_VERSION_INFO, + ReconServer.class, originalArgs, LOG, configuration); ConfigurationProvider.setConfiguration(configuration); injector = Guice.createInjector(new ReconControllerModule(), diff --git a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/Gateway.java b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/Gateway.java index b8153f0209d2..2a96f050013c 100644 --- a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/Gateway.java +++ b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/Gateway.java @@ -88,7 +88,7 @@ public void start() throws IOException { String[] originalArgs = getCmd().getParseResult().originalArgs() .toArray(new String[0]); StringUtils.startupShutdownMessage(OzoneVersionInfo.OZONE_VERSION_INFO, - Gateway.class, originalArgs, LOG); + Gateway.class, originalArgs, LOG, ozoneConfiguration); LOG.info("Starting Ozone S3 gateway"); HddsServerUtil.initializeMetrics(ozoneConfiguration, "S3Gateway");