11.3.4 上层服务
在Hadoop中,很多上层服务充当Hadoop服务的请求代理,比如Oozie、Hive等。前面提到,Hadoop添加安全认证机制后,所有访问Hadoop的代理服务均需要拥有服务凭证。为此,Hadoop引入了“超级用户”的概念,这些用户可以以其他人的身份访问Hadoop的各个服务(类似于Linux中的sudo命令)。这些超级用户访问Hadoop服务时,首先自己需能够经过Kerberos认证,然后才能以其他用户的身份访问Hadoop服务。当超级用户希望与Hadoop的某个服务建立RPC连接时,首先需要使用doAs方法设置该连接;如果满足以下条件,Hadoop将接受连接请求:
❑请求用户属于超级用户。
❑用户所在的机器IP在安全IP列表内。
下面以Oozie为例说明上层服务安全访问Hadoop服务的方法。假设Hadoop中包含两个用户:超级用户oozie和普通用户dong。其中,oozie有Kerberos凭证,而dong没有。当用户将作业提交到oozie上后,oozie将以超级用户oozie身份进一步将作业提交到Hadoop上。而实际运行作业时,oozie想以普通用户dong的身份访问HDFS和MapReduce,也就是说,所有任务需以用户dong的身份启动,且以dong身份访问HDFS上文件,即用户oozie伪装成了用户dong。
(1)代码
为了让超级用户oozie安全地伪装成普通用户dong,需使用oozie的Kerberos凭证登录系统并为dong创建一个代理ugi,而真正的Hadoop服务访问操作则放在代理ugi的doAs方法中,具体如下:
……
UserGroupInformation ugi=
UserGroupInformation.createProxyUser(user,
UserGroupInformation.getLoginUser());
ugi.doAs(new PrivilegedExceptionAction<Void>(){
public Void run()throws Exception{
//提交作业
JobClient jc=new JobClient(conf);
jc.submitJob(conf);
//访问HDFS
FileSystem fs=FileSystem.get(conf);
fs.mkdir(someFilePath);
}
}
(2)配置
管理员需要在配置文件中指定超级用户oozie可伪装成的所有用户,同时限制oozie所在的IP,具体如下:
<property>
<name>hadoop.proxyuser.oozie.groups</name>
<value>group1,group2</value>
<description>允许超级用户oozie冒充用户组group1和group2中的所有用户</description>
</property>
<property>
<name>hadoop.proxyuser.oozie.hosts</name>
<value>host1,host2</value>
<description>oozie只能从host1和host2上发起连接以冒充其他用户</description>
</property>
如果管理员不进行以上配置,则认为不允许任何用户伪装成其他用户。