[Kerberos] Java client访问kerberos-secured cluster
使用java client访问kerberos-secured cluster,最重要的是先从admin那里拿到可用的keytab文件,用来作认证。接下来就是调整连接的配置。以下先用连接hdfs为例进行说明。
申请可用的keytab文件
1. 申请可认证的keytab文件,keytab文件用来存储principal的key。由KDC那边生成的principal,最终可以存储在keytab文件中。
2. 安装Kerberos client常用命令,并熟悉kerberos认证原理。
3. 配置/etc/krc5.conf,作为kerberos client端需要指明KDC的位置。
配置连接参数
由于直接用java应用程序去测试链接不太方便,这里推荐通过执行Hadoop command来测试是否能连接成功。
1. kinit 认证
kinit -kt path-to-keytab principalName
先认证principalName是否合法。如果合法,KDC会返回initial TGT。该TGT有效期通常是几个小时。
2. 执行Hadoop命令
hadoop fs -ls hdfs://namenode1:8020
执行这个命令之后,会返回儿各种exception,按照exception的提示,逐步添加配置,如下:
1) 配置使用kerberos认证
hadoop.security.authentication: kerberos
2)Failed to specify server's Kerberos principal name
dfs.namenode.kerberos.principal
3)Server has invalid Kerberos principal
配置完2)后,如果返回 Server has invalid Kerberos principal,这个时候可以从以下三个方面考虑:
- Server principal是否合法或者配置正确,正常情况下将dfs.namenode.kerberos.principal设置成namenode configuration一致就可以了。
- DSN resolver是否一致。The HDFS client will initiate an RPC call to the namenode to get the hdfs service principal. Then the client with compare the hostname from the service princpal to the canonical name of the namenode hostname. In this case the namenode canonical name on the client machine resolved to a different hostname then what was in DNS.
- 如果以上两种情况都正常,exception无法帮助我们锁定问题,可用尝试排除最大限度排除不定因素,缩小问题搜索范围。比如安装和server一样的Hadoop版本,并且保持配置一致。如果command能执行成功,那么可用逐步减去lib, conf属性,从而锁定exception的本质原因。
Java Kerberos认证代码
public class HadoopSecurityUtil {
public static final String EAGLE_KEYTAB_FILE_KEY = "eagle.keytab.file";
public static final String EAGLE_USER_NAME_KEY = "eagle.kerberos.principal";
public static void login(Configuration kConfig) throws IOException {
if (kConfig.get(EAGLE_KEYTAB_FILE_KEY) == null || kConfig.get(EAGLE_USER_NAME_KEY) == null) return;
kConfig.setBoolean("hadoop.security.authorization", true);
kConfig.set("hadoop.security.authentication", "kerberos");
UserGroupInformation.setConfiguration(kConfig);
UserGroupInformation.loginUserFromKeytab(kConfig.get(EAGLE_USER_NAME_KEY), kConfig.get(EAGLE_KEYTAB_FILE_KEY));
}
}
配置示例
- HDFS
{
"fs.defaultFS":"hdfs://nameservice1",
"dfs.nameservices": "nameservice1",
"dfs.ha.namenodes.nameservice1":"namenode1,namenode2",
"dfs.namenode.rpc-address.nameservice1.namenode1": "hadoopnamenode01:8020",
"dfs.namenode.rpc-address.nameservice1.namenode2": "hadoopnamenode02:8020",
"dfs.client.failover.proxy.provider.apollo-phx-nn-ha": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider",
"eagle.keytab.file":"/EAGLE-HOME/.keytab/b_eagle.keytab_apd",
"eagle.kerberos.principal":"eagle@EXAMPLE.COM"
}
- HBase
{
"hbase.zookeeper.property.clientPort":"",
"hbase.zookeeper.quorum":"localhost",
"hbase.security.authentication":"kerberos",
"hbase.master.kerberos.principal":"hadoop/_HOST@EXAMPLE.COM",
"zookeeper.znode.parent":"/hbase",
"eagle.keytab.file":"/EAGLE-HOME/.keytab/eagle.keytab",
"eagle.kerberos.principal":"eagle@EXAMPLE.COM"
}
References
- https://github.com/randomtask1155/HadoopDNSVerifier
- https://support.pivotal.io/hc/en-us/articles/204391288-hdfs-ls-command-fails-with-Server-has-invalid-Kerberos-principal
[Kerberos] Java client访问kerberos-secured cluster的更多相关文章
- Java client 访问 memcached
在测试项目中引入了memcached作为缓存层,以下是memcached的缓存配置和调用过程. linux下memcached安装过程 直接参考以前的博文linux下安装memcached过程 不再 ...
- Hbase之Java API远程访问Kerberos认证
HbaseConnKer.java package BigData.conn; import BigData.utils.resource.ResourcesUtils; import org.apa ...
- JAVA API访问Hbase org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=32
Java使用API访问Hbase报错: 我的hbase主节点是spark1 java代码访问hbase的时候写的是ip 结果运行程序报错 不能够识别主机名 修改主机名 修改主机hosts文 ...
- 【Tech】CAS多机部署Server和Java Client端
昨天尝试把cas的java client端部署到另外一台机器,结果就有问题了.(localhost部署cas server和java client端参见:http://www.cnblogs.com/ ...
- elasticsearch Java Client用户指南
这里使用的Java客户端版本是5.1.2,Elasticsearch的版本号也要是5.1.2,否则一些功能可能不支持. 之前介绍过Spring Data Elasticsearch,那里也是使用了本文 ...
- 使用poco 的NetSSL_OpenSSL 搭建https 服务端,使用C++客户端,java 客户端访问,python访问(python还没找到带证书访问的代码.)
V20161028 由于项目原因,需要用到https去做一些事情. 这儿做了一些相应的研究. 这个https 用起来也是折腾人,还是研究了一周多+之前的一些积累. 目录 1,java client 通 ...
- Java ssh 访问windows/Linux
Java ssh 访问windows/Linux 工作中遇到的问题: Java code运行在一台机器上,需要远程到linux的机器同时执行多种命令.原来采用的方法是直接调用ssh命令或者调用pli ...
- 5 weekend01、02、03、04、05、06、07的分布式集群的HA测试 + hdfs--动态增加节点和副本数量管理 + HA的java api访问要点
weekend01.02.03.04.05.06.07的分布式集群的HA测试 1) weekend01.02的hdfs的HA测试 2) weekend03.04的yarn的HA测试 1) wee ...
- elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)
一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RE ...
随机推荐
- 《InsideUE4》-4-GamePlay架构(三)WorldContext,GameInstance,Engine
Tags: InsideUE4 UE4深入学习QQ群: 456247757 引言 前文提到说一个World管理多个Level,并负责它们的加载释放.那么,问题来了,一个游戏里是只有一个World吗? ...
- 【2016-11-10】【坚持学习】【Day23】【Socket 编程初步了解】
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.
- UVALive 4428 Solar Eclipse --计算几何,圆相交
题意:平面上有一些半径为R的圆,现在要在满足不与现有圆相交的条件下放入一个圆,求这个圆能放的位置的圆心到原点的最短距离. 解法:我们将半径扩大一倍,R = 2*R,那么在每个圆上或圆外的位置都可以放圆 ...
- [转载]我的Java后端书架 (2016年暖冬4.0版)
[转载]我的Java后端书架 (2016年暖冬4.0版) ps:最近正在初学Java,有一些其他语言的底子,但是还是要好好看书,好好练习,网上找了好久,都没有这份书单来的实用,特意转载过来,方便以 ...
- 第九章 JQUI
一.什么是插件 ①是遵循一定接口规范编写的程序 ②是原有系统平台功能的扩展和补充 ③只能运行在规定的系统平台下,而不能单独运行 注:由于jQuery插件是基于jQuery脚本库的扩展,所以所有jQue ...
- Nginx负载均衡实践之一:基本实现
由于现在的网站架构越来越大,基于互联网的用户也是日渐增长,所以传统的单机版服务器已经渐渐不能适应时代发展的需要.最近在和其他企业接触的过程中,发现对于互联网的经验尤为看重,所谓的互联网经验,其实就是指 ...
- 使用Cordova和JQM在ios上需要注意的问题
1.ios编译 cordova platform add ios --save cordova build ios 2.IOS 微信和地图調用問題:因IOS 9.0以上版本白名單限制,衹有加入白名單的 ...
- .net项目在linux平台的CI流程(基于Jenkins+mono+jexus)
内容较多,主要分为以下4方面内容: Jenkins的安装部署(centos 7+) .net在linux平台CI流程所需的插件管理&配置 Jenkins配置连接Gitlab(也可使用对应插件连 ...
- Mysql主从配置,实现读写分离
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- 【USACO 3.1】Score Inflation(完全背包)
完全背包. http://train.usaco.org/usacoprob2?a=3Srffjlf4QI&S=inflate /* TASK:inflate LANG:C++ URL: */ ...