【Hadoop学习】Super用户以其他用户的名义执行操作
Hadoop版本:2.6.0
本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接:
http://www.cnblogs.com/zhangningbo/p/4146410.html
简介
本文描述了超级用户如何用一种安全的方法以其他用户的名义提交作业或者访问HDFS。
使用场景
下一节描述的代码示例适用于下面的使用场景。
超级用户super以用户joe的名义提交作业并访问HDFS。这个超级用户拥有kerberos秘钥,而用户joe没有。任务必须以用户joe的身份来执行,而且对namenode上任何文件的访问都必须以用户joe的身份来完成。用户joe必须能够在经过super用户的kerberos秘钥认证的连接上连至namenode或jobtracker。换句话说,用户super正在冒充用户joe。
代码示例
在该示例中,super用户的kerberos秘钥用于登录,并且为用户joe创建一个代理用户ugi(user group information,用户组信息)对象。
... //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); } }
配置
超级用户必须在namenode和jobtracker上进行配置,以便允许其能够冒充其他用户。如下配置参数是必须的:
<property> <name>hadoop.proxyuser.super.groups</name> <value>group1,group2</value> <description>Allow the superuser super to impersonate any members of the group group1 and group2</description> </property>
<property> <name>hadoop.proxyuser.super.hosts</name> <value>host1,host2</value> <description>The superuser can connect only from host1 and host2 to impersonate a user</description> </property>
如果这些配置没有出现,那么,冒充行为就不会被允许,而且连接也会失败。
如果想要更宽松些的安全性,那么,通配值*可以用于允许来自任何主机或用户的冒充行为。即:将上面的参数值改成 * 。
警告
超级用户必须有kerberos秘钥才能冒充其他用户。他不能使用协商口令来使用该特性。如果超级用户把自己的协商口令添加到代理用户ugi中,那么冒充操作就会出错,因为这么做会允许代理用户使用超级用户的权限连接到(提供冒充功能的)服务。
然而,如果超级用户确实想给用户joe一个协商口令,那么,首先必须以如上代码示例所用的同样的方法冒充用户joe,并为用户joe获取一个协商口令,同时把该口令添加到用户joe的ugi中。使用这种方法,用户joe就会拥有协商口令了。