代理用户 - 超级用户代表其他用户执行操作

简介

本文档介绍了超级用户如何代表其他用户提交作业或访问 hdfs。

用例

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

用户名为“super”的超级用户希望代表用户 joe 提交作业并访问 hdfs。超级用户具有 kerberos 凭据,但用户 joe 没有。需要以用户 joe 的身份运行任务,并且需要以用户 joe 的身份执行名称节点上的任何文件访问。需要用户 joe 能够使用超级用户的 kerberos 凭据连接到经过身份验证的连接上的名称节点或作业跟踪器。换句话说,超级用户正在模拟用户 joe。

Apache Oozie 等一些产品需要此功能。

代码示例

在此示例中,超级用户的凭据用于登录,并为 joe 创建了一个代理用户 ugi 对象。操作在此代理用户 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.hosts 以及 hadoop.proxyuser.$superuser.groupshadoop.proxyuser.$superuser.users(或两者)来配置代理用户。

通过在 core-site.xml 中指定如下内容,名为 super 的超级用户只能从 host1host2 连接,以模拟属于 group1group2 的用户。

   <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.25510.113.221.221 中的主机访问可以模拟 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>

注意事项

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

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

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