This is an automated email from the ASF dual-hosted git repository.
adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new d4d5ec65d5a HDDS-15913. Extract common Kerberos/MiniKDC setup from
serveral tests (#10873)
d4d5ec65d5a is described below
commit d4d5ec65d5ad1935e72795348f7d7b30126be6df
Author: Mark Tsai <[email protected]>
AuthorDate: Fri Sep 25 04:07:27 2026 +0800
HDDS-15913. Extract common Kerberos/MiniKDC setup from serveral tests
(#10873)
---
.../hadoop/hdds/scm/TestSecretKeySnapshot.java | 104 ++---------
.../apache/hadoop/hdds/scm/TestSecretKeysApi.java | 113 ++----------
.../apache/hadoop/ozone/TestDelegationToken.java | 122 +++----------
.../hadoop/ozone/TestSecureOzoneCluster.java | 116 ++++---------
.../java/org/apache/ozone/test/KerberosTests.java | 191 +++++++++++++++++++++
5 files changed, 271 insertions(+), 375 deletions(-)
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeySnapshot.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeySnapshot.java
index bd379a8d86e..8b4fc88a956 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeySnapshot.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeySnapshot.java
@@ -17,60 +17,40 @@
package org.apache.hadoop.hdds.scm;
-import static
org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION;
import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_BLOCK_TOKEN_ENABLED;
-import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_KERBEROS_KEYTAB_FILE_KEY;
-import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_KERBEROS_PRINCIPAL_KEY;
import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_SECRET_KEY_EXPIRY_DURATION;
import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_SECRET_KEY_ROTATE_CHECK_DURATION;
import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_SECRET_KEY_ROTATE_DURATION;
-import static
org.apache.hadoop.hdds.scm.ScmConfig.ConfigStrings.HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY;
-import static
org.apache.hadoop.hdds.scm.ScmConfig.ConfigStrings.HDDS_SCM_KERBEROS_PRINCIPAL_KEY;
-import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_CLIENT_ADDRESS_KEY;
-import static
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_KEYTAB_FILE_KEY;
-import static
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY;
-import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ADMINISTRATORS;
-import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SECURITY_ENABLED_KEY;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.DELEGATION_REMOVER_SCAN_INTERVAL_KEY;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.DELEGATION_TOKEN_MAX_LIFETIME_KEY;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HTTP_KERBEROS_KEYTAB_FILE;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HTTP_KERBEROS_PRINCIPAL_KEY;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_KEYTAB_FILE_KEY;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_PRINCIPAL_KEY;
-import static
org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod.KERBEROS;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
-import java.util.Properties;
import java.util.concurrent.TimeoutException;
import org.apache.hadoop.hdds.client.RatisReplicationConfig;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor;
import org.apache.hadoop.hdds.scm.container.ContainerInfo;
import org.apache.hadoop.hdds.scm.ha.SCMStateMachine;
-import org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig;
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
import org.apache.hadoop.hdds.security.symmetric.ManagedSecretKey;
import org.apache.hadoop.hdds.security.symmetric.SecretKeyManager;
import org.apache.hadoop.hdds.utils.IOUtils;
-import org.apache.hadoop.minikdc.MiniKdc;
import org.apache.hadoop.ozone.MiniOzoneCluster;
import org.apache.hadoop.ozone.MiniOzoneHAClusterImpl;
-import org.apache.hadoop.security.UserGroupInformation;
import org.apache.ozone.test.GenericTestUtils;
+import org.apache.ozone.test.KerberosTests;
import org.apache.ratis.util.ExitUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.io.TempDir;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -78,7 +58,7 @@
* Integration test to verify that symmetric secret keys are correctly
* synchronized from leader to follower during snapshot installation.
*/
-public final class TestSecretKeySnapshot {
+public class TestSecretKeySnapshot extends KerberosTests {
private static final Logger LOG = LoggerFactory
.getLogger(TestSecretKeySnapshot.class);
private static final long SNAPSHOT_THRESHOLD = 100;
@@ -87,24 +67,24 @@ public final class TestSecretKeySnapshot {
public static final int ROTATE_DURATION_MS = 30_000;
public static final int EXPIRY_DURATION_MS = 61_000;
- private MiniKdc miniKdc;
- private OzoneConfiguration conf;
- @TempDir
- private File workDir;
- private File ozoneKeytab;
- private File spnegoKeytab;
private MiniOzoneHAClusterImpl cluster;
+ @Override
+ protected void setSecureConfig() throws IOException {
+ configureSecurityBasics();
+ String host =
InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
+ String hostAndRealm = host + "@" + getRealm();
+ configureSharedServicePrincipal(hostAndRealm);
+ configureSpnegoPrincipal(hostAndRealm);
+ }
+
@BeforeEach
public void init() throws Exception {
- conf = new OzoneConfiguration();
- conf.set(OZONE_SCM_CLIENT_ADDRESS_KEY, "localhost");
-
ExitUtils.disableSystemExit();
- startMiniKdc();
- setSecureConfig();
- createCredentialsInKDC();
+ initKerberos();
+ OzoneConfiguration conf = getConf();
+ conf.setBoolean(HDDS_BLOCK_TOKEN_ENABLED, true);
conf.setBoolean(ScmConfigKeys.OZONE_SCM_HA_RAFT_LOG_PURGE_ENABLED, true);
conf.setInt(ScmConfigKeys.OZONE_SCM_HA_RAFT_LOG_PURGE_GAP, LOG_PURGE_GAP);
@@ -133,64 +113,10 @@ public void init() throws Exception {
@AfterEach
public void stop() {
- miniKdc.stop();
+ stopMiniKdc();
IOUtils.closeQuietly(cluster);
}
- private void createCredentialsInKDC() throws Exception {
- ScmConfig scmConfig = conf.getObject(ScmConfig.class);
- SCMHTTPServerConfig httpServerConfig =
- conf.getObject(SCMHTTPServerConfig.class);
- createPrincipal(ozoneKeytab, scmConfig.getKerberosPrincipal());
- createPrincipal(spnegoKeytab, httpServerConfig.getKerberosPrincipal());
- }
-
- private void createPrincipal(File keytab, String... principal)
- throws Exception {
- miniKdc.createPrincipal(keytab, principal);
- }
-
- private void startMiniKdc() throws Exception {
- Properties securityProperties = MiniKdc.createConf();
- miniKdc = new MiniKdc(securityProperties, workDir);
- miniKdc.start();
- }
-
- private void setSecureConfig() throws IOException {
- conf.setBoolean(OZONE_SECURITY_ENABLED_KEY, true);
- String host = InetAddress.getLocalHost().getCanonicalHostName()
- .toLowerCase();
-
- conf.set(HADOOP_SECURITY_AUTHENTICATION, KERBEROS.name());
-
- String curUser = UserGroupInformation.getCurrentUser().getUserName();
- conf.set(OZONE_ADMINISTRATORS, curUser);
-
- String realm = miniKdc.getRealm();
- String hostAndRealm = host + "@" + realm;
- conf.set(HDDS_SCM_KERBEROS_PRINCIPAL_KEY, "scm/" + hostAndRealm);
- conf.set(HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY, "HTTP_SCM/" + hostAndRealm);
- conf.set(OZONE_OM_KERBEROS_PRINCIPAL_KEY, "scm/" + hostAndRealm);
- conf.set(OZONE_OM_HTTP_KERBEROS_PRINCIPAL_KEY, "HTTP_OM/" + hostAndRealm);
- conf.set(HDDS_DATANODE_KERBEROS_PRINCIPAL_KEY, "scm/" + hostAndRealm);
-
- ozoneKeytab = new File(workDir, "scm.keytab");
- spnegoKeytab = new File(workDir, "http.keytab");
-
- conf.set(HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY,
- ozoneKeytab.getAbsolutePath());
- conf.set(HDDS_SCM_HTTP_KERBEROS_KEYTAB_FILE_KEY,
- spnegoKeytab.getAbsolutePath());
- conf.set(OZONE_OM_KERBEROS_KEYTAB_FILE_KEY,
- ozoneKeytab.getAbsolutePath());
- conf.set(OZONE_OM_HTTP_KERBEROS_KEYTAB_FILE,
- spnegoKeytab.getAbsolutePath());
- conf.set(HDDS_DATANODE_KERBEROS_KEYTAB_FILE_KEY,
- ozoneKeytab.getAbsolutePath());
-
- conf.setBoolean(HDDS_BLOCK_TOKEN_ENABLED, true);
- }
-
@Test
public void testInstallSnapshot() throws Exception {
// Get the leader SCM
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java
index 59021773bb1..d29ae72cea6 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSecretKeysApi.java
@@ -17,28 +17,14 @@
package org.apache.hadoop.hdds.scm;
-import static
org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION;
import static
org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHORIZATION;
import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_BLOCK_TOKEN_ENABLED;
-import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_KERBEROS_KEYTAB_FILE_KEY;
-import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_KERBEROS_PRINCIPAL_KEY;
import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_SECRET_KEY_EXPIRY_DURATION;
import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_SECRET_KEY_ROTATE_CHECK_DURATION;
import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_SECRET_KEY_ROTATE_DURATION;
-import static
org.apache.hadoop.hdds.scm.ScmConfig.ConfigStrings.HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY;
-import static
org.apache.hadoop.hdds.scm.ScmConfig.ConfigStrings.HDDS_SCM_KERBEROS_PRINCIPAL_KEY;
-import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_CLIENT_ADDRESS_KEY;
-import static
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_KEYTAB_FILE_KEY;
-import static
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY;
import static
org.apache.hadoop.hdds.utils.HddsServerUtil.getSecretKeyClientForDatanode;
-import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ADMINISTRATORS;
-import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SECURITY_ENABLED_KEY;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.DELEGATION_REMOVER_SCAN_INTERVAL_KEY;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.DELEGATION_TOKEN_MAX_LIFETIME_KEY;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HTTP_KERBEROS_KEYTAB_FILE;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HTTP_KERBEROS_PRINCIPAL_KEY;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_KEYTAB_FILE_KEY;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_PRINCIPAL_KEY;
import static
org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod.KERBEROS;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -49,20 +35,16 @@
import jakarta.annotation.Nonnull;
import java.io.File;
import java.io.IOException;
-import java.net.InetAddress;
import java.util.List;
-import java.util.Properties;
import java.util.UUID;
import java.util.concurrent.TimeoutException;
import org.apache.hadoop.hdds.annotation.InterfaceAudience;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.SecretKeyProtocol;
-import org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig;
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
import org.apache.hadoop.hdds.security.symmetric.ManagedSecretKey;
import org.apache.hadoop.hdds.utils.IOUtils;
import org.apache.hadoop.ipc_.RemoteException;
-import org.apache.hadoop.minikdc.MiniKdc;
import org.apache.hadoop.ozone.MiniOzoneCluster;
import org.apache.hadoop.ozone.MiniOzoneHAClusterImpl;
import org.apache.hadoop.ozone.om.OzoneManager;
@@ -70,12 +52,12 @@
import org.apache.hadoop.security.authorize.AuthorizationException;
import org.apache.hadoop.util.ExitUtil;
import org.apache.ozone.test.GenericTestUtils;
+import org.apache.ozone.test.KerberosTests;
import org.apache.ozone.test.tag.Flaky;
import org.apache.ratis.util.ExitUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.io.TempDir;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -84,96 +66,25 @@
*/
@InterfaceAudience.Private
-public final class TestSecretKeysApi {
+public class TestSecretKeysApi extends KerberosTests {
private static final Logger LOG = LoggerFactory
.getLogger(TestSecretKeysApi.class);
- private MiniKdc miniKdc;
- private OzoneConfiguration conf;
- @TempDir
- private File workDir;
- private File ozoneKeytab;
- private File spnegoKeytab;
- private File testUserKeytab;
- private String testUserPrincipal;
- private String ozonePrincipal;
private MiniOzoneHAClusterImpl cluster;
@BeforeEach
public void init() throws Exception {
- conf = new OzoneConfiguration();
- conf.set(OZONE_SCM_CLIENT_ADDRESS_KEY, "localhost");
-
ExitUtils.disableSystemExit();
ExitUtil.disableSystemExit();
- startMiniKdc();
- setSecureConfig();
- createCredentialsInKDC();
+ initKerberos();
}
@AfterEach
public void stop() {
- miniKdc.stop();
+ stopMiniKdc();
IOUtils.closeQuietly(cluster);
}
- private void createCredentialsInKDC() throws Exception {
- SCMHTTPServerConfig httpServerConfig =
- conf.getObject(SCMHTTPServerConfig.class);
- createPrincipal(ozoneKeytab, ozonePrincipal);
- createPrincipal(spnegoKeytab, httpServerConfig.getKerberosPrincipal());
- createPrincipal(testUserKeytab, testUserPrincipal);
- }
-
- private void createPrincipal(File keytab, String... principal)
- throws Exception {
- miniKdc.createPrincipal(keytab, principal);
- }
-
- private void startMiniKdc() throws Exception {
- Properties securityProperties = MiniKdc.createConf();
- miniKdc = new MiniKdc(securityProperties, workDir);
- miniKdc.start();
- }
-
- private void setSecureConfig() throws IOException {
- conf.setBoolean(OZONE_SECURITY_ENABLED_KEY, true);
- String host = InetAddress.getLocalHost().getCanonicalHostName()
- .toLowerCase();
-
- conf.set(HADOOP_SECURITY_AUTHENTICATION, KERBEROS.name());
-
- String curUser = UserGroupInformation.getCurrentUser().getUserName();
- conf.set(OZONE_ADMINISTRATORS, curUser);
-
- String realm = miniKdc.getRealm();
- String hostAndRealm = host + "@" + realm;
- ozonePrincipal = "scm/" + hostAndRealm;
- conf.set(HDDS_SCM_KERBEROS_PRINCIPAL_KEY, ozonePrincipal);
- conf.set(HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY, "HTTP_SCM/" + hostAndRealm);
- conf.set(OZONE_OM_KERBEROS_PRINCIPAL_KEY, ozonePrincipal);
- conf.set(OZONE_OM_HTTP_KERBEROS_PRINCIPAL_KEY, "HTTP_OM/" + hostAndRealm);
- conf.set(HDDS_DATANODE_KERBEROS_PRINCIPAL_KEY, ozonePrincipal);
-
- ozoneKeytab = new File(workDir, "scm.keytab");
- spnegoKeytab = new File(workDir, "http.keytab");
- testUserKeytab = new File(workDir, "testuser.keytab");
- testUserPrincipal = "test@" + realm;
-
- conf.set(HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY,
- ozoneKeytab.getAbsolutePath());
- conf.set(HDDS_SCM_HTTP_KERBEROS_KEYTAB_FILE_KEY,
- spnegoKeytab.getAbsolutePath());
- conf.set(OZONE_OM_KERBEROS_KEYTAB_FILE_KEY,
- ozoneKeytab.getAbsolutePath());
- conf.set(OZONE_OM_HTTP_KERBEROS_KEYTAB_FILE,
- spnegoKeytab.getAbsolutePath());
- conf.set(HDDS_DATANODE_KERBEROS_KEYTAB_FILE_KEY,
- ozoneKeytab.getAbsolutePath());
-
- conf.setBoolean(HADOOP_SECURITY_AUTHORIZATION, true);
- }
-
/**
* Test secret key apis in happy case.
*/
@@ -183,6 +94,7 @@ public void testSecretKeyApiSuccess() throws Exception {
enableBlockToken();
// set a low rotation period, of 1s, expiry is 3s, expect 3 active keys
// at any moment.
+ OzoneConfiguration conf = getConf();
conf.set(HDDS_SECRET_KEY_ROTATE_CHECK_DURATION, "100ms");
conf.set(HDDS_SECRET_KEY_ROTATE_DURATION, "1s");
conf.set(HDDS_SECRET_KEY_EXPIRY_DURATION, "3000ms");
@@ -258,6 +170,7 @@ public void testSecretKeyAfterSCMFailover() throws
Exception {
enableBlockToken();
// set a long duration period, so that no rotation happens during SCM
// leader change.
+ OzoneConfiguration conf = getConf();
conf.set(HDDS_SECRET_KEY_ROTATE_CHECK_DURATION, "10m");
conf.set(HDDS_SECRET_KEY_ROTATE_DURATION, "1d");
conf.set(HDDS_SECRET_KEY_EXPIRY_DURATION, "7d");
@@ -288,7 +201,7 @@ private void testSecretKeyAuthorization() throws Exception {
// is only available for Datanode and OM, any other authenticated user
// can't access the protocol.
SecretKeyProtocol secretKeyProtocol =
- getSecretKeyProtocol(testUserPrincipal, testUserKeytab);
+ getSecretKeyProtocol(getTestUserPrincipal(), getTestUserKeytab());
RemoteException ex =
assertThrows(RemoteException.class,
secretKeyProtocol::getCurrentSecretKey);
@@ -301,20 +214,20 @@ private void testSecretKeyAuthorization() throws
Exception {
@Test
public void testSecretKeyWithoutAuthorization() throws Exception {
enableBlockToken();
- conf.setBoolean(HADOOP_SECURITY_AUTHORIZATION, false);
+ getConf().setBoolean(HADOOP_SECURITY_AUTHORIZATION, false);
startCluster(1);
// When HADOOP_SECURITY_AUTHORIZATION is not enabled, any other
// authenticated user can access the protocol.
SecretKeyProtocol secretKeyProtocol =
- getSecretKeyProtocol(testUserPrincipal, testUserKeytab);
+ getSecretKeyProtocol(getTestUserPrincipal(), getTestUserKeytab());
assertNotNull(secretKeyProtocol.getCurrentSecretKey());
}
private void startCluster(int numSCMs)
throws IOException, TimeoutException, InterruptedException {
OzoneManager.setTestSecureOmFlag(true);
- MiniOzoneHAClusterImpl.Builder builder =
MiniOzoneCluster.newHABuilder(conf)
+ MiniOzoneHAClusterImpl.Builder builder =
MiniOzoneCluster.newHABuilder(getConf())
.setSCMServiceId("TestSecretKey")
.setNumOfStorageContainerManagers(numSCMs)
.setNumOfOzoneManagers(1);
@@ -325,7 +238,7 @@ private void startCluster(int numSCMs)
@Nonnull
private SecretKeyProtocol getSecretKeyProtocol() throws IOException {
- return getSecretKeyProtocol(ozonePrincipal, ozoneKeytab);
+ return getSecretKeyProtocol(getOzonePrincipal(), getOzoneKeytab());
}
@Nonnull
@@ -335,10 +248,10 @@ private SecretKeyProtocol getSecretKeyProtocol(
UserGroupInformation.loginUserFromKeytabAndReturnUGI(
user, keyTab.getCanonicalPath());
ugi.setAuthenticationMethod(KERBEROS);
- return getSecretKeyClientForDatanode(conf, ugi);
+ return getSecretKeyClientForDatanode(getConf(), ugi);
}
private void enableBlockToken() {
- conf.setBoolean(HDDS_BLOCK_TOKEN_ENABLED, true);
+ getConf().setBoolean(HDDS_BLOCK_TOKEN_ENABLED, true);
}
}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestDelegationToken.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestDelegationToken.java
index 444b6c313fa..a2a3a22584a 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestDelegationToken.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestDelegationToken.java
@@ -17,58 +17,43 @@
package org.apache.hadoop.ozone;
-import static
org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION;
import static org.apache.hadoop.hdds.HddsConfigKeys.OZONE_METADATA_DIRS;
-import static
org.apache.hadoop.hdds.scm.ScmConfig.ConfigStrings.HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY;
-import static
org.apache.hadoop.hdds.scm.ScmConfig.ConfigStrings.HDDS_SCM_KERBEROS_PRINCIPAL_KEY;
import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_BLOCK_CLIENT_PORT_DEFAULT;
import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_BLOCK_CLIENT_PORT_KEY;
-import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_CLIENT_ADDRESS_KEY;
import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_CLIENT_PORT_DEFAULT;
import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_CLIENT_PORT_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;
import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_SECURITY_SERVICE_PORT_DEFAULT;
import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_SECURITY_SERVICE_PORT_KEY;
-import static
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_KEYTAB_FILE_KEY;
-import static
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY;
import static org.apache.hadoop.net.ServerSocketUtil.getPort;
-import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ADMINISTRATORS;
-import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SECURITY_ENABLED_KEY;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.DELEGATION_TOKEN_MAX_LIFETIME_KEY;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HTTP_KERBEROS_KEYTAB_FILE;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HTTP_KERBEROS_PRINCIPAL_KEY;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_KEYTAB_FILE_KEY;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_PRINCIPAL_KEY;
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.INVALID_AUTH_METHOD;
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.TOKEN_ERROR_OTHER;
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.TOKEN_EXPIRED;
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_NOT_FOUND;
-import static
org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod.KERBEROS;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.slf4j.event.Level.INFO;
-import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyPair;
import java.security.PrivilegedExceptionAction;
-import java.util.Properties;
import java.util.UUID;
import java.util.stream.Stream;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.scm.HddsTestUtils;
-import org.apache.hadoop.hdds.scm.ScmConfig;
import org.apache.hadoop.hdds.scm.client.ScmTopologyClient;
import org.apache.hadoop.hdds.scm.ha.HASecurityUtils;
-import org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
import org.apache.hadoop.hdds.security.SecurityConfig;
@@ -78,7 +63,6 @@
import org.apache.hadoop.io.Text;
import org.apache.hadoop.ipc_.Server;
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
-import org.apache.hadoop.minikdc.MiniKdc;
import org.apache.hadoop.ozone.om.OMStorage;
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.ScmBlockLocationTestingClient;
@@ -92,6 +76,7 @@
import org.apache.hadoop.security.token.Token;
import org.apache.ozone.test.GenericTestUtils;
import org.apache.ozone.test.GenericTestUtils.LogCapturer;
+import org.apache.ozone.test.KerberosTests;
import org.apache.ratis.util.ExitUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
@@ -105,7 +90,7 @@
/**
* Test class to for security enabled Ozone cluster.
*/
-public final class TestDelegationToken {
+public class TestDelegationToken extends KerberosTests {
private static final String TEST_USER = "[email protected]";
private static final String COMPONENT = "test";
@@ -116,23 +101,23 @@ public final class TestDelegationToken {
@TempDir
private Path folder;
- @TempDir
- private File workDir;
-
- private MiniKdc miniKdc;
- private OzoneConfiguration conf;
- private File scmKeytab;
- private File spnegoKeytab;
- private File omKeyTab;
- private File testUserKeytab;
- private String testUserPrincipal;
+
private StorageContainerManager scm;
private OzoneManager om;
- private String host;
private String clusterId = UUID.randomUUID().toString();
private String scmId = UUID.randomUUID().toString();
private OzoneManagerProtocolClientSideTranslatorPB omClient;
+ @Override
+ protected void setSecureConfig() throws IOException {
+ configureSecurityBasics();
+ String host =
InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
+ String hostAndRealm = host + "@" + getRealm();
+ configureSeparateServicePrincipals(hostAndRealm);
+ configureSpnegoPrincipal(hostAndRealm);
+ createTestUserCredentials();
+ }
+
public static Stream<Boolean> options() {
return Stream.of(false, true);
}
@@ -145,8 +130,8 @@ public static void setup() {
@BeforeEach
public void init() {
try {
- conf = new OzoneConfiguration();
- conf.set(OZONE_SCM_CLIENT_ADDRESS_KEY, "localhost");
+ initKerberos();
+ OzoneConfiguration conf = getConf();
conf.setInt(OZONE_SCM_CLIENT_PORT_KEY,
getPort(OZONE_SCM_CLIENT_PORT_DEFAULT, 100));
@@ -161,12 +146,7 @@ public void init() {
final String path = folder.resolve("om-meta").toString();
Path metaDirPath = Paths.get(path, "om-meta");
conf.set(OZONE_METADATA_DIRS, metaDirPath.toString());
- conf.setBoolean(OZONE_SECURITY_ENABLED_KEY, true);
- conf.set(HADOOP_SECURITY_AUTHENTICATION, KERBEROS.name());
- startMiniKdc();
- setSecureConfig();
- createCredentialsInKDC();
generateKeyPair();
} catch (Exception e) {
LOG.error("Failed to initialize TestSecureOzoneCluster", e);
@@ -187,66 +167,8 @@ public void stop() {
}
}
- private void createCredentialsInKDC() throws Exception {
- ScmConfig scmConfig = conf.getObject(ScmConfig.class);
- SCMHTTPServerConfig httpServerConfig =
- conf.getObject(SCMHTTPServerConfig.class);
- createPrincipal(scmKeytab, scmConfig.getKerberosPrincipal());
- createPrincipal(spnegoKeytab, httpServerConfig.getKerberosPrincipal());
- createPrincipal(testUserKeytab, testUserPrincipal);
- createPrincipal(omKeyTab,
- conf.get(OZONE_OM_KERBEROS_PRINCIPAL_KEY));
- }
-
- private void createPrincipal(File keytab, String... principal)
- throws Exception {
- miniKdc.createPrincipal(keytab, principal);
- }
-
- private void startMiniKdc() throws Exception {
- Properties securityProperties = MiniKdc.createConf();
- miniKdc = new MiniKdc(securityProperties, workDir);
- miniKdc.start();
- }
-
- private void stopMiniKdc() {
- miniKdc.stop();
- }
-
- private void setSecureConfig() throws IOException {
- conf.setBoolean(OZONE_SECURITY_ENABLED_KEY, true);
- host = InetAddress.getLocalHost().getCanonicalHostName()
- .toLowerCase();
-
- conf.set(HADOOP_SECURITY_AUTHENTICATION, "kerberos");
-
- String curUser = UserGroupInformation.getCurrentUser().getUserName();
- conf.set(OZONE_ADMINISTRATORS, curUser);
-
- String realm = miniKdc.getRealm();
- String hostAndRealm = host + "@" + realm;
- conf.set(HDDS_SCM_KERBEROS_PRINCIPAL_KEY, "scm/" + hostAndRealm);
- conf.set(HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY, "HTTP_SCM/" + hostAndRealm);
- conf.set(OZONE_OM_KERBEROS_PRINCIPAL_KEY, "om/" + hostAndRealm);
- conf.set(OZONE_OM_HTTP_KERBEROS_PRINCIPAL_KEY, "HTTP_OM/" + hostAndRealm);
-
- scmKeytab = new File(workDir, "scm.keytab");
- spnegoKeytab = new File(workDir, "http.keytab");
- omKeyTab = new File(workDir, "om.keytab");
- testUserKeytab = new File(workDir, "testuser.keytab");
- testUserPrincipal = "test@" + realm;
-
- conf.set(HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY,
- scmKeytab.getAbsolutePath());
- conf.set(HDDS_SCM_HTTP_KERBEROS_KEYTAB_FILE_KEY,
- spnegoKeytab.getAbsolutePath());
- conf.set(OZONE_OM_KERBEROS_KEYTAB_FILE_KEY,
- omKeyTab.getAbsolutePath());
- conf.set(OZONE_OM_HTTP_KERBEROS_KEYTAB_FILE,
- spnegoKeytab.getAbsolutePath());
- }
-
private void initSCM() throws IOException {
+ OzoneConfiguration conf = getConf();
SCMStorageConfig scmStore = new SCMStorageConfig(conf);
scmStore.setClusterId(clusterId);
scmStore.setScmId(scmId);
@@ -271,6 +193,7 @@ private void initSCM() throws IOException {
@ParameterizedTest
@MethodSource("options")
public void testDelegationToken(boolean useIp) throws Exception {
+ OzoneConfiguration conf = getConf();
initSCM();
scm = HddsTestUtils.getScmSimple(conf);
scm.start();
@@ -425,7 +348,7 @@ private void assertDelegationTokenRenewalFailures(
omClient.close();
UserGroupInformation.setLoginUser(ugi);
omClient = new OzoneManagerProtocolClientSideTranslatorPB(
- OmTransportFactory.create(conf, ugi, null),
+ OmTransportFactory.create(getConf(), ugi, null),
RandomStringUtils.secure().nextAscii(5));
Token<OzoneTokenIdentifier> seedToken =
omClient.getDelegationToken(new Text("om"));
@@ -469,7 +392,7 @@ private void assertDelegationTokenRenewalFailures(
}
private void generateKeyPair() throws Exception {
- SecurityConfig securityConfig = new SecurityConfig(conf);
+ SecurityConfig securityConfig = new SecurityConfig(getConf());
HDDSKeyGenerator keyGenerator = new HDDSKeyGenerator(securityConfig);
KeyPair keyPair = keyGenerator.generateKey();
KeyStorage keyStorage = new KeyStorage(securityConfig, COMPONENT);
@@ -484,10 +407,9 @@ private void setupOm(OzoneConfiguration config) throws
Exception {
omStore.initialize();
// OM uses scm/[email protected] to access SCM
- config.set(OZONE_OM_KERBEROS_PRINCIPAL_KEY,
- "scm/" + host + "@" + miniKdc.getRealm());
- omKeyTab = new File(workDir, "scm.keytab");
- config.set(OZONE_OM_KERBEROS_KEYTAB_FILE_KEY, omKeyTab.getAbsolutePath());
+ config.set(OZONE_OM_KERBEROS_PRINCIPAL_KEY, getOzonePrincipal());
+ config.set(OZONE_OM_KERBEROS_KEYTAB_FILE_KEY,
+ getOzoneKeytab().getAbsolutePath());
OzoneManager.setTestSecureOmFlag(true);
om = OzoneManager.createOm(config);
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestSecureOzoneCluster.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestSecureOzoneCluster.java
index e6178ee380c..5561e13a062 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestSecureOzoneCluster.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestSecureOzoneCluster.java
@@ -35,18 +35,13 @@
import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_GRPC_PORT_KEY;
import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_RATIS_PORT_KEY;
import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_SECURITY_SERVICE_PORT_KEY;
-import static
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_KEYTAB_FILE_KEY;
-import static
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY;
import static
org.apache.hadoop.hdds.security.x509.exception.CertificateException.ErrorCode.ROLLBACK_ERROR;
import static org.apache.hadoop.hdds.utils.HddsServerUtil.getScmSecurityClient;
import static
org.apache.hadoop.hdds.utils.HddsServerUtil.getValidInetsForCurrentHost;
-import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ADMINISTRATORS;
import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_CLIENT_FAILOVER_MAX_ATTEMPTS_KEY;
import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SECURITY_ENABLED_KEY;
import static org.apache.hadoop.ozone.OzoneConsts.SCM_SUB_CA;
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ADDRESS_KEY;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HTTP_KERBEROS_KEYTAB_FILE;
-import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HTTP_KERBEROS_PRINCIPAL_KEY;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_KEYTAB_FILE_KEY;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_PRINCIPAL_KEY;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_S3_GPRC_SERVER_ENABLED;
@@ -83,7 +78,6 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
-import java.util.Properties;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
@@ -124,7 +118,6 @@
import org.apache.hadoop.io.Text;
import org.apache.hadoop.ipc_.Client;
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
-import org.apache.hadoop.minikdc.MiniKdc;
import org.apache.hadoop.ozone.client.OzoneClient;
import org.apache.hadoop.ozone.client.OzoneClientFactory;
import org.apache.hadoop.ozone.common.Storage;
@@ -153,6 +146,7 @@
import org.apache.hadoop.util.ExitUtil;
import org.apache.ozone.test.GenericTestUtils;
import org.apache.ozone.test.GenericTestUtils.LogCapturer;
+import org.apache.ozone.test.KerberosTests;
import org.apache.ozone.test.tag.Flaky;
import org.apache.ozone.test.tag.Unhealthy;
import org.apache.ratis.protocol.ClientId;
@@ -162,6 +156,7 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.io.TempDir;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -169,7 +164,8 @@
/**
* Test class to for security enabled Ozone cluster.
*/
-final class TestSecureOzoneCluster {
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+class TestSecureOzoneCluster extends KerberosTests {
private static final String COMPONENT = "om";
private static final String OM_CERT_SERIAL_ID = "9879877970576";
@@ -179,18 +175,6 @@ final class TestSecureOzoneCluster {
private static final int CERT_GRACE_TIME_MS = 10 * 1000; // 10s
private static final int DELEGATION_TOKEN_MAX_TIME_MS = 9 * 1000; // 9s
- @TempDir
- private static File workDir;
- private static MiniKdc miniKdc;
- private static OzoneConfiguration kdcConf;
- private static File scmKeytab;
- private static File spnegoKeytab;
- private static File omKeytab;
- private static File testUserKeytab;
- private static String testUserPrincipal;
- private static String host;
- private static String realm;
-
@TempDir
private File tempDir;
private OzoneConfiguration conf;
@@ -205,33 +189,32 @@ final class TestSecureOzoneCluster {
private KeyPair keyPair;
private Path omMetaDirPath;
+ @Override
+ protected void setSecureConfig() throws IOException {
+ configureSecurityBasics();
+ String host =
InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
+ String hostAndRealm = host + "@" + getRealm();
+ configureSeparateServicePrincipals(hostAndRealm);
+ configureSpnegoPrincipal(hostAndRealm);
+ createTestUserCredentials();
+ }
+
@BeforeAll
- static void setupKdc() throws Exception {
+ void setupKdc() throws Exception {
ExitUtils.disableSystemExit();
DefaultMetricsSystem.setMiniClusterMode(true);
- host = InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
- startMiniKdc();
- realm = miniKdc.getRealm();
- testUserPrincipal = "test@" + realm;
- scmKeytab = new File(workDir, "scm.keytab");
- spnegoKeytab = new File(workDir, "http.keytab");
- omKeytab = new File(workDir, "om.keytab");
- testUserKeytab = new File(workDir, "testuser.keytab");
- kdcConf = new OzoneConfiguration();
- setSecureConfig(kdcConf);
- createCredentialsInKDC(kdcConf);
+ initKerberos();
}
@AfterAll
- static void tearDownKdc() {
+ void tearDownKdc() {
stopMiniKdc();
}
@BeforeEach
void init() {
try {
- conf = new OzoneConfiguration(kdcConf);
- conf.set(OZONE_SCM_CLIENT_ADDRESS_KEY, "localhost");
+ conf = new OzoneConfiguration(getConf());
conf.setInt(OZONE_SCM_CLIENT_PORT_KEY, getFreePort());
conf.setInt(OZONE_SCM_DATANODE_PORT_KEY, getFreePort());
@@ -280,52 +263,12 @@ void stop() throws Exception {
} finally {
IOUtils.closeQuietly(om);
IOUtils.closeQuietly(omClient);
+ scm = null;
+ om = null;
+ omClient = null;
}
}
- private static void createCredentialsInKDC(OzoneConfiguration conf) throws
Exception {
- createPrincipal(scmKeytab, conf.get(HDDS_SCM_KERBEROS_PRINCIPAL_KEY));
- createPrincipal(spnegoKeytab,
conf.get(HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY));
- createPrincipal(omKeytab, conf.get(OZONE_OM_KERBEROS_PRINCIPAL_KEY));
- createPrincipal(testUserKeytab, testUserPrincipal);
- }
-
- private static void createPrincipal(File keytab, String... principal)
- throws Exception {
- miniKdc.createPrincipal(keytab, principal);
- }
-
- private static void startMiniKdc() throws Exception {
- Properties securityProperties = MiniKdc.createConf();
- miniKdc = new MiniKdc(securityProperties, workDir);
- miniKdc.start();
- }
-
- private static void stopMiniKdc() {
- if (miniKdc != null) {
- miniKdc.stop();
- }
- }
-
- private static void setSecureConfig(OzoneConfiguration conf) throws
IOException {
- conf.setBoolean(OZONE_SECURITY_ENABLED_KEY, true);
- conf.set(HADOOP_SECURITY_AUTHENTICATION, "kerberos");
-
- String curUser = UserGroupInformation.getCurrentUser().getUserName();
- conf.set(OZONE_ADMINISTRATORS, curUser);
-
- String hostAndRealm = host + "@" + realm;
- conf.set(HDDS_SCM_KERBEROS_PRINCIPAL_KEY, "scm/" + hostAndRealm);
- conf.set(HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY, "HTTP_SCM/" + hostAndRealm);
- conf.set(OZONE_OM_KERBEROS_PRINCIPAL_KEY, "om/" + hostAndRealm);
- conf.set(OZONE_OM_HTTP_KERBEROS_PRINCIPAL_KEY, "HTTP_OM/" + hostAndRealm);
-
- conf.set(HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY, scmKeytab.getAbsolutePath());
- conf.set(HDDS_SCM_HTTP_KERBEROS_KEYTAB_FILE_KEY,
spnegoKeytab.getAbsolutePath());
- conf.set(OZONE_OM_KERBEROS_KEYTAB_FILE_KEY, omKeytab.getAbsolutePath());
- conf.set(OZONE_OM_HTTP_KERBEROS_KEYTAB_FILE,
spnegoKeytab.getAbsolutePath());
- }
-
/**
* Exercises a secure SCM and OM sharing a single SCM instance to avoid
paying
* the SCM startup cost twice. Covers SCM startup and cert trust chain, SCM
@@ -366,7 +309,7 @@ private void assertScmExposesClusterInfoAndTrustChain()
throws IOException {
private void assertScmSecurityProtocolAllowsKerberosUser() throws Exception {
UserGroupInformation ugi =
UserGroupInformation.loginUserFromKeytabAndReturnUGI(
- testUserPrincipal, testUserKeytab.getCanonicalPath());
+ getTestUserPrincipal(), getTestUserKeytab().getCanonicalPath());
ugi.setAuthenticationMethod(KERBEROS);
try (SCMSecurityProtocolClientSideTranslatorPB securityClient =
getScmSecurityClient(conf, ugi)) {
@@ -402,7 +345,7 @@ private void
assertScmSecurityProtocolRejectsNonKerberosUser() throws Exception
/** SCM admin protocol - authenticated non-admin user is denied. */
private void assertScmAdminProtocolDeniesNonAdminUser() throws IOException {
UserGroupInformation ugi =
UserGroupInformation.loginUserFromKeytabAndReturnUGI(
- testUserPrincipal, testUserKeytab.getCanonicalPath());
+ getTestUserPrincipal(), getTestUserKeytab().getCanonicalPath());
StorageContainerLocationProtocol scmRpcClient =
HAUtils.getScmContainerClient(conf, ugi);
IOException adminException = assertThrows(IOException.class,
@@ -473,7 +416,8 @@ private void
assertSecureOmInitFailsWithNonExistentPrincipal() {
*/
private void assertSecureOmInitWhenAlreadyInitialized() throws Exception {
conf.set(HADOOP_SECURITY_AUTHENTICATION, "kerberos");
- conf.set(OZONE_OM_KERBEROS_PRINCIPAL_KEY, "om/" + host + "@" + realm);
+ conf.set(OZONE_OM_KERBEROS_PRINCIPAL_KEY,
+ getConf().get(OZONE_OM_KERBEROS_PRINCIPAL_KEY));
conf.set(OZONE_OM_ADDRESS_KEY,
InetAddress.getLocalHost().getCanonicalHostName() + ":" +
getFreePort());
LogCapturer omLogs = LogCapturer.captureLogs(OMCertificateClient.class);
@@ -533,9 +477,9 @@ private void initSCM() throws IOException {
*
*/
conf.set(HDDS_SCM_KERBEROS_PRINCIPAL_KEY,
- "om/" + host + "@" + miniKdc.getRealm());
- File keyTab = new File(workDir, "om.keytab");
- conf.set(HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY, keyTab.getAbsolutePath());
+ conf.get(OZONE_OM_KERBEROS_PRINCIPAL_KEY));
+ conf.set(HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY,
+ conf.get(OZONE_OM_KERBEROS_KEYTAB_FILE_KEY));
}
@Test
@@ -595,7 +539,7 @@ void testAccessControlExceptionOnClient() throws Exception {
// positive case (happy-path)
UserGroupInformation ugi =
UserGroupInformation.loginUserFromKeytabAndReturnUGI(
- testUserPrincipal, testUserKeytab.getCanonicalPath());
+ getTestUserPrincipal(), getTestUserKeytab().getCanonicalPath());
ugi.setAuthenticationMethod(KERBEROS);
OzoneManagerProtocolClientSideTranslatorPB secureClient =
new OzoneManagerProtocolClientSideTranslatorPB(
@@ -724,7 +668,7 @@ void testGetSetRevokeS3Secret() throws Exception {
// testUser is not an admin
final UserGroupInformation ugiNonAdmin =
UserGroupInformation.loginUserFromKeytabAndReturnUGI(
- testUserPrincipal, testUserKeytab.getCanonicalPath());
+ getTestUserPrincipal(), getTestUserKeytab().getCanonicalPath());
final OzoneManagerProtocolClientSideTranslatorPB omClientNonAdmin =
new OzoneManagerProtocolClientSideTranslatorPB(
OmTransportFactory.create(conf, ugiNonAdmin, null),
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/KerberosTests.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/KerberosTests.java
new file mode 100644
index 00000000000..a58f495369a
--- /dev/null
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/KerberosTests.java
@@ -0,0 +1,191 @@
+/*
+ * 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.ozone.test;
+
+import static
org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION;
+import static
org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHORIZATION;
+import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_KERBEROS_KEYTAB_FILE_KEY;
+import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_KERBEROS_PRINCIPAL_KEY;
+import static
org.apache.hadoop.hdds.scm.ScmConfig.ConfigStrings.HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY;
+import static
org.apache.hadoop.hdds.scm.ScmConfig.ConfigStrings.HDDS_SCM_KERBEROS_PRINCIPAL_KEY;
+import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_CLIENT_ADDRESS_KEY;
+import static
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_KEYTAB_FILE_KEY;
+import static
org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig.ConfigStrings.HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY;
+import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ADMINISTRATORS;
+import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SECURITY_ENABLED_KEY;
+import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HTTP_KERBEROS_KEYTAB_FILE;
+import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_HTTP_KERBEROS_PRINCIPAL_KEY;
+import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_KEYTAB_FILE_KEY;
+import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_KERBEROS_PRINCIPAL_KEY;
+import static
org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod.KERBEROS;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.nio.file.Files;
+import java.util.Properties;
+import org.apache.commons.io.FileUtils;
+import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.scm.server.SCMHTTPServerConfig;
+import org.apache.hadoop.minikdc.MiniKdc;
+import org.apache.hadoop.security.UserGroupInformation;
+
+/**
+ * Shared MiniKdc / Kerberos setup for secure cluster integration tests
(HDDS-15913).
+ */
+public abstract class KerberosTests {
+
+ private MiniKdc miniKdc;
+ private final OzoneConfiguration conf = new OzoneConfiguration();
+
+ private File workDir;
+
+ /** Service keytab (scm.keytab); shared by SCM/OM/DN when using {@link
#configureSharedServicePrincipal}. */
+ private File ozoneKeytab;
+ private File spnegoKeytab;
+ private File testUserKeytab;
+ private String testUserPrincipal;
+ /** e.g. scm/host@REALM. */
+ private String ozonePrincipal;
+
+ /** Separate OM keytab, only used with {@link
#configureSeparateServicePrincipals}. */
+ private File omKeytab;
+
+ protected OzoneConfiguration getConf() {
+ return conf;
+ }
+
+ protected File getOzoneKeytab() {
+ return ozoneKeytab;
+ }
+
+ protected String getOzonePrincipal() {
+ return ozonePrincipal;
+ }
+
+ protected File getTestUserKeytab() {
+ return testUserKeytab;
+ }
+
+ protected String getTestUserPrincipal() {
+ return testUserPrincipal;
+ }
+
+ protected void initKerberos() throws Exception {
+ startMiniKdc();
+ setSecureConfig();
+ createCredentialsInKDC();
+ }
+
+ protected void startMiniKdc() throws Exception {
+ if (workDir == null) {
+ workDir = Files.createTempDirectory("kerberos").toFile();
+ }
+ Properties securityProperties = MiniKdc.createConf();
+ miniKdc = new MiniKdc(securityProperties, workDir);
+ miniKdc.start();
+ }
+
+ protected void stopMiniKdc() {
+ if (miniKdc != null) {
+ miniKdc.stop();
+ }
+ FileUtils.deleteQuietly(workDir);
+ }
+
+ protected void createPrincipal(File keytab, String... principal)
+ throws Exception {
+ miniKdc.createPrincipal(keytab, principal);
+ }
+
+ protected void setSecureConfig() throws IOException {
+ configureSecurityBasics();
+ String host = InetAddress.getLocalHost().getCanonicalHostName()
+ .toLowerCase();
+ String hostAndRealm = host + "@" + getRealm();
+ configureSharedServicePrincipal(hostAndRealm);
+ configureSpnegoPrincipal(hostAndRealm);
+ createTestUserCredentials();
+ conf.setBoolean(HADOOP_SECURITY_AUTHORIZATION, true);
+ }
+
+ /** Mints the principals for whichever keytabs {@link #setSecureConfig()}
configured. */
+ protected void createCredentialsInKDC() throws Exception {
+ createPrincipal(ozoneKeytab, conf.get(HDDS_SCM_KERBEROS_PRINCIPAL_KEY));
+ if (omKeytab != null) {
+ createPrincipal(omKeytab, conf.get(OZONE_OM_KERBEROS_PRINCIPAL_KEY));
+ }
+ SCMHTTPServerConfig httpServerConfig =
conf.getObject(SCMHTTPServerConfig.class);
+ createPrincipal(spnegoKeytab, httpServerConfig.getKerberosPrincipal());
+ if (testUserKeytab != null) {
+ createPrincipal(testUserKeytab, testUserPrincipal);
+ }
+ }
+
+ protected String getRealm() {
+ return miniKdc.getRealm();
+ }
+
+ /** Security basics common to every subclass's setSecureConfig(). */
+ protected void configureSecurityBasics() throws IOException {
+ conf.setBoolean(OZONE_SECURITY_ENABLED_KEY, true);
+ conf.set(OZONE_SCM_CLIENT_ADDRESS_KEY, "localhost");
+ conf.set(HADOOP_SECURITY_AUTHENTICATION, KERBEROS.name());
+ String curUser = UserGroupInformation.getCurrentUser().getUserName();
+ conf.set(OZONE_ADMINISTRATORS, curUser);
+ }
+
+ /** SCM/OM/DN share a single "scm/..." principal and keytab. */
+ protected void configureSharedServicePrincipal(String hostAndRealm) {
+ ozonePrincipal = "scm/" + hostAndRealm;
+ ozoneKeytab = new File(workDir, "scm.keytab");
+ conf.set(HDDS_SCM_KERBEROS_PRINCIPAL_KEY, ozonePrincipal);
+ conf.set(OZONE_OM_KERBEROS_PRINCIPAL_KEY, ozonePrincipal);
+ conf.set(HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY, ozoneKeytab.getAbsolutePath());
+ conf.set(OZONE_OM_KERBEROS_KEYTAB_FILE_KEY, ozoneKeytab.getAbsolutePath());
+ conf.set(HDDS_DATANODE_KERBEROS_PRINCIPAL_KEY, ozonePrincipal);
+ conf.set(HDDS_DATANODE_KERBEROS_KEYTAB_FILE_KEY,
+ ozoneKeytab.getAbsolutePath());
+ }
+
+ /** SCM and OM use separate "scm/..." and "om/..." principals and keytabs. */
+ protected void configureSeparateServicePrincipals(String hostAndRealm) {
+ ozonePrincipal = "scm/" + hostAndRealm;
+ ozoneKeytab = new File(workDir, "scm.keytab");
+ conf.set(HDDS_SCM_KERBEROS_PRINCIPAL_KEY, ozonePrincipal);
+ conf.set(HDDS_SCM_KERBEROS_KEYTAB_FILE_KEY, ozoneKeytab.getAbsolutePath());
+ omKeytab = new File(workDir, "om.keytab");
+ conf.set(OZONE_OM_KERBEROS_PRINCIPAL_KEY, "om/" + hostAndRealm);
+ conf.set(OZONE_OM_KERBEROS_KEYTAB_FILE_KEY, omKeytab.getAbsolutePath());
+ }
+
+ protected void configureSpnegoPrincipal(String hostAndRealm) {
+ spnegoKeytab = new File(workDir, "http.keytab");
+ conf.set(HDDS_SCM_HTTP_KERBEROS_PRINCIPAL_KEY, "HTTP_SCM/" + hostAndRealm);
+ conf.set(OZONE_OM_HTTP_KERBEROS_PRINCIPAL_KEY, "HTTP_OM/" + hostAndRealm);
+ conf.set(HDDS_SCM_HTTP_KERBEROS_KEYTAB_FILE_KEY,
+ spnegoKeytab.getAbsolutePath());
+ conf.set(OZONE_OM_HTTP_KERBEROS_KEYTAB_FILE,
+ spnegoKeytab.getAbsolutePath());
+ }
+
+ protected void createTestUserCredentials() {
+ testUserKeytab = new File(workDir, "testuser.keytab");
+ testUserPrincipal = "test@" + getRealm();
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]