Repository: hive
Updated Branches:
  refs/heads/master 01ed46b4b -> 4e415609c


HIVE-21030 : Add credential store env properties redaction in JobConf (Denys 
Kuzmenko reviewed by Vihang Karajgaonkar)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/4e415609
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/4e415609
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/4e415609

Branch: refs/heads/master
Commit: 4e415609ce333fd17c1dd5d4bf44ca9a3897ec42
Parents: 01ed46b
Author: denys kuzmenko <dkuzme...@cloudera.com>
Authored: Fri Dec 14 13:29:03 2018 -0800
Committer: Vihang Karajgaonkar <vihan...@apache.org>
Committed: Fri Dec 14 13:29:41 2018 -0800

----------------------------------------------------------------------
 .../apache/hadoop/hive/conf/HiveConfUtil.java   | 35 ++++++++++++++-----
 .../ql/exec/TestHiveCredentialProviders.java    | 36 ++++++++++++++++++++
 2 files changed, 62 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/4e415609/common/src/java/org/apache/hadoop/hive/conf/HiveConfUtil.java
----------------------------------------------------------------------
diff --git a/common/src/java/org/apache/hadoop/hive/conf/HiveConfUtil.java 
b/common/src/java/org/apache/hadoop/hive/conf/HiveConfUtil.java
index 2ad5f9e..ae6fa43 100644
--- a/common/src/java/org/apache/hadoop/hive/conf/HiveConfUtil.java
+++ b/common/src/java/org/apache/hadoop/hive/conf/HiveConfUtil.java
@@ -24,12 +24,14 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.common.classification.InterfaceAudience.Private;
 import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
 import org.apache.hadoop.mapred.JobConf;
+import org.apache.hadoop.mapreduce.MRJobConfig;
 import org.apache.hive.common.util.HiveStringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashSet;
