Super-User
谁启动NameNode,谁就是super-user。 super-user可以执行任意操作,权限校验从不失败。HDFS super-user 不必是NameNode 主机上的super-user,也不是说集群内的说有主机都需要有这个super-user。
如果在个人电脑上实验运行HDFS,为方便起见无须任何配置该用户即成为安装的super-user。

另外,管理员还可以通过配置参数标识一个特定组。该组内的成员也是super-users。

介绍

本文档描述了superuser如何替其他用户提交任务。

案例

下面的代码范例是根据如下场景。

superuser 用户名 super,想替用户 joe提交任何和访问hdfs。superuser 有 kerberos 凭据,但是用户 joe 没有。任务需要以用户joe运行,对namenode上任何文件的访问也必须以用户joe完成。需要用户joe可以借助super的kerberos凭据建立连接连到namenode或job tracker。换个说法,super正在 impersonating (模拟)用户joe

有些产品需要该功能,比如Apache Oozie。

代码范例

范例中,super的凭据用于登录,给用户joe创建一个proxy user ugi对象。操作以*proxy user ugi对象的doAs方法进行。

    ...
    //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);
      }
    }

配置

你可以使用属性 hadoop.proxyuser.$superuser.hostshadoop.proxyuser.$superuser.groupshadoop.proxyuser.$superuser.users 来配置 proxy user。

通过在 core-site.xml 作如下设置,superuser 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>

如果这些配置不存在,impersonation(模拟)将不被允许,连接会失败。

如果安全要求不高,通配符*可以用于来自任何主机或任何用户的 impersonation (模拟)。比如,如下core-site.xml 的设置,来自任意主机的用户 oozie 可以 impersonate (模拟)属于任意组的任何用户。

  <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地址范围,以及主机名。比如,如下设置,来自10.222.0.0-15 and 10.113.221.221主机的用户 super 可以 impersonate(模拟) user1user2

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

注意事项

如果集群运行于 Secure Mode,superuser 必须拥有 kerberos 凭据来可以 impersonate (模拟)其他用户。

这个功能不能使用 delegation tokens (委派令牌)。superuser 不能将它的delegation token添加到proxy user ugi,因为这会允许proxy user可以以superuser的权限连接到服务。

无论如何,如果superuser不想把 delegation token 给 joe,它必须先 impersonate(模拟)joe并给joe获取delegation token ,就如上范例代码,然后将其添加到 ugi of joe。这样, delegation token 就可以被joe 使用了。

 
 

转自:https://www.jianshu.com/p/c7e00c0d206f