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>


如果管理员不进行以上配置,则认为不允许任何用户伪装成其他用户。