介绍

本文档描述了超级用户如何代表另一个用户提交作业或访问HDFS。

用例

下一节中描述的代码示例适用于以下用例。

一个名为’super’的超级用户想要代表用户joe提交作业并访问hdfs。超级用户具有Kerberos凭据,但用户joe没有。

任务需要以用户joe的身份运行,并且需要在Namenode上以用户joe的身份执行任何文件访问。

需要用户joe能够连接到使用超级Kerberos凭据进行身份验证的Namenode或JobTracker。

换句话说,超级用户正在代表用户joe进行身份验证。

一些产品,如Apache Oozie,需要这样做。

代码示例

在这个例子中,超级用户的凭证用于登录,并为joe创建了代理用户UGI对象。

在这个代理用户UGI对象的doAs方法中执行操作。

...
// 为joe创建UGI。登录用户是'super'。
UserGroupInformation ugi =
        UserGroupInformation.createProxyUser("joe", UserGroupInformation.getLoginUser());
ugi.doAs(new PrivilegedExceptionAction<Void>() {
  public Void run() throws Exception {
    // 提交作业
    JobClient jc = new JobClient(conf);
    jc.submitJob(conf);
    // 或者访问hdfs
    FileSystem fs = FileSystem.get(conf);
    fs.mkdir(someFilePath);
  }
}

配置

您可以使用属性hadoop.proxyuser.$superuser.hosts,以及hadoop.proxyuser.$superuser.groups和/或hadoop.proxyuser.$superuser.users中的一个或两个配置代理用户。

通过在core-site.xml中指定如下,名为super的超级用户只能从host1和host2连接,以模拟属于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>

如果不存在这些配置,则将不允许模拟,并且连接将失败。

如果更宽松的安全性更可取,则可以使用通配符值*,以允许从任何主机模拟任何用户。

例如,在core-site.xml中指定如下,名为oozie的用户可以从任何主机访问,可以模拟任何属于任何组的用户。

<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地址范围和/或主机名。

例如,通过如下指定,名为super的用户可以从位于10.222.0.0-10.222.255.255和10.113.221.221范围内的主机访问,可以模拟user1和user2。

<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>

注意事项

如果集群运行在安全模式下,则超级用户必须具有Kerberos凭证才能模拟另一个用户。

它不能使用委派令牌进行此功能。如果超级用户将其自己的委派令牌添加到代理用户ugi中,将允许代理用户使用超级用户的特权连接到服务,这是错误的。

然而,如果超级用户确实想要给joe一个委派令牌,它必须首先模拟joe并为joe获取一个委派令牌,就像上面的代码示例一样,并将其添加到joe的ugi中。

这样委派令牌的所有者将是joe。

参考资料

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/Superusers.html