Tony,

Sorry, missed this email earlier. This seems more appropriate for the Hbase
aliases.

Thx.

On Wed, Jul 11, 2012 at 8:41 AM, Tony Dean <tony.d...@sas.com> wrote:

> Hi,
>
> Looking at this further, it appears that when HBaseRPC is creating a proxy
> (e.g., SecureRpcEngine), it injects the current user:
> User.getCurrent() which by default is the cached Kerberos TGT (kinit'ed
> user - using the "hadoop-user-kerberos" JAAS context).
>
> Since the server proxy always uses User.getCurrent(), how can an
> application inject the user it wants to use for authorization checks on the
> peer (region server)?
>
> And since SecureHadoopUser is a static class, how can you have more than 1
> active user in the same application?
>
> What you have works for a single user application like the hbase shell,
> but what about a multi-user application?
>
> Am I missing something?
>
> Thanks!
>
> -Tony
>
> -----Original Message-----
> From: Alejandro Abdelnur [mailto:t...@cloudera.com]
> Sent: Monday, July 02, 2012 11:40 AM
> To: common-user@hadoop.apache.org
> Subject: Re: hadoop security API (repost)
>
> Tony,
>
> If you are doing a server app that interacts with the cluster on behalf of
> different users (like Ooize, as you mentioned in your email), then you
> should use the proxyuser capabilities of Hadoop.
>
> * Configure user MYSERVERUSER as proxyuser in Hadoop core-site.xml (this
> requires 2 properties settings, HOSTS and GROUPS).
> * Run your server app as MYSERVERUSER and have a Kerberos principal
> MYSERVERUSER/MYSERVERHOST
> * Initialize your server app loading the MYSERVERUSER/MYSERVERHOST keytab
> * Use the UGI.doAs() to create JobClient/Filesystem instances using the
> user you want to do something on behalf
> * Keep in mind that all the users you need to do something on behalf
> should be valid Unix users in the cluster
> * If those users need direct access to the cluster, they'll have to be
> also defined in in the KDC user database.
>
> Hope this helps.
>
> Thx
>
> On Mon, Jul 2, 2012 at 6:22 AM, Tony Dean <tony.d...@sas.com> wrote:
> > Yes, but this will not work in a multi-tenant environment.  I need to be
> able to create a Kerberos TGT per execution thread.
> >
> > I was hoping through JAAS that I could inject the name of the current
> principal and authenticate against it.  I'm sure there is a best practice
> for hadoop/hbase client API authentication, just not sure what it is.
> >
> > Thank you for your comment.  The solution may well be associated with
> the UserGroupInformation class.  Hopefully, other ideas will come from this
> thread.
> >
> > Thanks.
> >
> > -Tony
> >
> > -----Original Message-----
> > From: Ivan Frain [mailto:ivan.fr...@gmail.com]
> > Sent: Monday, July 02, 2012 8:14 AM
> > To: common-user@hadoop.apache.org
> > Subject: Re: hadoop security API (repost)
> >
> > Hi Tony,
> >
> > I am currently working on this to access HDFS securely and
> programmaticaly.
> > What I have found so far may help even if I am not 100% sure this is the
> right way to proceed.
> >
> > If you have already obtained a TGT from the kinit command, hadoop
> library will locate it "automatically" if the name of the ticket cache
> corresponds to default location. On Linux it is located
> /tmp/krb5cc_uid-number.
> >
> > For example, with my linux user hdfs, I get a TGT for hadoop user 'ivan'
> > meaning you can impersonate ivan from hdfs linux user:
> > ------------------------------------------
> > hdfs@mitkdc:~$ klist
> > Ticket cache: FILE:/tmp/krb5cc_10003
> > Default principal: i...@hadoop.lan
> >
> > Valid starting    Expires           Service principal
> > 02/07/2012 13:59  02/07/2012 23:59  krbtgt/hadoop....@hadoop.lan renew
> > until 03/07/2012 13:59
> > -------------------------------------------
> >
> > Then, you just have to set the right security options in your hadoop
> client in java and the identity will be i...@hadoop.lan for our example.
> In my tests, I only use HDFS and here a snippet of code to have access to a
> secure hdfs cluster assuming the previous TGT (ivan's impersonation):
> >
> > --------------------------------------------
> >      val conf: HdfsConfiguration = new HdfsConfiguration()
> >
> > conf.set(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION,
> > "kerberos")
> >
> > conf.set(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHORIZATION,
> > "true")
> >      conf.set(DFSConfigKeys.DFS_NAMENODE_USER_NAME_KEY,
> > serverPrincipal)
> >
> >      UserGroupInformation.setConfiguration(conf)
> >
> >      val fs = FileSystem.get(new URI(hdfsUri), conf)
> > --------------------------------------------
> >
> > Using this 'fs' is a handler to access hdfs securely as user 'ivan' even
> if ivan does not appear in the hadoop client code.
> >
> > Anyway, I also see two other options:
> >   * Setting the KRB5CCNAME environment variable to point to the right
> ticketCache file
> >   * Specifying the keytab file you want to use from the
> UserGroupInformation singleton API:
> > UserGroupInformation.loginUserFromKeytab(user, keytabFile)
> >
> > If you want to understand the auth process and the different options to
> login, I guess you need to have a look to the UserGroupInformation.java
> source code (release 0.23.1 link: http://bit.ly/NVzBKL). The private
> class HadoopConfiguration line 347 is of major interest in our case.
> >
> > Another point is that I did not find any easy way to prompt the user for
> a password at runtim using the actual hadoop API. It appears to be somehow
> hardcoded in the UserGroupInformation singleton. I guess it could be nice
> to have a new function to give to the UserGroupInformation an authenticated
> 'Subject' which could override all default configurations. If someone have
> better ideas it could be nice to discuss on it as well.
> >
> >
> > BR,
> > Ivan
> >
> > 2012/7/1 Tony Dean <tony.d...@sas.com>
> >
> >> Hi,
> >>
> >> The security documentation specifies how to test a secure cluster by
> >> using kinit and thus adding the Kerberos principal TGT to the ticket
> >> cache in which the hadoop client code uses to acquire service tickets
> >> for use in the cluster.
> >> What if I created an application that used the hadoop API to
> >> communicate with hdfs and/or mapred protocols, is there a
> >> programmatic way to inform hadoop to use a particular Kerberos
> >> principal name with a keytab that contains its password key?  I
> >> didn't see a way to integrate with JAAS KrbLoginModule.
> >> I was thinking that if I could inject a callbackHandler, I could pass
> >> the principal name and the KrbLoginModule already has options to
> >> specify keytab.
> >> Is this something that is possible?  Or is this just not the right
> >> way to do things?
> >>
> >> I read about impersonation where authentication is performed with a
> >> system user such as "oozie" and then it just impersonates other users
> >> so that permissions are based on the impersonated user instead of the
> >> system user.
> >>
> >> Please help me understand my options for executing hadoop tasks in a
> >> multi-tenant application.
> >>
> >> Thank you!
> >>
> >>
> >>
> >
> >
> > --
> > Ivan Frain
> > 11, route de Grenade
> > 31530 Saint-Paul-sur-Save
> > mobile: +33 (0)6 52 52 47 07
> >
>
>
>
> --
> Alejandro
>
>
>


-- 
Alejandro

Reply via email to