Repository: accumulo Updated Branches: refs/heads/master 97ff25db2 -> 59c6a8e19
ACCUMULO-4421 Check if the Trace User is expected to use Kerberos before attempting to login to Kerberos as the trace user. Signed-off-by: Josh Elser <els...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/d66a8d08 Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/d66a8d08 Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/d66a8d08 Branch: refs/heads/master Commit: d66a8d08627e98e9bbdd2bd0b1ab4f4658a84d9f Parents: 40d5a72 Author: Sean Busbey <bus...@cloudera.com> Authored: Thu Aug 25 14:47:38 2016 -0500 Committer: Sean Busbey <bus...@cloudera.com> Committed: Fri Aug 26 19:08:30 2016 -0500 ---------------------------------------------------------------------- .../org/apache/accumulo/tracer/TraceServer.java | 61 +++++++++++++------- 1 file changed, 41 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/accumulo/blob/d66a8d08/server/tracer/src/main/java/org/apache/accumulo/tracer/TraceServer.java ---------------------------------------------------------------------- diff --git a/server/tracer/src/main/java/org/apache/accumulo/tracer/TraceServer.java b/server/tracer/src/main/java/org/apache/accumulo/tracer/TraceServer.java index 4b07dcc..2a06dc3 100644 --- a/server/tracer/src/main/java/org/apache/accumulo/tracer/TraceServer.java +++ b/server/tracer/src/main/java/org/apache/accumulo/tracer/TraceServer.java @@ -36,6 +36,7 @@ import org.apache.accumulo.core.client.IteratorSetting; import org.apache.accumulo.core.client.MutationsRejectedException; import org.apache.accumulo.core.client.security.tokens.AuthenticationToken; import org.apache.accumulo.core.client.security.tokens.AuthenticationToken.Properties; +import org.apache.accumulo.core.client.security.tokens.KerberosToken; import org.apache.accumulo.core.client.security.tokens.PasswordToken; import org.apache.accumulo.core.conf.AccumuloConfiguration; import org.apache.accumulo.core.conf.Property; @@ -306,30 +307,50 @@ public class TraceServer implements Watcher { } private static void loginTracer(AccumuloConfiguration acuConf) { - Map<String,String> loginMap = acuConf.getAllPropertiesWithPrefix(Property.TRACE_TOKEN_PROPERTY_PREFIX); - String keyTab = loginMap.get(Property.TRACE_TOKEN_PROPERTY_PREFIX.getKey() + "keytab"); - if (keyTab == null || keyTab.length() == 0) { - keyTab = acuConf.getPath(Property.GENERAL_KERBEROS_KEYTAB); - } - if (keyTab == null || keyTab.length() == 0) - return; + try { + Class<? extends AuthenticationToken> traceTokenType = AccumuloVFSClassLoader.getClassLoader().loadClass(acuConf.get(Property.TRACE_TOKEN_TYPE)) + .asSubclass(AuthenticationToken.class); + + if (!(KerberosToken.class.isAssignableFrom(traceTokenType))) { + // We're not using Kerberos to talk to Accumulo, but we might still need it for talking to HDFS/ZK for + // instance information. + log.info("Handling login under the assumption that Accumulo users are not using Kerberos."); + SecurityUtil.serverLogin(acuConf); + } else { + // We're using Kerberos to talk to Accumulo, so check for trace user specific auth details. + // We presume this same user will have the needed access for the service to interact with HDFS/ZK for + // instance information. + log.info("Handling login under the assumption that Accumulo users are using Kerberos."); + Map<String,String> loginMap = acuConf.getAllPropertiesWithPrefix(Property.TRACE_TOKEN_PROPERTY_PREFIX); + String keyTab = loginMap.get(Property.TRACE_TOKEN_PROPERTY_PREFIX.getKey() + "keytab"); + if (keyTab == null || keyTab.length() == 0) { + keyTab = acuConf.getPath(Property.GENERAL_KERBEROS_KEYTAB); + } + if (keyTab == null || keyTab.length() == 0) + return; - String principalConfig = acuConf.get(Property.TRACE_USER); - if (principalConfig == null || principalConfig.length() == 0) - return; + String principalConfig = acuConf.get(Property.TRACE_USER); + if (principalConfig == null || principalConfig.length() == 0) + return; - log.info("Attempting to login as {} with {}", principalConfig, keyTab); - if (SecurityUtil.login(principalConfig, keyTab)) { - try { - // This spawns a thread to periodically renew the logged in (trace) user - UserGroupInformation.getLoginUser(); - return; - } catch (IOException io) { - log.error("Error starting up renewal thread. This shouldn't be happening.", io); + log.info("Attempting to login as {} with {}", principalConfig, keyTab); + if (SecurityUtil.login(principalConfig, keyTab)) { + try { + // This spawns a thread to periodically renew the logged in (trace) user + UserGroupInformation.getLoginUser(); + return; + } catch (IOException io) { + log.error("Error starting up renewal thread. This shouldn't be happening.", io); + } + } + + throw new RuntimeException("Failed to perform Kerberos login for " + principalConfig + " using " + keyTab); } + } catch (IOException | ClassNotFoundException exception) { + final String msg = String.format("Failed to retrieve trace user token information based on property %1s.", Property.TRACE_TOKEN_TYPE); + log.error(msg, exception); + throw new RuntimeException(msg, exception); } - - throw new RuntimeException("Failed to perform Kerberos login for " + principalConfig + " using " + keyTab); } public static void main(String[] args) throws Exception {