@@ -38,6 +40,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.StringTokenizer;
+import java.util.stream.Stream;
 
 /**
  * Hive Configuration utils
@@ -182,23 +185,37 @@ public class HiveConfUtil {
 
     String jobKeyStoreLocation = 
jobConf.get(HiveConf.ConfVars.HIVE_SERVER2_JOB_CREDENTIAL_PROVIDER_PATH.varname);
     String oldKeyStoreLocation = 
jobConf.get(Constants.HADOOP_CREDENTIAL_PROVIDER_PATH_CONFIG);
+
     if (StringUtils.isNotBlank(jobKeyStoreLocation)) {
       jobConf.set(Constants.HADOOP_CREDENTIAL_PROVIDER_PATH_CONFIG, 
jobKeyStoreLocation);
       LOG.debug("Setting job conf credstore location to " + jobKeyStoreLocation
           + " previous location was " + oldKeyStoreLocation);
     }
 
-    String credStorepassword = getJobCredentialProviderPassword(jobConf);
-    if (credStorepassword != null) {
-      // if the execution engine is MR set the map/reduce env with the 
credential store password
+    String credstorePassword = getJobCredentialProviderPassword(jobConf);
+    if (credstorePassword != null) {
       String execEngine = jobConf.get(ConfVars.HIVE_EXECUTION_ENGINE.varname);
+
       if ("mr".equalsIgnoreCase(execEngine)) {
-        addKeyValuePair(jobConf, JobConf.MAPRED_MAP_TASK_ENV,
-            Constants.HADOOP_CREDENTIAL_PASSWORD_ENVVAR, credStorepassword);
-        addKeyValuePair(jobConf, JobConf.MAPRED_REDUCE_TASK_ENV,
-            Constants.HADOOP_CREDENTIAL_PASSWORD_ENVVAR, credStorepassword);
-        addKeyValuePair(jobConf, "yarn.app.mapreduce.am.admin.user.env",
-            Constants.HADOOP_CREDENTIAL_PASSWORD_ENVVAR, credStorepassword);
+        // if the execution engine is MR set the map/reduce env with the 
credential store password
+
+        Collection<String> redactedProperties =
+            
jobConf.getStringCollection(MRJobConfig.MR_JOB_REDACTED_PROPERTIES);
+
+        Stream.of(
+            JobConf.MAPRED_MAP_TASK_ENV,
+            JobConf.MAPRED_REDUCE_TASK_ENV,
+            "yarn.app.mapreduce.am.admin.user.env")
+
+            .forEach(property -> {
+              addKeyValuePair(jobConf, property,
+                  Constants.HADOOP_CREDENTIAL_PASSWORD_ENVVAR, 
credstorePassword);
+              redactedProperties.add(property);
+            });
+
+        // Hide sensitive configuration values from MR HistoryUI by telling MR 
to redact the following list.
+        jobConf.set(MRJobConfig.MR_JOB_REDACTED_PROPERTIES,
+            StringUtils.join(redactedProperties, ","));
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/hive/blob/4e415609/ql/src/test/org/apache/hadoop/hive/ql/exec/TestHiveCredentialProviders.java
----------------------------------------------------------------------
diff --git 
a/ql/src/test/org/apache/hadoop/hive/ql/exec/TestHiveCredentialProviders.java 
b/ql/src/test/org/apache/hadoop/hive/ql/exec/TestHiveCredentialProviders.java
index 62eb9e4..4f49190 100644
--- 
a/ql/src/test/org/apache/hadoop/hive/ql/exec/TestHiveCredentialProviders.java
+++ 
b/ql/src/test/org/apache/hadoop/hive/ql/exec/TestHiveCredentialProviders.java
@@ -18,6 +18,8 @@
 package org.apache.hadoop.hive.ql.exec;
 
 import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -27,6 +29,8 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.conf.HiveConfUtil;
 import org.apache.hadoop.mapred.JobConf;
+import org.apache.hadoop.mapreduce.MRJobConfig;
+
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -44,6 +48,10 @@ public class TestHiveCredentialProviders {
   private static final String HADOOP_CREDSTORE_LOCATION =
       "localjceks://file/user/hive/localcreds.jceks";
 
+  private static final Collection<String> REDACTED_PROPERTIES = Arrays.asList(
+      JobConf.MAPRED_MAP_TASK_ENV,
+      JobConf.MAPRED_REDUCE_TASK_ENV);
+
   private Configuration jobConf;
 
   /*
@@ -93,6 +101,9 @@ public class TestHiveCredentialProviders {
     // make sure REDUCE task environment points to HIVE_JOB_CREDSTORE_PASSWORD
     Assert.assertEquals(HIVE_JOB_CREDSTORE_PASSWORD_ENVVAR_VAL, 
getValueFromJobConf(
         jobConf.get(JobConf.MAPRED_REDUCE_TASK_ENV), 
HADOOP_CREDENTIAL_PASSWORD_ENVVAR));
+
+    
Assert.assertTrue(jobConf.getStringCollection(MRJobConfig.MR_JOB_REDACTED_PROPERTIES)
+        .containsAll(REDACTED_PROPERTIES));
   }
 
   /*
@@ -114,6 +125,9 @@ public class TestHiveCredentialProviders {
     // make sure REDUCE task environment points to HADOOP_CREDSTORE_PASSWORD
     Assert.assertEquals(HADOOP_CREDSTORE_PASSWORD_ENVVAR_VAL, 
getValueFromJobConf(
         jobConf.get(JobConf.MAPRED_REDUCE_TASK_ENV), 
HADOOP_CREDENTIAL_PASSWORD_ENVVAR));
+
+    
Assert.assertTrue(jobConf.getStringCollection(MRJobConfig.MR_JOB_REDACTED_PROPERTIES)
+        .containsAll(REDACTED_PROPERTIES));
   }
 
   /*
@@ -131,6 +145,10 @@ public class TestHiveCredentialProviders {
 
     
Assert.assertNull(getValueFromJobConf(jobConf.get(JobConf.MAPRED_REDUCE_TASK_ENV),
         HADOOP_CREDENTIAL_PASSWORD_ENVVAR));
+
+    REDACTED_PROPERTIES.forEach(property -> Assert.assertFalse(
+        jobConf.getStringCollection(MRJobConfig.MR_JOB_REDACTED_PROPERTIES)
+            .contains(property)));
   }
 
   /*
@@ -150,6 +168,9 @@ public class TestHiveCredentialProviders {
 
     Assert.assertEquals(HADOOP_CREDSTORE_PASSWORD_ENVVAR_VAL, 
getValueFromJobConf(
         jobConf.get(JobConf.MAPRED_REDUCE_TASK_ENV), 
HADOOP_CREDENTIAL_PASSWORD_ENVVAR));
+
+    
Assert.assertTrue(jobConf.getStringCollection(MRJobConfig.MR_JOB_REDACTED_PROPERTIES)
+        .containsAll(REDACTED_PROPERTIES));
   }
 
   /*
@@ -166,6 +187,10 @@ public class TestHiveCredentialProviders {
     Assert.assertNull(jobConf.get(JobConf.MAPRED_MAP_TASK_ENV));
     Assert.assertNull(jobConf.get(JobConf.MAPRED_REDUCE_TASK_ENV));
 
+    REDACTED_PROPERTIES.forEach(property -> Assert.assertFalse(
+        jobConf.getStringCollection(MRJobConfig.MR_JOB_REDACTED_PROPERTIES)
+            .contains(property)));
+
     resetConfig();
     setupConfigs(true, false, false, false);
 
@@ -174,6 +199,10 @@ public class TestHiveCredentialProviders {
         jobConf.get(HADOOP_CREDENTIAL_PROVIDER_PATH_CONFIG));
     Assert.assertNull(jobConf.get(JobConf.MAPRED_MAP_TASK_ENV));
     Assert.assertNull(jobConf.get(JobConf.MAPRED_REDUCE_TASK_ENV));
+
+    REDACTED_PROPERTIES.forEach(property -> Assert.assertFalse(
+        jobConf.getStringCollection(MRJobConfig.MR_JOB_REDACTED_PROPERTIES)
+            .contains(property)));
   }
 
   /*
@@ -193,6 +222,9 @@ public class TestHiveCredentialProviders {
 
     assertEquals(HADOOP_CREDSTORE_PASSWORD_ENVVAR_VAL, getValueFromJobConf(
         jobConf.get(JobConf.MAPRED_REDUCE_TASK_ENV), 
HADOOP_CREDENTIAL_PASSWORD_ENVVAR));
+
+    
Assert.assertTrue(jobConf.getStringCollection(MRJobConfig.MR_JOB_REDACTED_PROPERTIES)
+        .containsAll(REDACTED_PROPERTIES));
   }
 
   /*
@@ -210,6 +242,10 @@ public class TestHiveCredentialProviders {
 
     assertNull(getValueFromJobConf(jobConf.get(JobConf.MAPRED_REDUCE_TASK_ENV),
         HADOOP_CREDENTIAL_PASSWORD_ENVVAR));
+
+    REDACTED_PROPERTIES.forEach(property -> Assert.assertFalse(
+        jobConf.getStringCollection(MRJobConfig.MR_JOB_REDACTED_PROPERTIES)
+            .contains(property)));
   }
 
   /*

Reply via email to