brightwon opened a new issue, #3787:
URL: https://github.com/apache/iceberg-python/issues/3787

   ### Apache Iceberg version
   
   0.11.0 (latest release)
   
   ### Please describe the bug 🐞
   
   When connecting to a Kerberos-enabled Hive Metastore, authentication fails 
if the service
   principal's host does not match the host in the connection URI, and there is 
no setting to
   correct it.
   
   I connect to the metastore through three HA hosts:
   
   ```python
   from pyiceberg.catalog import load_catalog
   
   catalog = load_catalog("hive", **{
       "type": "hive",
       "uri": "thrift://myhms1:9083,thrift://myhms2:9083,thrift://myhms3:9083",
       "hive.kerberos-authentication": "true",
       "hive.kerberos-service-name": "myservice",
   })
   catalog.list_namespaces()
   ```
   
   The last line fails with:
   
   ```
   Traceback (most recent call last):
     File "test.py", line 24, in <module>
       ns = catalog.list_namespaces()
     File ".../pyiceberg/catalog/hive.py", line 769, in list_namespaces
       with self._client as open_client:
     File ".../pyiceberg/catalog/hive.py", line 180, in __enter__
       self._transport.open()
     File ".../thrift/transport/TTransport.py", line 382, in open
       initial_response = self.sasl.process()
     File ".../puresasl/client.py", line 148, in process
       return self._chosen_mech.process(challenge)
     File ".../puresasl/mechanisms.py", line 505, in process
       kerberos.authGSSClientStep(self.context, '')
   kerberos.GSSError
   ```
   
   Enabling `KRB5_TRACE` shows that the failure happens when the client asks 
the KDC for a
   service ticket:
   
   ```
   set-error: -1765328243: Did not find credential for 
myservice/[email protected] in cache FILE:...
   set-error: -1765328377: Error from KDC: LOOKING_UP_SERVER while looking up 
'myservice/[email protected]'
   ```
   
   My Hive Metastore's service principal is `myservice/[email protected]`. 
PyIceberg,
   however, requests a ticket using my HMS server hostname (`myhms1`) as the 
hostname
   component, which is not a valid service principal, so the request fails.
   
   A Kerberos service principal has the form `Service/Hostname@REALM` (see
   [3.2 Principal](https://www.kerberos.org/software/tutorial.html#1.3.2) in 
the Kerberos
   tutorial), and with SASL/GSSAPI
   those two components come from the `service` and `host` arguments passed to 
the client.
   PyIceberg always derives that `host` from the connection URI, so it is 
forced to be whichever
   host you connect to. `hive.kerberos-service-name` (added in #2141) makes the 
`Service` part
   configurable, but there is no equivalent for `Hostname`.
   
   The relevant line is 
[`pyiceberg/catalog/hive.py#L167`](https://github.com/apache/iceberg-python/blob/pyiceberg-0.11.x/pyiceberg/catalog/hive.py#L167)
   (`_HiveClient._init_thrift_transport`):
   
   ```python
   return TTransport.TSaslClientTransport(socket, host=url_parts.hostname, 
service=self._kerberos_service_name)
   ```
   
   There is no way to avoid this from the client side. The `uri` has to contain 
the hostnames I
   actually connect to, and the principal's hostname component is not one of 
them. Listing multiple URIs
   does not help either, because the client is built from the first URI and the 
failure happens
   later, during authentication.
   
   So I patch that line locally and hardcode the host:
   
   ```python
   -return TTransport.TSaslClientTransport(socket, host=url_parts.hostname, 
service=self._kerberos_service_name)
   +return TTransport.TSaslClientTransport(socket, host="hive-host", 
service=self._kerberos_service_name)
   ```
   
   With that one change everything works well. PyIceberg requests
   `myservice/[email protected]` and `catalog.list_namespaces()` succeeds.
   
   I would like to propose a new configuration property, 
`hive.kerberos-service-host`. It could
   be added in the same way as 
[#2141](https://github.com/apache/iceberg-python/pull/2141). When
   the property is not set, the URI host would be used as the default, so the 
current behavior is
   preserved for backward compatibility.
   
   I have finished the implementation including unit tests, and verified it 
end-to-end against
   the same metastore.
   
   If this is welcome, I would like to submit the PR myself.
   
   
   ### Willingness to contribute
   
   - [x] I can contribute a fix for this bug independently
   - [ ] I would be willing to contribute a fix for this bug with guidance from 
the Iceberg community
   - [ ] I cannot contribute a fix for this bug at this time


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to