服务端:
这次开发的服务有两个前提设置:
1)是基于NN启动而启动的。
2)使用了 kerberos 认证。
3)使用自己设置的端口和进程单独服务。
所以,在服务启动时可以使用NN的kerberos 认证信息进行认证。在启动服务前,通过HADOOP 的配置文件获取到 principal 和 keyTabPath 并将 principal 的值赋于 CommonConfigurationKeys.HADOOP_SECURITY_SERVICE_USER_NAME_KEY 这个配置参数。

然后获取 RPC.server 的 实例,将相关的 hadoop的配置conf,protocol,instance,host,port,numHandlers 等参数配置,conf 以外的其他参数引用不需要 kerberos 相关的引入。
接着启动 RPC 服务即可。

接下来是最重要的,刷新服务端ACL
Refresh the service authorization ACL for the service handled by this server

注:保证 hadoop.security.authorization = true hadoop.security.authentication = kerberos。调用 RPC.SERVER 的 refreshServiceAcl 接口即可。refreshServiceAcl 中 conf 参数为 hadoop conf ,provider 是:new HDFSPolicyProvider()。
在 HDFSPolicyProvider 中添加:

你所写的 RPC 服务的class 和 ACL 的配置参数(参数名自定义即可,写入配置文件hadoop-policy.xml中)。
客户端:
客户端和其他客户端的认证方式是一样的。
1)需要将 kerberos 的相关参数写入 conf 中,如下图:

注:也可以设置为读取hadoop 的配置文件方式。
2)然后 创建UserGroupInformation对象。
trySasl 的结果为 true。
ugi AuthMethod Name 为 kerberos

3)创建 client 端,
atomicBoolean 要设置为 false

4)调用服务即可

本文介绍了如何在基于Hadoop RPC协议的服务端和客户端添加Kerberos认证。服务端在启动时利用NN的kerberos信息进行认证,并通过配置RPC服务器实例以启用kerberos。同时,通过调用RPC.SERVER的refreshServiceAcl接口更新ACL,确保hadoop.security.authorization和hadoop.security.authentication设为kerberos。客户端则需要将kerberos相关参数写入配置,并创建客户端实例以调用服务。
314

被折叠的 条评论
为什么被折叠?



