I don't see how to do this in our architecture. Our clients may be across VPNs 
and completely inaccessible to the KDC. Our server basically functions as the 
Hadoop client, even though it is a long-running service on the OS host. When a 
user logs in, it performs these steps:
- Spawn a new process using CreateProcessWithLogon on Windows, or 
fork/PAM/setuid on Linux.
- Use UsergroupInformation to login the user using the login/password and 
obtain a ticket for the UGI's default user context.
All of this works just fine, although we are forced to use reflection to gain 
access to the private setLogin() method of UGI.
The thing is, we cannot simply login again in the same process to avoid ticket 
expiration. It doesn't work. I see that there is dedicated code in 
reloginFromKeytab() to clear out the old tokens and install new ones while 
keeping the UGI.class locked. We need to be able to do something similar given 
the login and password.
It would be great if there were an in-process API that completely mimicked 
kinit and managed the TGT cache instead of the in-memory data of UGI. But we 
haven't found one. And we can't just run kinit, because it has no method to 
inject a password (assume intentionally, since there isn't a way to secure that 
as a command-line argument).

As I mentioned before, we can get tickets using login/password via UGI. This 
works. But I get lost around "how does one re-login and use the new ticket?". 
Here's what we observe:
- We do a login and see the TGT in the UGI
- After accessing HDFS, we see the TGT and the HDFS ticket in UGI.
- After user.logout(), both tickets disappear
- After a new login, a new TGT appears
- Accessing HDFS fails and no HDFS ticket is added.
We are trying to understand why this process diverges from reloginFromKeytab(), 
which works just fine.

John Lilley

From: Zheng, Kai [mailto:kai.zh...@intel.com]
Sent: Monday, August 17, 2015 5:40 PM
To: user@hadoop.apache.org
Subject: RE: UserGroupInformation and login with password

Hi John,

Login from keytab is mostly expected for services. For end users, yes they use 
passwords. In Kerberos (and Hadoop), it's expected for end users to execute 
kinit like tool and generate ticket caches, then some methods like login from 
ticket cache in UGI will do the left work and help in your case.

Or do you have to use the password directly in your program? If so, you may add 
the method by yourself: 1) let your program prompt to user for password; 2) if 
your program has gathered the password in other means, then use some support 
like below:
In Krb5LoginModule:
*    useFirstPass   if, true, this LoginModule retrieves the
*                   username and password from the module's shared state,
*                   using "javax.security.auth.login.name" and
*                   "javax.security.auth.login.password" as the respective
*                   keys. The retrieved values are used for authentication.
*                   If authentication fails, no attempt for a retry
*                   is made, and the failure is reported back to the
*                   calling application.

Hope this helps.

Regards,
Kai

From: John Lilley [mailto:john.lil...@redpoint.net]
Sent: Monday, August 17, 2015 11:28 PM
To: 'user@hadoop.apache.org'
Subject: UserGroupInformation and login with password

Greetings,

Our software uses UserGroupInformation to authenticate with Kerberos-secure 
clusters.  We've found that there are obvious methods for logging in via keytab:
loginUserFromKeytab()
reloginFromKeytab()

However, there are not obvious analogous methods for password-based login.  
We've created the equivalent to loginUserFromPassword() using reflection to 
access private members, but have not yet created the equivalent 
reloginFromPassword().

It doesn't seem right to be using reflection here, but we cannot find the 
public API for principal/password login and relogin.  It seems like this should 
be something simple.  We do need to support password, because many of our 
customers do not allow keytabs.

Thanks
John Lilley

Reply via email to