之前用java连接hbase是没有启动Kerberos认证,代码能连接到hbase,也能查询数据;现在启动kerberos认证后再次查询时却不能获取到数据
以下是我的代码,大牛们有知道哪儿出问题了(hbase是基于CDH5.13版本开发的)
System.setProperty("hadoop.home.dir", "/usr/hbase");
conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.property.clientPort", zkPort);
conf.set("hbase.zookeeper.quorum", zkHost);
conf.set("hbase.master", master);
conf.set("hbase.master.kerberos.principal","hbase/_HOST@TEST.COM");
conf.set("hbase.regionserver.kerberos.principal","hbase/_HOST@TEST.COM");
conf.set("hbase.security.authentication","kerberos");
conf.addResource("/usr/hbase/hbase-site.xml");
String principal = System.getProperty("kerberosPrincipal", "hbase@TEST.COM");
String keytabLocation = System.getProperty("kerberosKeytab",keyberos);
UserGroupInformation.setConfiguration(conf);
UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI(principal, keytabLocation);
ugi.reloginFromKeytab();
conn = ConnectionFactory.createConnection(conf);
问题现象:开启认证后服务器能正常启动,也不报错。但是在查询中就出现以下错误信息:
DEBUG ResultBoundedCompletionService:226 - Replica 0 returns java.net.SocketTimeoutException: callTimeout=60000,
callDuration=72022: Call to bdp02/10.127.60.2:60020 failed on local exception: javax.security.sasl.SaslException:
Failure to initialize security context [Caused by GSSException: Invalid name provided (Mechanism level: KrbException:
Cannot locate default realm)] row 'hbase_person_ecif,6610fc0ad0d6745f39310624bfe761ad,99999999999999' on
table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=bdp02,60020,1542464877235, seqNum=0
DEBUG ConnectionImplementation:911 - locateRegionInMeta parentTable=hbase:meta, metaLocation=, attempt=0 of 36 failed;
retrying after sleep of 100 because: Failed after attempts=36, exceptions:
Sat Nov 17 22:53:32 CST 2018, null, java.net.SocketTimeoutException: callTimeout=60000, callDuration=72022: Call to
bdp02/10.127.60.2:60020 failed on local exception: javax.security.sasl.SaslException: Failure to initialize security
context [Caused by GSSException: Invalid name provided (Mechanism level: KrbException: Cannot locate default
realm)] row 'hbase_person_ecif,6610fc0ad0d6745f39310624bfe761ad,99999999999999' on table 'hbase:meta' at
region=hbase:meta,,1.1588230740, hostname=bdp02,60020,1542464877235, seqNum=0
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从错误信息来看,问题出在Kerberos认证过程中无法初始化安全上下文(SaslException: Failure to initialize security context),具体原因为找不到默认的realm(GSSException: Invalid name provided (Mechanism level: KrbException: Cannot locate default realm))。这通常意味着你的Kerberos配置中缺少了对默认realm的正确指定或者Kerberos环境没有被正确设置。
请检查以下几个方面:
确保krb5.conf
文件配置正确:这个文件定义了Kerberos的域(realm)信息、KDC服务器地址等关键参数。你需要确认该文件中包含了正确的default realm,并且与你的principal中的realm相匹配。同时,确保Hadoop和HBase能够访问到这个配置文件。如果不在标准路径下,可能需要通过系统属性或环境变量指定其位置。
环境变量和系统属性:确认环境变量KRB5_CONFIG
指向了正确的krb5.conf
文件路径。此外,你已经在代码中设置了hbase.master.kerberos.principal
和hbase.regionserver.kerberos.principal
,但也要确保这些principal名称完全符合Kerberos数据库中的条目,包括正确的主机名和realm。
Keytab文件:确保你使用的keytab文件是正确的,且包含有对应principal的密钥。同时,keytab文件的权限应该设置得足够安全(例如,只允许属主读取)。
Java环境的Kerberos配置:有时候,即使系统级别的Kerberos配置正确,Java应用可能还是不能正确加载这些配置。你可以尝试在启动Java应用时显式地指定Kerberos相关的系统属性,比如 -Djava.security.krb5.conf=/path/to/krb5.conf
。
网络和防火墙:虽然错误主要集中在Kerberos认证上,但是网络问题也可能导致连接失败。确保没有防火墙规则阻止了客户端到HBase服务的通信。
时间同步:Kerberos对时间敏感,确保所有涉及的服务器(包括客户端)的时间同步准确,最好使用NTP服务进行时间同步。
综上所述,首先应重点检查Kerberos的配置是否完整且正确,特别是realm的定义以及keytab文件的有效性。如果以上步骤都确认无误,那么可能需要查看更详细的日志或者考虑是否有其他安全策略(如SELinux)影响了操作。
你好,我是AI助理
可以解答问题、推荐解决方案等