Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 763C42007D0 for ; Tue, 10 May 2016 20:08:28 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 73EFA160A11; Tue, 10 May 2016 18:08:28 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 481A3160877 for ; Tue, 10 May 2016 20:08:27 +0200 (CEST) Received: (qmail 38279 invoked by uid 500); 10 May 2016 18:08:26 -0000 Mailing-List: contact commits-help@ambari.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: ambari-dev@ambari.apache.org Delivered-To: mailing list commits@ambari.apache.org Received: (qmail 38266 invoked by uid 99); 10 May 2016 18:08:26 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 10 May 2016 18:08:26 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 3E79CDFB90; Tue, 10 May 2016 18:08:26 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: rlevas@apache.org To: commits@ambari.apache.org Message-Id: <338fba129cbc494c9a1232214cdd0d44@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: ambari git commit: AMBARI-16379. The 'krb5-conf' configuration is not available (rlevas) Date: Tue, 10 May 2016 18:08:26 +0000 (UTC) archived-at: Tue, 10 May 2016 18:08:28 -0000 Repository: ambari Updated Branches: refs/heads/trunk 07dbee41a -> a14fd4a54 AMBARI-16379. The 'krb5-conf' configuration is not available (rlevas) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a14fd4a5 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a14fd4a5 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a14fd4a5 Branch: refs/heads/trunk Commit: a14fd4a54bd6a99f448e9053c15dd430cb81ef9c Parents: 07dbee4 Author: Robert Levas Authored: Tue May 10 14:08:15 2016 -0400 Committer: Robert Levas Committed: Tue May 10 14:08:20 2016 -0400 ---------------------------------------------------------------------- .../server/controller/KerberosHelperImpl.java | 221 ++++++++++--------- .../server/controller/KerberosHelperTest.java | 53 +++++ 2 files changed, 170 insertions(+), 104 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/a14fd4a5/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java index 93dc51a..fe466d5 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java @@ -1246,112 +1246,120 @@ public class KerberosHelperImpl implements KerberosHelper { Map> activeIdentities = new HashMap>(); - Collection hosts; - String ambariServerHostname = StageUtils.getHostName(); + // Only calculate the active identities if the kerberos-env configurtaion is available. Else + // important information like the realm will be missing (kerberos-env/realm) + Config kerberosEnvConfig = cluster.getDesiredConfigByType("kerberos-env"); + if(kerberosEnvConfig == null) { + LOG.debug("Calculating the active identities for {} is being skipped since the kerberos-env configuration is not available", + clusterName, cluster.getSecurityType().name(), SecurityType.KERBEROS.name()); + } + else { + Collection hosts; + String ambariServerHostname = StageUtils.getHostName(); - if (hostName == null) { - Map hostMap = clusters.getHostsForCluster(clusterName); - if (hostMap == null) { - hosts = null; - } else { - hosts = hostMap.keySet(); - } + if (hostName == null) { + Map hostMap = clusters.getHostsForCluster(clusterName); + if (hostMap == null) { + hosts = Collections.emptySet(); + } else { + hosts = hostMap.keySet(); + } - if (!hosts.contains(ambariServerHostname)) { - Collection extendedHosts = new ArrayList<>(hosts.size() + 1); - extendedHosts.addAll(hosts); - extendedHosts.add(ambariServerHostname); - hosts = extendedHosts; + if (!hosts.contains(ambariServerHostname)) { + Collection extendedHosts = new ArrayList<>(hosts.size() + 1); + extendedHosts.addAll(hosts); + extendedHosts.add(ambariServerHostname); + hosts = extendedHosts; + } + } else { + hosts = Collections.singleton(hostName); } - } else { - hosts = Collections.singleton(hostName); - } - KerberosDescriptor kerberosDescriptor = getKerberosDescriptor(cluster); + if (!hosts.isEmpty()) { + KerberosDescriptor kerberosDescriptor = getKerberosDescriptor(cluster); - if ((hosts != null) && !hosts.isEmpty()) { + if (kerberosDescriptor != null) { + Map kerberosDescriptorProperties = kerberosDescriptor.getProperties(); - if (kerberosDescriptor != null) { - Map kerberosDescriptorProperties = kerberosDescriptor.getProperties(); + for (String hostname : hosts) { + Map hostActiveIdentities = new HashMap(); + List identities = getActiveIdentities(cluster, hostname, + serviceName, componentName, kerberosDescriptor); - for (String hostname : hosts) { - Map hostActiveIdentities = new HashMap(); - List identities = getActiveIdentities(cluster, hostname, - serviceName, componentName, kerberosDescriptor); + if (hostname.equals(ambariServerHostname)) { + addAmbariServerIdentity(kerberosEnvConfig.getProperties(), kerberosDescriptor, identities); + } - if (hostname.equals(ambariServerHostname)) { - addAmbariServerIdentity(cluster, kerberosDescriptor, identities); - } + if (!identities.isEmpty()) { + // Calculate the current host-specific configurations. These will be used to replace + // variables within the Kerberos descriptor data + Map> configurations = calculateConfigurations(cluster, hostname.equals + (ambariServerHostname) ? null : hostname, + kerberosDescriptorProperties); - if (!identities.isEmpty()) { - // Calculate the current host-specific configurations. These will be used to replace - // variables within the Kerberos descriptor data - Map> configurations = calculateConfigurations(cluster, hostname.equals - (ambariServerHostname) ? null : hostname, - kerberosDescriptorProperties); + for (KerberosIdentityDescriptor identity : identities) { + KerberosPrincipalDescriptor principalDescriptor = identity.getPrincipalDescriptor(); + String principal = null; - for (KerberosIdentityDescriptor identity : identities) { - KerberosPrincipalDescriptor principalDescriptor = identity.getPrincipalDescriptor(); - String principal = null; + if (principalDescriptor != null) { + principal = variableReplacementHelper.replaceVariables(principalDescriptor.getValue(), configurations); + } - if (principalDescriptor != null) { - principal = variableReplacementHelper.replaceVariables(principalDescriptor.getValue(), configurations); - } + if (principal != null) { + KerberosKeytabDescriptor keytabDescriptor = identity.getKeytabDescriptor(); + String keytabFile = null; - if (principal != null) { - KerberosKeytabDescriptor keytabDescriptor = identity.getKeytabDescriptor(); - String keytabFile = null; + if (keytabDescriptor != null) { + keytabFile = variableReplacementHelper.replaceVariables(keytabDescriptor.getFile(), configurations); + } - if (keytabDescriptor != null) { - keytabFile = variableReplacementHelper.replaceVariables(keytabDescriptor.getFile(), configurations); - } + if (replaceHostNames) { + principal = principal.replace("_HOST", hostname); + } - if (replaceHostNames) { - principal = principal.replace("_HOST", hostname); - } + String uniqueKey = String.format("%s|%s", principal, (keytabFile == null) ? "" : keytabFile); - String uniqueKey = String.format("%s|%s", principal, (keytabFile == null) ? "" : keytabFile); + if (!hostActiveIdentities.containsKey(uniqueKey)) { + KerberosPrincipalType principalType = principalDescriptor.getType(); - if (!hostActiveIdentities.containsKey(uniqueKey)) { - KerberosPrincipalType principalType = principalDescriptor.getType(); + // Assume the principal is a service principal if not specified + if (principalType == null) { + principalType = KerberosPrincipalType.SERVICE; + } - // Assume the principal is a service principal if not specified - if (principalType == null) { - principalType = KerberosPrincipalType.SERVICE; - } + KerberosPrincipalDescriptor resolvedPrincipalDescriptor = + new KerberosPrincipalDescriptor(principal, + principalType, + variableReplacementHelper.replaceVariables(principalDescriptor.getConfiguration(), configurations), + variableReplacementHelper.replaceVariables(principalDescriptor.getLocalUsername(), configurations)); + + KerberosKeytabDescriptor resolvedKeytabDescriptor; + + if (keytabFile == null) { + resolvedKeytabDescriptor = null; + } else { + resolvedKeytabDescriptor = + new KerberosKeytabDescriptor( + keytabFile, + variableReplacementHelper.replaceVariables(keytabDescriptor.getOwnerName(), configurations), + variableReplacementHelper.replaceVariables(keytabDescriptor.getOwnerAccess(), configurations), + variableReplacementHelper.replaceVariables(keytabDescriptor.getGroupName(), configurations), + variableReplacementHelper.replaceVariables(keytabDescriptor.getGroupAccess(), configurations), + variableReplacementHelper.replaceVariables(keytabDescriptor.getConfiguration(), configurations), + keytabDescriptor.isCachable()); + } - KerberosPrincipalDescriptor resolvedPrincipalDescriptor = - new KerberosPrincipalDescriptor(principal, - principalType, - variableReplacementHelper.replaceVariables(principalDescriptor.getConfiguration(), configurations), - variableReplacementHelper.replaceVariables(principalDescriptor.getLocalUsername(), configurations)); - - KerberosKeytabDescriptor resolvedKeytabDescriptor; - - if (keytabFile == null) { - resolvedKeytabDescriptor = null; - } else { - resolvedKeytabDescriptor = - new KerberosKeytabDescriptor( - keytabFile, - variableReplacementHelper.replaceVariables(keytabDescriptor.getOwnerName(), configurations), - variableReplacementHelper.replaceVariables(keytabDescriptor.getOwnerAccess(), configurations), - variableReplacementHelper.replaceVariables(keytabDescriptor.getGroupName(), configurations), - variableReplacementHelper.replaceVariables(keytabDescriptor.getGroupAccess(), configurations), - variableReplacementHelper.replaceVariables(keytabDescriptor.getConfiguration(), configurations), - keytabDescriptor.isCachable()); + hostActiveIdentities.put(uniqueKey, new KerberosIdentityDescriptor( + identity.getName(), + resolvedPrincipalDescriptor, + resolvedKeytabDescriptor)); } - - hostActiveIdentities.put(uniqueKey, new KerberosIdentityDescriptor( - identity.getName(), - resolvedPrincipalDescriptor, - resolvedKeytabDescriptor)); } } } - } - activeIdentities.put(hostname, hostActiveIdentities.values()); + activeIdentities.put(hostname, hostActiveIdentities.values()); + } } } } @@ -1359,18 +1367,28 @@ public class KerberosHelperImpl implements KerberosHelper { return activeIdentities; } - private void addAmbariServerIdentity(Cluster cluster, KerberosDescriptor kerberosDescriptor, List identities) throws AmbariException { - try { - KerberosDetails kerberosDetails = getKerberosDetails(cluster, null); - // append Ambari server principal - if (kerberosDetails.createAmbariPrincipal()) { - KerberosIdentityDescriptor ambariServerIdentity = kerberosDescriptor.getIdentity(KerberosHelper.AMBARI_IDENTITY_NAME); - if (ambariServerIdentity != null) { - identities.add(ambariServerIdentity); - } + /** + * Conditionally add the Ambari server Kerberos identity to the set of Kerberos Identities expected + * to be available when Kerberos is enabled. + *

+ * The Ambari server Kerberos identity should only be added if the kerberos-env/create_ambari_principal + * property is not explicitly set to false. + * + * @param kerberosEnvProperties the kerberos-env properties + * @param kerberosDescriptor the kerberos descriptor + * @param identities the collection of identities to add to + */ + void addAmbariServerIdentity(Map kerberosEnvProperties, KerberosDescriptor kerberosDescriptor, List identities) { + // Determine if we should _calculate_ the Ambari service identity. + // If kerberos-env/create_ambari_principal is not set to false the identity should be calculated. + boolean createAmbariPrincipal = (kerberosEnvProperties == null) || !"false".equalsIgnoreCase(kerberosEnvProperties.get(CREATE_AMBARI_PRINCIPAL)); + + // append Ambari server principal + if (createAmbariPrincipal) { + KerberosIdentityDescriptor ambariServerIdentity = kerberosDescriptor.getIdentity(KerberosHelper.AMBARI_IDENTITY_NAME); + if (ambariServerIdentity != null) { + identities.add(ambariServerIdentity); } - } catch (KerberosInvalidConfigurationException e) { - LOG.warn("Unable to append Ambari server principal: {}", e); } } @@ -3400,7 +3418,6 @@ public class KerberosHelperImpl implements KerberosHelper { private Map kerberosEnvProperties; private SecurityType securityType; private Boolean manageIdentities; - private Boolean createAmbariPrincipal; public void setDefaultRealm(String defaultRealm) { this.defaultRealm = defaultRealm; @@ -3443,17 +3460,13 @@ public class KerberosHelperImpl implements KerberosHelper { } } - public boolean createAmbariPrincipal() { - if (createAmbariPrincipal == null) { - return (kerberosEnvProperties == null) || - !"false".equalsIgnoreCase(kerberosEnvProperties.get(CREATE_AMBARI_PRINCIPAL)); - } else { - return createAmbariPrincipal; - } - } - public void setManageIdentities(Boolean manageIdentities) { this.manageIdentities = manageIdentities; } + + public boolean createAmbariPrincipal() { + return (kerberosEnvProperties == null) || + !"false".equalsIgnoreCase(kerberosEnvProperties.get(CREATE_AMBARI_PRINCIPAL)); + } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/a14fd4a5/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java index 7f8be67..e03ed86 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java @@ -564,6 +564,26 @@ public class KerberosHelperTest extends EasyMockSupport { } @Test + public void addAmbariServerIdentity_CreateAmbariPrincipal() throws Exception { + addAmbariServerIdentity(Collections.singletonMap("create_ambari_principal", "true")); + } + + @Test + public void addAmbariServerIdentity_DoNotCreateAmbariPrincipal() throws Exception { + addAmbariServerIdentity(Collections.singletonMap("create_ambari_principal", "false")); + } + + @Test + public void addAmbariServerIdentity_MissingProperty() throws Exception { + addAmbariServerIdentity(Collections.singletonMap("not_create_ambari_principal", "value")); + } + + @Test + public void addAmbariServerIdentity_MissingKerberosEnv() throws Exception { + addAmbariServerIdentity(null); + } + + @Test public void testGetActiveIdentities_SingleService() throws Exception { Map> identities = testGetActiveIdentities("c1", null, "SERVICE1", null, true, SecurityType.KERBEROS); @@ -3843,6 +3863,39 @@ public class KerberosHelperTest extends EasyMockSupport { return identities; } + private void addAmbariServerIdentity(Map kerberosEnvProperties) throws Exception { + + boolean createAmbariPrincipal = (kerberosEnvProperties == null) + || !"false".equalsIgnoreCase(kerberosEnvProperties.get("create_ambari_principal")); + + KerberosHelperImpl kerberosHelper = injector.getInstance(KerberosHelperImpl.class); + + KerberosIdentityDescriptor ambariKerberosIdentity = createMock(KerberosIdentityDescriptor.class); + + KerberosDescriptor kerberosDescriptor = createMock(KerberosDescriptor.class); + if (createAmbariPrincipal) { + expect(kerberosDescriptor.getIdentity(KerberosHelper.AMBARI_IDENTITY_NAME)).andReturn(ambariKerberosIdentity).once(); + } + + List identities = new ArrayList(); + + replayAll(); + + // Needed by infrastructure + injector.getInstance(AmbariMetaInfo.class).init(); + + kerberosHelper.addAmbariServerIdentity(kerberosEnvProperties, kerberosDescriptor, identities); + + verifyAll(); + + if (createAmbariPrincipal) { + Assert.assertEquals(1, identities.size()); + Assert.assertSame(ambariKerberosIdentity, identities.get(0)); + } else { + Assert.assertTrue(identities.isEmpty()); + } + } + private KerberosConfigurationDescriptor createMockConfigurationDescriptor(Map properties) { KerberosConfigurationDescriptor descriptor = createMock(KerberosConfigurationDescriptor.class); expect(descriptor.getProperties()).andReturn(properties).anyTimes();