一.文档编写目的
出于CDH集群安全考虑,在CDH集群中增加了Kerberos认证机制。因为HBase的存储系统是基于Hadoop的存储,所以通过HBase客户端访问HBase数据库时需要进行身份认证。在Linux下使用HBase客户端访问HBase数据时需要先kinit初始化Kerberos账号,认证完成后我们就可以直接使用HBase shell操作HBase了。通过Linux的Kinit命令可以方便的完成Kerberos的认证,那么在Java开发中如何完成Kerberos的登录认证呢?本篇文章主要讲述如何使用Java连接Kerberos环境的HBase。
内容概述
1.环境准备
2.创建Java Maven工程
3.编写HBase测试代码
4.测试
5.总结
测试环境
1.RedHat7.2
2.CM和CDH版本为5.11.2
前置条件
1.Intellij已安装且正常运行
2.Maven环境正常二.环境准备
1.从CDH集群下载HBase客户端配置
2.krb5.conf配置(直接使用CDH集群的Kerberos配置)
#Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server=FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime= 24h
renew_lifetime= 7d
forwardable= true
rdns = false
default_realm=CLOUDERA.COM
#default_ccache_name =KEYRING:persistent:%{uid}
[realms]
CLOUDERA.COM = {
kdc =ip-172-31-22-86.ap-southeast-1.compute.internal
admin_server=ip-172-31-22-86.ap-southeast-1.compute.internal
}
[domain_realm]
ip-172-31-22-86.ap-southeast-1.compute.internal=CLOUDERA.COM
ip-172-31-22-86.ap-southeast-1.compute.internal=CLOUDERA.COM
/**
3.获取Kerberos的keytab文件
使用kadmin为Kerberos账号生成keytab,fayson.keytab文件生成在当前目录下。
[ec2-user@ip-172-31-22-86 ~]$ sudo kadmin.local
Authenticating as principal hdfs/admin@CLOUDERA.COM with password.
kadmin.local: xst -norandkey -k fayson.keytab fayson@CLOUDERA.COM
...
kadmin.local: exit
/**
4.在当前开发环境下配置集群的主机信息到hosts文件
Windows在C:WindowsSystem32driversetchosts文件中添加
5.为fayson用户授权HBase库的访问权限
在命令行使用kinit初始化hbase的Kerberos账号
[root@ip-172-31-26-80 process]# cd 1699-hbase-REGIONSERVER
[root@ip-172-31-26-80 1699-hbase-REGIONSERVER]# pwd
/var/run/cloudera-scm-agent/process/1699-hbase-REGIONSERVER
[root@ip-172-31-26-80 1699-hbase-REGIONSERVER]# kinit -kt hbase.keytab hbase/ip-172-31-26-80.ap-southeast-1.compute.internal@CLOUDERA.COM
[root@ip-172-31-26-80 1699-hbase-REGIONSERVER]# klist
Ticket cache:FILE:/tmp/krb5cc_0
Default principal:hbase/ip-172-31-26-80.ap-southeast-1.compute.internal@CLOUDERA.COM
Valid starting Expires Service principal
10/25/2017 11:13:21 10/26/2017 11:13:21 krbtgt/CLOUDERA.COM@CLOUDERA.COM
renew until 10/30/2017 11:13:21
/**
使用hbase shell登录客户端对fayson用户赋权
[root@ip-172-31-26-80 1699-hbase-REGIONSERVER]# hbase shell
17/10/25 11:16:01 INFO Configuration.deprecation: hadoop.native.lib isdeprecated. Instead, use io.native.lib.available
HBase Shell; enter'help<RETURN>'for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.0-cdh5.11.2, rUnknown, Fri Aug 18 14:09:37 PDT 2017
hbase(main):001:0>grant 'fayson', 'RWC'
0 row(s) in 0.4110 seconds
/**
三.创建Java工程
1.使用Intellij创建Java Maven工程
2.在工程下创建kerberos-conf目录,将下载的客户端配置文件拷贝至此目录
点击右键将Kerberos-conf目录标记为Sources Root
注意目录颜色变化
3.在pom.xml配置文件中增加HBase的Maven依赖
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.0</version>
</dependency>
/**
四、编写HBase测试代码
1.HBaseSample.java类调用API接口访问HBase示例代码
package com.cloudera;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.security.UserGroupInformation;
import java.io.IOException;
/**
* Java访问Kerberos环境的HBase数据库
* @Date 2107-10-25 22:22:58
*/
publicclass App {
public static void main( String[] args ) {
System.setProperty("java.security.krb5.conf", "c:\\keytab\krb5.conf");
Configuration configuration = HBaseConfiguration.create();
System.out.println(configuration.get("hbase.rootdir"));
configuration.set("hadoop.security.authentication", "Kerberos" );
UserGroupInformation. setConfiguration(configuration);
try {
UserGroupInformation.loginUserFromKeytab("fayson@CLOUDERA.COM", "c:\\keytab\fayson.keytab");
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf("picHbase"));
System.out.println(table.getName());
Scan scan = new Scan();
ResultScanner rs = table.getScanner(scan);
for (Result r : rs) {
System. out.println(r.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
/**
五、测试
1.运行代码测试
2.测试结果
六、总结
在开发环境下通过Java代码直接连接到Kerberos环境下的HBase时,则需要将krb5.conf配置加载到程序运行环境中。
在使用Kerberos账号进登录行认证时,如果使用的是普通账号(fayson),则需要为fayson账号授权,否则fayson用户无权限访问HBase库的表。
参考文档:
文章来源:HBase技术社区公众号(微信号:hbasegroup),非常欢迎大家积极投稿。