本帖最后由 pig2 于 2015-12-9 18:02 编辑
问题导读
1.你认为什么情况下使用代理用户?
2.代理用户与普通用户的区别是什么?
3.如何配置超级用户代理其它用户?
说明
这个文档描述怎么使用超级用户提交job和代理其它用户访问hdfs
用例
下一节中描述的代码示例适用于以下用例。
超级用户‘super’ 代理用户joe提交job和访问hdfs,超级用户有kerberos认证,用户joe没有。任务需要运行用户joe和任何文件访问NameNode需要用户joe。它需要用户joe连接namenode或则job tracker使用super的kerberos凭据的连接认证,换句话说,超级用户模拟【冒充】用户joe
代码示例
在这个例子中超级的凭证用于登录和创建一个代理用户ugi对象为joe。这个操作实现了代理用户ugi对象的doAs方法
[mw_shl_code=bash,true] ...
//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);
}
}[/mw_shl_code]
配置
你可以配置代理用户使用属性 hadoop.proxyuser.$superuser.hosts 或则使用 hadoop.proxyuser.$superuser.groups 和 adoop.proxyuser.$superuser.users.通过指定如下 core-site.xml,超级用户super冒充用户属于group1 和 group2,仅能连接 host1 和 host2
[mw_shl_code=bash,true]<property>
<name>hadoop.proxyuser.super.hosts</name>
<value>host1,host2</value>
</property>
<property>
<name>hadoop.proxyuser.super.groups</name>
<value>group1,group2</value>
</property>[/mw_shl_code]
如果没有配置这些,冒充不被允许,连接失败。更宽松的不严格的安全性,通配符的值*允许代理任何用户,任何host。比如通过以下core-site.xml,用户oozie访问任何host,可以代理任何用户所属的任何组
[mw_shl_code=bash,true] <property>
<name>hadoop.proxyuser.oozie.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.oozie.groups</name>
<value>*</value>
</property>[/mw_shl_code]
hadoop.proxyuser.$superuser.hosts访问 ip 地址列表,CIDR格式和/或主机名IP地址范围。比如以下,用户super 访问主机ip地址范围 10.222.0.0-15 到 10.113.221.221,可以代理 user1 和 user2.
[mw_shl_code=bash,true] <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>[/mw_shl_code]
注意事项
如果集群运行在安全模式下,超级用户必须有kerberos凭据才能代理另一个用户。它不能使用委托tokens功能,如果超级用户添加自己的委托token到代理用户ugi这是错误的,它允许代理用户连接到具有超级用户的特权服务。尽管如此,如果超级用户确实想委托token给joe用户,它必须首先代理joe,得到joe的委托token,同样的方法如上面代码示例,添加它到joe的ugi,以这样的方式委托token属于joe.
|
|