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.hosts
、hadoop.proxyuser.$superuser.groups
、 hadoop.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(模拟) 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>
注意事项
如果集群运行于 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
使用了。