1、场景
假设一个超级用户super想要以一个名为joe的用户的名义向hdfs提交作业。super使用kerberos认证,但joe并没有。这要求joe可以使用超级用户认证过了的连接,来操作namenode和job tracker。
这个场景在Apache Oozie中可能会发生。
示例代码:
...
//Create ugi for joe. The login user is 'super'.
UserGroupInformation ugi =
UserGroupInformation.createProxyUser("joe", UserGroupInformation.getLoginUser());
ugi.doAs(new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception {
//Submit a job
JobClient jc = new JobClient(conf);
jc.submitJob(conf);
//OR access hdfs
FileSystem fs = FileSystem.get(conf);
fs.mkdir(someFilePath);
}
}
登录使用的是超级用户,代理用户对象向ugi以joe的名义被创建。doAs中的操作是以joe的名义执行的。
2、配置
在core-site.xml中通过hadoop.proxyuser.$superuser.hosts和hadoop.proxyuser.$superuser.groups 或hadoop.proxyuser.$superuser.users.等参数可以配置代理用户
下面的配置中,从主机host1和主机host2连接的super可以伪装成一个属于group1和group2的用户。
<property>
<name>hadoop.proxyuser.super.hosts</name>
<value>host1,host2</value>
</property>
<property>
<name>hadoop.proxyuser.super.groups</name>
<value>group1,group2</value>
</property>
下面的配置中使用了通配符,从任何主机登录的oozie用户可以伪装成一个属于任何group的用户
<property>
<name>hadoop.proxyuser.oozie.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.oozie.groups</name>
<value>*</value>
</property>
hadoop.proxyuser.$superuser.hosts中可以配置ip地址,CIDR格式的ip地址和主机名
<property>
<name>hadoop.proxyuser.super.hosts</name>
<value>10.222.0.0/16,10.113.221.221</value>
</property>
<property>
<name>hadoop.proxyuser.super.users</name>
<value>user1,user2</value>
</property>