From b830d521d3e67cb5f0049a9da86ec7ef1388a500 Mon Sep 17 00:00:00 2001 From: zhiming she <505306252@qq.com> Date: Sun, 21 May 2023 19:06:03 +0800 Subject: [PATCH] cherry pick Support kerberos and delegation-token #266 --- HowToKerberize.md | 106 ++++++++++++++++++ kerberos-process.png | Bin 0 -> 55362 bytes pom.xml | 22 ++++ waggle-dance-core/pom.xml | 11 ++ .../PrefixBasedDatabaseMappingService.java | 6 + 5 files changed, 145 insertions(+) create mode 100644 HowToKerberize.md create mode 100644 kerberos-process.png diff --git a/HowToKerberize.md b/HowToKerberize.md new file mode 100644 index 000000000..d1176c8cf --- /dev/null +++ b/HowToKerberize.md @@ -0,0 +1,106 @@ +![Bee waggle-dancing on a hive.](logo.png "Federating Hive Meta Stores.") + +# Additional instructions to use Waggle Dance in a Kerberized environment + + +### Process + +In a Kerberos environment a client make a request to Waggle Dance which in turn requests the proxy user's token from the metastore and then uses this token to communicate with the metastore. + +This is necessary in certain scenarios that need authentication - for example the `create_table` API that requires the proxy user to create HDFS directories. + +![Kerberos Process.](kerberos-process.png "Kerberos Process") + +In addition, because Kerberos authentication requires a delegation-token to proxy as other users, the proxy user of the session is shared globally. This means we need to make all Hive Metastores share a set of delegation-token storage so that a single delegation-token can be authenticated by multiple Metastores. + +**One solution is to use Zookeeper to store tokens for all Hive Metastores** + +### Prerequisites + +* Kerberized cluster: + active KDC, + some required properties in configuration files of Hadoop services +* User account with privileges in kerberos environment +* Zookeeper to store delegation-token (Recommended) + +### Configuration + +Waggle Dance does not read Hadoop's `core-site.xml` so a general property providing Kerberos auth should be added to +the Hive configuration file `hive-site.xml`: + +``` + + hadoop.security.authentication + KERBEROS + +``` + + +Waggle Dance also needs a keytab file to communicate with the Metastore so the following properties should be present: +``` + + hive.metastore.sasl.enabled + true + + + hive.metastore.kerberos.principal + hive/_HOST@YOUR_REALM.COM + + + hive.metastore.kerberos.keytab.file + /etc/hive.keytab + +``` + +In addition, all metastores need to use the Zookeeper shared token: +``` + + hive.cluster.delegation.token.store.class + org.apache.hadoop.hive.thrift.ZooKeeperTokenStore + + + hive.cluster.delegation.token.store.zookeeper.connectString + zk1:2181,zk2:2181,zk3:2181 + + + hive.cluster.delegation.token.store.zookeeper.znode + /hive/token + +``` + +If you are intending to use a Beeline client, the following properties may be valuable: +``` + + hive.server2.transport.mode + http + + + hive.server2.authentication + KERBEROS + + + hive.server2.authentication.kerberos.principal + hive/_HOST@YOUR_REALM.COM + + + hive.server2.authentication.kerberos.keytab + /etc/hive.keytab + + + hive.server2.enable.doAs + false + +``` + + +### Running + +Waggle Dance should be started by a privileged user with a fresh keytab. + +If Waggle Dance throws a GSS exception, you have problem with the keytab file. +Try to perform `kdestroy` and `kinit` operations and check the keytab file ownership flags. + +If the Metastore throws an exception with code -127, Waggle Dance is probably using the wrong authentication policy. +Check the values in `hive-conf.xml` and make sure that HIVE_HOME and HIVE_CONF_DIR are defined. + +Don't forget to restart hive services! diff --git a/kerberos-process.png b/kerberos-process.png new file mode 100644 index 0000000000000000000000000000000000000000..992c8ee104c4d744316bf9482b9552e5aee3af19 GIT binary patch literal 55362 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 Hu0mjf^F`ta literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 45c6a96c3..4165ebed3 100644 --- a/pom.xml +++ b/pom.xml @@ -51,10 +51,32 @@ 6.0.0 1.18.24 3.12.0 + 2.13.0 + + + org.apache.curator + curator-client + ${curator.version} + + + org.apache.curator + curator-framework + ${curator.version} + + + org.apache.curator + curator-recipes + ${curator.version} + + + org.apache.curator + curator-x-discovery + ${curator.version} + com.google.guava guava diff --git a/waggle-dance-core/pom.xml b/waggle-dance-core/pom.xml index 2deeb3552..b00c2bee0 100644 --- a/waggle-dance-core/pom.xml +++ b/waggle-dance-core/pom.xml @@ -144,6 +144,17 @@ org.apache.hive hive-service + ${hive.version} + + + org.eclipse.jetty + jetty-server + + + org.eclipse.jetty + jetty-runner + + diff --git a/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/mapping/service/impl/PrefixBasedDatabaseMappingService.java b/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/mapping/service/impl/PrefixBasedDatabaseMappingService.java index a13cdd440..919254bc4 100644 --- a/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/mapping/service/impl/PrefixBasedDatabaseMappingService.java +++ b/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/mapping/service/impl/PrefixBasedDatabaseMappingService.java @@ -90,10 +90,16 @@ public PrefixBasedDatabaseMappingService( private void add(AbstractMetaStore metaStore) { MetaStoreMapping metaStoreMapping = metaStoreMappingFactory.newInstance(metaStore); + DatabaseMapping databaseMapping = createDatabaseMapping(metaStoreMapping); if (metaStore.getFederationType() == PRIMARY) { primaryDatabaseMapping = databaseMapping; + if (!metaStoreMapping.isAvailable()) { + throw new WaggleDanceException( + String.format("Primary metastore is unavailable {}", metaStore.getRemoteMetaStoreUris()) + ); + } } mappingsByPrefix.put(metaStoreMapping.getDatabasePrefix(), databaseMapping);