This is an automated email from the ASF dual-hosted git repository.

chengpan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kyuubi.git


The following commit(s) were added to refs/heads/master by this push:
     new 7bc0dbf93 [KYUUBI #5130] Allow setting Zookeeper SPN using Kyuubi 
configuration
7bc0dbf93 is described below

commit 7bc0dbf9321a61a646133750b92f22b2bfb34160
Author: Cheng Pan <[email protected]>
AuthorDate: Thu Aug 3 19:29:02 2023 +0800

    [KYUUBI #5130] Allow setting Zookeeper SPN using Kyuubi configuration
    
    ### _Why are the changes needed?_
    
    One of the basic ideas of Kerberos authentication is that the Client MUST 
provide the Server Principal Name (SPN).
    
    [ZOOKEEPER-1467](https://issues.apache.org/jira/browse/ZOOKEEPER-1467) 
(fixed in 3.6.0, 3.5.7) allows to configure Zookeeper SPN at the client side.
    
    Previously, there is no way but only 
`-Dzookeeper.server.principal=zookeeper/_HOSTREALM` to set ZK SPN, this PR 
allows the user to set it via Kyuubi configuration 
`kyuubi.ha.zookeeper.auth.serverPrincipal`.
    
    In default, if `zookeeper.server.principal` is not configured, it assumes 
that the Zookeeper server uses 
`zookeeper/_HOST<SAME_REALM_WITH_CLIENT_PRINCIPAL>`
    
    ### _How was this patch tested?_
    - [ ] Add some test cases that check the changes thoroughly including 
negative and positive cases if possible
    
    - [ ] Add screenshots for manual tests if appropriate
    
    - [x] [Run 
test](https://kyuubi.readthedocs.io/en/master/contributing/code/testing.html#running-tests)
 locally before make a pull request
    
    Closes #5130 from pan3793/zk-spn.
    
    Closes #5130
    
    6f0a1bbdc [Cheng Pan] doc
    290e172aa [Cheng Pan] docs
    a43b0c67a [Cheng Pan] nit
    9a33446b7 [Cheng Pan] Allow set Zookeeper server principal
    
    Authored-by: Cheng Pan <[email protected]>
    Signed-off-by: Cheng Pan <[email protected]>
---
 docs/deployment/settings.md                        | 53 +++++++++++-----------
 .../apache/kyuubi/ha/HighAvailabilityConf.scala    | 31 +++++++++----
 .../client/zookeeper/ZookeeperClientProvider.scala |  8 +++-
 3 files changed, 54 insertions(+), 38 deletions(-)

diff --git a/docs/deployment/settings.md b/docs/deployment/settings.md
index b1b8af143..91c68824c 100644
--- a/docs/deployment/settings.md
+++ b/docs/deployment/settings.md
@@ -262,32 +262,33 @@ You can configure the Kyuubi properties in 
`$KYUUBI_HOME/conf/kyuubi-defaults.co
 
 ### Ha
 
-|                      Key                       |                            
Default                             |                                           
                                                           Meaning              
                                                                                
         |   Type   | Since |
-|------------------------------------------------|----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|-------|
-| kyuubi.ha.addresses                                                          
                                  || The connection string for the discovery 
ensemble                                                                        
                                                                                
           | string   | 1.6.0 |
-| kyuubi.ha.client.class                         | 
org.apache.kyuubi.ha.client.zookeeper.ZookeeperDiscoveryClient | Class name for 
service discovery client.<ul> <li>Zookeeper: 
org.apache.kyuubi.ha.client.zookeeper.ZookeeperDiscoveryClient</li> <li>Etcd: 
org.apache.kyuubi.ha.client.etcd.EtcdDiscoveryClient</li></ul>           | 
string   | 1.6.0 |
-| kyuubi.ha.etcd.lease.timeout                   | PT10S                       
                                   | Timeout for etcd keep alive lease. The 
kyuubi server will know the unexpected loss of engine after up to this seconds. 
                                                                                
            | duration | 1.6.0 |
-| kyuubi.ha.etcd.ssl.ca.path                     | &lt;undefined&gt;           
                                   | Where the etcd CA certificate file is 
stored.                                                                         
                                                                                
             | string   | 1.6.0 |
-| kyuubi.ha.etcd.ssl.client.certificate.path     | &lt;undefined&gt;           
                                   | Where the etcd SSL certificate file is 
stored.                                                                         
                                                                                
            | string   | 1.6.0 |
-| kyuubi.ha.etcd.ssl.client.key.path             | &lt;undefined&gt;           
                                   | Where the etcd SSL key file is stored.     
                                                                                
                                                                                
        | string   | 1.6.0 |
-| kyuubi.ha.etcd.ssl.enabled                     | false                       
                                   | When set to true, will build an SSL 
secured etcd client.                                                            
                                                                                
               | boolean  | 1.6.0 |
-| kyuubi.ha.namespace                            | kyuubi                      
                                   | The root directory for the service to 
deploy its instance uri                                                         
                                                                                
             | string   | 1.6.0 |
-| kyuubi.ha.zookeeper.acl.enabled                | false                       
                                   | Set to true if the ZooKeeper ensemble is 
kerberized                                                                      
                                                                                
          | boolean  | 1.0.0 |
-| kyuubi.ha.zookeeper.auth.digest                | &lt;undefined&gt;           
                                   | The digest auth string is used for 
ZooKeeper authentication, like: username:password.                              
                                                                                
                | string   | 1.3.2 |
-| kyuubi.ha.zookeeper.auth.keytab                | &lt;undefined&gt;           
                                   | Location of the Kyuubi server's keytab is 
used for ZooKeeper authentication.                                              
                                                                                
         | string   | 1.3.2 |
-| kyuubi.ha.zookeeper.auth.principal             | &lt;undefined&gt;           
                                   | Name of the Kerberos principal is used for 
ZooKeeper authentication.                                                       
                                                                                
        | string   | 1.3.2 |
-| kyuubi.ha.zookeeper.auth.type                  | NONE                        
                                   | The type of ZooKeeper authentication, all 
candidates are <ul><li>NONE</li><li> KERBEROS</li><li> DIGEST</li></ul>         
                                                                                
         | string   | 1.3.2 |
-| kyuubi.ha.zookeeper.connection.base.retry.wait | 1000                        
                                   | Initial amount of time to wait between 
retries to the ZooKeeper ensemble                                               
                                                                                
            | int      | 1.0.0 |
-| kyuubi.ha.zookeeper.connection.max.retries     | 3                           
                                   | Max retry times for connecting to the 
ZooKeeper ensemble                                                              
                                                                                
             | int      | 1.0.0 |
-| kyuubi.ha.zookeeper.connection.max.retry.wait  | 30000                       
                                   | Max amount of time to wait between retries 
for BOUNDED_EXPONENTIAL_BACKOFF policy can reach, or max time until elapsed for 
UNTIL_ELAPSED policy to connect the zookeeper ensemble                          
        | int      | 1.0.0 |
-| kyuubi.ha.zookeeper.connection.retry.policy    | EXPONENTIAL_BACKOFF         
                                   | The retry policy for connecting to the 
ZooKeeper ensemble, all candidates are: <ul><li>ONE_TIME</li><li> 
N_TIME</li><li> EXPONENTIAL_BACKOFF</li><li> 
BOUNDED_EXPONENTIAL_BACKOFF</li><li> UNTIL_ELAPSED</li></ul> | string   | 1.0.0 
|
-| kyuubi.ha.zookeeper.connection.timeout         | 15000                       
                                   | The timeout(ms) of creating the connection 
to the ZooKeeper ensemble                                                       
                                                                                
        | int      | 1.0.0 |
-| kyuubi.ha.zookeeper.engine.auth.type           | NONE                        
                                   | The type of ZooKeeper authentication for 
the engine, all candidates are <ul><li>NONE</li><li> KERBEROS</li><li> 
DIGEST</li></ul>                                                                
                   | string   | 1.3.2 |
-| kyuubi.ha.zookeeper.namespace                  | kyuubi                      
                                   | (deprecated) The root directory for the 
service to deploy its instance uri                                              
                                                                                
           | string   | 1.0.0 |
-| kyuubi.ha.zookeeper.node.creation.timeout      | PT2M                        
                                   | Timeout for creating ZooKeeper node        
                                                                                
                                                                                
        | duration | 1.2.0 |
-| kyuubi.ha.zookeeper.publish.configs            | false                       
                                   | When set to true, publish Kerberos configs 
to Zookeeper. Note that the Hive driver needs to be greater than 1.3 or 2.0 or 
apply HIVE-11581 patch.                                                         
         | boolean  | 1.4.0 |
-| kyuubi.ha.zookeeper.quorum                                                   
                                  || (deprecated) The connection string for the 
ZooKeeper ensemble                                                              
                                                                                
        | string   | 1.0.0 |
-| kyuubi.ha.zookeeper.session.timeout            | 60000                       
                                   | The timeout(ms) of a connected session to 
be idled                                                                        
                                                                                
         | int      | 1.0.0 |
+|                      Key                       |                            
Default                             |                                           
                                                              Meaning           
                                                                                
               |   Type   | Since |
+|------------------------------------------------|----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|-------|
+| kyuubi.ha.addresses                                                          
                                  || The connection string for the discovery 
ensemble                                                                        
                                                                                
                 | string   | 1.6.0 |
+| kyuubi.ha.client.class                         | 
org.apache.kyuubi.ha.client.zookeeper.ZookeeperDiscoveryClient | Class name for 
service discovery client.<ul> <li>Zookeeper: 
org.apache.kyuubi.ha.client.zookeeper.ZookeeperDiscoveryClient</li> <li>Etcd: 
org.apache.kyuubi.ha.client.etcd.EtcdDiscoveryClient</li></ul>                 
| string   | 1.6.0 |
+| kyuubi.ha.etcd.lease.timeout                   | PT10S                       
                                   | Timeout for etcd keep alive lease. The 
kyuubi server will know the unexpected loss of engine after up to this seconds. 
                                                                                
                  | duration | 1.6.0 |
+| kyuubi.ha.etcd.ssl.ca.path                     | &lt;undefined&gt;           
                                   | Where the etcd CA certificate file is 
stored.                                                                         
                                                                                
                   | string   | 1.6.0 |
+| kyuubi.ha.etcd.ssl.client.certificate.path     | &lt;undefined&gt;           
                                   | Where the etcd SSL certificate file is 
stored.                                                                         
                                                                                
                  | string   | 1.6.0 |
+| kyuubi.ha.etcd.ssl.client.key.path             | &lt;undefined&gt;           
                                   | Where the etcd SSL key file is stored.     
                                                                                
                                                                                
              | string   | 1.6.0 |
+| kyuubi.ha.etcd.ssl.enabled                     | false                       
                                   | When set to true, will build an SSL 
secured etcd client.                                                            
                                                                                
                     | boolean  | 1.6.0 |
+| kyuubi.ha.namespace                            | kyuubi                      
                                   | The root directory for the service to 
deploy its instance uri                                                         
                                                                                
                   | string   | 1.6.0 |
+| kyuubi.ha.zookeeper.acl.enabled                | false                       
                                   | Set to true if the ZooKeeper ensemble is 
kerberized                                                                      
                                                                                
                | boolean  | 1.0.0 |
+| kyuubi.ha.zookeeper.auth.digest                | &lt;undefined&gt;           
                                   | The digest auth string is used for 
ZooKeeper authentication, like: username:password.                              
                                                                                
                      | string   | 1.3.2 |
+| kyuubi.ha.zookeeper.auth.keytab                | &lt;undefined&gt;           
                                   | Location of the Kyuubi server's keytab 
that is used for ZooKeeper authentication.                                      
                                                                                
                  | string   | 1.3.2 |
+| kyuubi.ha.zookeeper.auth.principal             | &lt;undefined&gt;           
                                   | Kerberos principal name that is used for 
ZooKeeper authentication.                                                       
                                                                                
                | string   | 1.3.2 |
+| kyuubi.ha.zookeeper.auth.serverPrincipal       | &lt;undefined&gt;           
                                   | Kerberos principal name of ZooKeeper 
Server. It only takes effect when Zookeeper client's version at least 3.5.7 or 
3.6.0 or applies ZOOKEEPER-1467. To use Zookeeper 3.6 client, compile Kyuubi 
with `-Pzookeeper-3.6`. | string   | 1.8.0 |
+| kyuubi.ha.zookeeper.auth.type                  | NONE                        
                                   | The type of ZooKeeper authentication, all 
candidates are <ul><li>NONE</li><li> KERBEROS</li><li> DIGEST</li></ul>         
                                                                                
               | string   | 1.3.2 |
+| kyuubi.ha.zookeeper.connection.base.retry.wait | 1000                        
                                   | Initial amount of time to wait between 
retries to the ZooKeeper ensemble                                               
                                                                                
                  | int      | 1.0.0 |
+| kyuubi.ha.zookeeper.connection.max.retries     | 3                           
                                   | Max retry times for connecting to the 
ZooKeeper ensemble                                                              
                                                                                
                   | int      | 1.0.0 |
+| kyuubi.ha.zookeeper.connection.max.retry.wait  | 30000                       
                                   | Max amount of time to wait between retries 
for BOUNDED_EXPONENTIAL_BACKOFF policy can reach, or max time until elapsed for 
UNTIL_ELAPSED policy to connect the zookeeper ensemble                          
              | int      | 1.0.0 |
+| kyuubi.ha.zookeeper.connection.retry.policy    | EXPONENTIAL_BACKOFF         
                                   | The retry policy for connecting to the 
ZooKeeper ensemble, all candidates are: <ul><li>ONE_TIME</li><li> 
N_TIME</li><li> EXPONENTIAL_BACKOFF</li><li> 
BOUNDED_EXPONENTIAL_BACKOFF</li><li> UNTIL_ELAPSED</li></ul>       | string   | 
1.0.0 |
+| kyuubi.ha.zookeeper.connection.timeout         | 15000                       
                                   | The timeout(ms) of creating the connection 
to the ZooKeeper ensemble                                                       
                                                                                
              | int      | 1.0.0 |
+| kyuubi.ha.zookeeper.engine.auth.type           | NONE                        
                                   | The type of ZooKeeper authentication for 
the engine, all candidates are <ul><li>NONE</li><li> KERBEROS</li><li> 
DIGEST</li></ul>                                                                
                         | string   | 1.3.2 |
+| kyuubi.ha.zookeeper.namespace                  | kyuubi                      
                                   | (deprecated) The root directory for the 
service to deploy its instance uri                                              
                                                                                
                 | string   | 1.0.0 |
+| kyuubi.ha.zookeeper.node.creation.timeout      | PT2M                        
                                   | Timeout for creating ZooKeeper node        
                                                                                
                                                                                
              | duration | 1.2.0 |
+| kyuubi.ha.zookeeper.publish.configs            | false                       
                                   | When set to true, publish Kerberos configs 
to Zookeeper. Note that the Hive driver needs to be greater than 1.3 or 2.0 or 
apply HIVE-11581 patch.                                                         
               | boolean  | 1.4.0 |
+| kyuubi.ha.zookeeper.quorum                                                   
                                  || (deprecated) The connection string for the 
ZooKeeper ensemble                                                              
                                                                                
              | string   | 1.0.0 |
+| kyuubi.ha.zookeeper.session.timeout            | 60000                       
                                   | The timeout(ms) of a connected session to 
be idled                                                                        
                                                                                
               | int      | 1.0.0 |
 
 ### Kinit
 
diff --git 
a/kyuubi-ha/src/main/scala/org/apache/kyuubi/ha/HighAvailabilityConf.scala 
b/kyuubi-ha/src/main/scala/org/apache/kyuubi/ha/HighAvailabilityConf.scala
index eba069da2..28305ac52 100644
--- a/kyuubi-ha/src/main/scala/org/apache/kyuubi/ha/HighAvailabilityConf.scala
+++ b/kyuubi-ha/src/main/scala/org/apache/kyuubi/ha/HighAvailabilityConf.scala
@@ -91,22 +91,33 @@ object HighAvailabilityConf {
       .checkValues(AuthTypes.values.map(_.toString))
       .createWithDefault(AuthTypes.NONE.toString)
 
+  val HA_ZK_AUTH_SERVER_PRINCIPAL: OptionalConfigEntry[String] =
+    buildConf("kyuubi.ha.zookeeper.auth.serverPrincipal")
+      .doc("Kerberos principal name of ZooKeeper Server. It only takes effect 
when " +
+        "Zookeeper client's version at least 3.5.7 or 3.6.0 or applies 
ZOOKEEPER-1467. " +
+        "To use Zookeeper 3.6 client, compile Kyuubi with `-Pzookeeper-3.6`.")
+      .version("1.8.0")
+      .stringConf
+      .createOptional
+
   val HA_ZK_AUTH_PRINCIPAL: ConfigEntry[Option[String]] =
     buildConf("kyuubi.ha.zookeeper.auth.principal")
-      .doc("Name of the Kerberos principal is used for ZooKeeper 
authentication.")
+      .doc("Kerberos principal name that is used for ZooKeeper 
authentication.")
       .version("1.3.2")
       .fallbackConf(KyuubiConf.SERVER_PRINCIPAL)
 
-  val HA_ZK_AUTH_KEYTAB: ConfigEntry[Option[String]] = 
buildConf("kyuubi.ha.zookeeper.auth.keytab")
-    .doc("Location of the Kyuubi server's keytab is used for ZooKeeper 
authentication.")
-    .version("1.3.2")
-    .fallbackConf(KyuubiConf.SERVER_KEYTAB)
+  val HA_ZK_AUTH_KEYTAB: ConfigEntry[Option[String]] =
+    buildConf("kyuubi.ha.zookeeper.auth.keytab")
+      .doc("Location of the Kyuubi server's keytab that is used for ZooKeeper 
authentication.")
+      .version("1.3.2")
+      .fallbackConf(KyuubiConf.SERVER_KEYTAB)
 
-  val HA_ZK_AUTH_DIGEST: OptionalConfigEntry[String] = 
buildConf("kyuubi.ha.zookeeper.auth.digest")
-    .doc("The digest auth string is used for ZooKeeper authentication, like: 
username:password.")
-    .version("1.3.2")
-    .stringConf
-    .createOptional
+  val HA_ZK_AUTH_DIGEST: OptionalConfigEntry[String] =
+    buildConf("kyuubi.ha.zookeeper.auth.digest")
+      .doc("The digest auth string is used for ZooKeeper authentication, like: 
username:password.")
+      .version("1.3.2")
+      .stringConf
+      .createOptional
 
   val HA_ZK_CONN_MAX_RETRIES: ConfigEntry[Int] =
     buildConf("kyuubi.ha.zookeeper.connection.max.retries")
diff --git 
a/kyuubi-ha/src/main/scala/org/apache/kyuubi/ha/client/zookeeper/ZookeeperClientProvider.scala
 
b/kyuubi-ha/src/main/scala/org/apache/kyuubi/ha/client/zookeeper/ZookeeperClientProvider.scala
index eaffedd12..d0749c8d9 100644
--- 
a/kyuubi-ha/src/main/scala/org/apache/kyuubi/ha/client/zookeeper/ZookeeperClientProvider.scala
+++ 
b/kyuubi-ha/src/main/scala/org/apache/kyuubi/ha/client/zookeeper/ZookeeperClientProvider.scala
@@ -108,7 +108,11 @@ object ZookeeperClientProvider extends Logging {
           throw new IOException(s"${HA_ZK_AUTH_KEYTAB.key}: $keytab does not 
exists")
         }
         System.setProperty("zookeeper.sasl.clientconfig", 
"KyuubiZooKeeperClient")
-        val serverPrincipal = KyuubiHadoopUtils.getServerPrincipal(principal)
+        conf.get(HA_ZK_AUTH_SERVER_PRINCIPAL).foreach { zkServerPrincipal =>
+          // ZOOKEEPER-1467 allows configuring SPN in client
+          System.setProperty("zookeeper.server.principal", zkServerPrincipal)
+        }
+        val zkClientPrincipal = KyuubiHadoopUtils.getServerPrincipal(principal)
         // HDFS-16591 makes breaking change on JaasConfiguration
         val jaasConf = DynConstructors.builder()
           .impl( // Hadoop 3.3.5 and above
@@ -124,7 +128,7 @@ object ZookeeperClientProvider extends Logging {
             classOf[String],
             classOf[String])
           .build[Configuration]()
-          .newInstance("KyuubiZooKeeperClient", serverPrincipal, keytab)
+          .newInstance("KyuubiZooKeeperClient", zkClientPrincipal, keytab)
         Configuration.setConfiguration(jaasConf)
       case _ =>
     }

Reply via email to