[root@node1 ~]# scp /home/keytabs/hbase.service.keytab node2:/home/keytabs/
 [root@node1 ~]# scp /home/keytabs/hbase.service.keytab node3:/home/keytabs/
 [root@node1 ~]# scp /home/keytabs/hbase.service.keytab node4:/home/keytabs/
 [root@node1 ~]# scp /home/keytabs/hbase.service.keytab node5:/home/keytabs/分发完成后,在集群各个节点上执行如下命令,修改hbase.service.keytab密钥文件所属用户和组信息:
chown root:hadoop /home/keytabs/hbase.service.keytab
 chmod 770 /home/keytabs/hbase.service.keytab

3) 修改hbase-site.xml配置文件

在所有hbase节点中修改HBASE_HOME/conf/hbase-site.xml文件内容,配置支持kerberos,向hbase-site.xml文件中追加如下内容:

hbase.security.authorization true 
 hbase.security.authentication kerberos 
 hbase.master.kerberos.principal hbase/_HOST@EXAMPLE.COM 
 hbase.master.keytab.file /home/keytabs/hbase.service.keytab 
 hbase.regionserver.kerberos.principal hbase/_HOST@EXAMPLE.COM 
 hbase.regionserver.keytab.file /home/keytabs/hbase.service.keytab 
这里可以先在node3节点进行配置,配置完成后分发到node4、node5节点:
[root@node3 ~]# scp /software/hbase-2.2.6/conf/hbase-site.xml node4:/software/hbase-2.2.6/conf/
 [root@node3 ~]# scp /software/hbase-2.2.6/conf/hbase-site.xml node5:/software/hbase-2.2.6/conf/

4) 准备hdfs-site.xml和core-site.xml文件

HBase底层存储使用HDFS,这里需要将Hadoop中hdfs-site.xml和core-site.xml文件发送到hbase各个节点HBASE_HOME/conf/目录中。在node3~node5各个HBase节点中执行如下命令:

#node3~node5各个节点执行
 cp /software/hadoop-3.3.4/etc/hadoop/hdfs-site.xml /software/hbase-2.2.6/conf/
 cp /software/hadoop-3.3.4/etc/hadoop/core-site.xml /software/hbase-2.2.6/conf/5) 准备zk-jaas.conf文件
HBase中会使用zookeeper管理元数据和选主,这里由于Zookeeper中已经开启了Kerberos认证,所以需要准备zk-jaas.conf文件连接zookeeper时进行认证。在HBase各个节点HBASE_HOME/conf目录下创建zk-jaas.conf文件,写入如下内容,不同的节点设置的principal是对应HBase主机节点。
node3节点HBASE_HOME/conf/zk-jaas.conf文件内容:
Client {
 com.sun.security.auth.module.Krb5LoginModule required
 useKeyTab=true
 keyTab=“/home/keytabs/hbase.service.keytab”
 useTicketCache=false
 principal=“hbase/node3@EXAMPLE.COM”;
 };node4节点HBASE_HOME/conf/zk-jaas.conf文件内容:
Client {
 com.sun.security.auth.module.Krb5LoginModule required
 useKeyTab=true
 keyTab=“/home/keytabs/hbase.service.keytab”
 useTicketCache=false
 principal=“hbase/node4@EXAMPLE.COM”;
 };node5节点HBASE_HOME/conf/zk-jaas.conf文件内容:
Client {
 com.sun.security.auth.module.Krb5LoginModule required
 useKeyTab=true
 keyTab=“/home/keytabs/hbase.service.keytab”
 useTicketCache=false
 principal=“hbase/node5@EXAMPLE.COM”;
 };6) 修改hbase-env.sh配置
在各个hbase节点上配置HBASE_HOME/conf/hbase-env.sh,将HBASE_OPTS选项修改为如下:
#node3~node5各个节点修改hbase-env.sh中的HBASE_OPTS配置
 export HBASE_OPTS=“$HBASE_OPTS -XX:+UseConcMarkSweepGC -Djava.security.auth.login.config=/software/hbase-2.2.6/conf/zk-jaas.conf”7) 修改HBase安装目录权限
在HBase各个节点创建HBASE_HOME/logs目录,如果该目录不存在需要提前创建,存在即可忽略,该目录为HBase日志目录,需要将该目录权限修改为root:hadoop、访问权限为770,否则hbase用户在启动Hbase集群时没有向该目录写日志权限。
#在node3~node5 HBase节点执行命令创建HBASE_HOME/logs
 mkdir -p /software/hbase-2.2.6/logs将各个节点的hbase安装目录权限修改为root:hadoop,logs目录访问权限为770:
#在node3~node5 HBase节点执行命令
 chown -R root:hadoop /software/hbase-2.2.6
 chmod -R 770 /software/hbase-2.2.6/logs3. HBase启动及访问验证
在启动HBase集群之前,需要将Zookeeper和HDFS集群重启,Zookeeper和HDFS启动命令如下:
#停止hadoop集群
 [root@node1 ~]# stop-all.sh#node3~node5节点,重启zookeeper
 [root@node3 ~]# zkServer.sh restart
 [root@node3 ~]# zkServer.sh restart
 [root@node3 ~]# zkServer.sh restart#启动HDFS集群
 [root@node1 ~]# start-all.sh如果没有配置Kerberos认证时HBase之前启动过,在HDFS中将会有/hbase 目录,需要使用hdfs超级管理员用户将该目录的用户和所属组修改成hbase:hadoop。
#在node5节点执行
 [root@node5 ~]# su hdfs
 [hdfs@node5 ~]$ kinit hdfs
 Password for hdfs@EXAMPLE.COM: 123456[hdfs@node5 logs]$ hdfs dfs -ls /
 Found 6 items
 drwxr-xr-x - root supergroup 0 2023-05-23 10:50 /hbase#修改用户和所属组
 [hdfs@node5 logs]$ hadoop dfs -chown -R hbase:hadoop /hbase在HBase主节点node4上执行如下命令启动HBase集群:
#无需切换hbase用户,可以直接在node4节点执行如下命令启动hbase集群
 [root@node4 ~]# sudo -i -u hbase start-hbase.sh注意:以上启动Hbase集群命令中没有切换到hbase用户,sudo为使用超级用户权限执行命令,-i表示交互模式执行命令,-u指定切换的用户。
HBase启动后,可以通过http://node4:16010进行访问:

如何看hbase安全认证_hadoop

4. HBase Shell操作HBase

在node3~node5任意节点登录hbase shell,可以看到如果节点没有进行用户认证,读取HBase数据时没有权限:

#假设在node4登录hbase客户端
 [root@node4 ~]# klist
 klist: No credentials cache found (filename: /tmp/krb5cc_0)[root@node4 ~]# hbase shell
 hbase(main):001:0> list
 TABLEERROR: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
如果想要正常读取HBase中的数据需要进行客户端认证,这里以zhangsan用户为例,进行Kerberos主体认证,认证后操作HBase,操作如下:
#进行用户认证
 [root@node4 ~]# kinit zhangsan
 Password for zhangsan@EXAMPLE.COM: 123456
 [root@node4 ~]# klist
 Ticket cache: FILE:/tmp/krb5cc_0
 Default principal: zhangsan@EXAMPLE.COM#登录hbase shell
 [root@node4 ~]# hbase shellhbase(main):001:0> create ‘person’,‘cf1’,‘cf2’
 Created table personhbase(main):002:0> list
 personhbase(main):003:0> put ‘person’,‘row1’,‘cf1:id’,‘1’
hbase(main):004:0> put ‘person’,‘row1’,‘cf1:name’,‘zs’
hbase(main):005:0> put ‘person’,‘row1’,‘cf1:age’,18
hbase(main):006:0> scan ‘person’
 ROW COLUMN+CELL
 row1 column=cf1:age, timestamp=1684317908851, value=18
 row1 column=cf1:id, timestamp=1684317879179, value=1
 row1 column=cf1:name, timestamp=1684317894358, value=zs

5. Java API操作HBase

java API操作经过Kerberos安全认证的HBase按照如下步骤实现即可。

1) 准备krb5.conf文件

将node1 kerberos服务端/etc/krb5.conf文件存放在IDEA项目中的resources资源目录中或者本地Window固定的某个目录中,用于编写代码时指定访问Kerberos的Realm。

2) 生成用户keytab文件

在kerberos服务端node1节点上,执行如下命令,对zhangsan用户主体生成keytab密钥文件。

#在node1 kerberos服务端执行
[root@node1 ~]# kadmin.local -q “ktadd -norandkey -kt /root/zhangsan.keytab zhangsan@EXAMPLE.COM”

以上命令执行之后,在/root目录下会生成zhangsan.keytab文件,将该文件复制到IDEA项目中的resources资源目录中或者本地window固定的某个目录中,该文件用于编写代码时认证kerberos。

3) 准备访问HDFS需要的资源文件

将HDFS中的core-site.xml 、hdfs-site.xml 、yarn-site.xml、hbase-site.xml文件上传到项目resources资源目录中。

4) 编写代码操作********HBase

项目代码中引入如下maven依赖:


org.apache.hbase hbase-server 2.2.6 org.apache.hbase hbase-client 2.2.6 
编写Java代码操作Kerberos认证的HBase代码如下:
/**
• Java API 操作Kerberos 认证的HBase
 */
 public class OperateAuthHBase {
private static Configuration conf;
 private static Connection connection;
 private static Admin admin;/**
• 初始化:进行kerberos认证并设置hbase configuration
 */
 static {
 try {
 String principal = “zhangsan@EXAMPLE.COM”;
 String keytabPath = “D:\idea_space\KerberosAuth\KerberosAuthHBase\src\main\resources\zhangsan.keytab”;conf = HBaseConfiguration.create();
 // 设置Kerberos 认证
 System.setProperty(“java.security.krb5.conf”, “D:\idea_space\KerberosAuth\KerberosAuthHBase\src\main\resources\krb5.conf”);
 conf.set(“hadoop.security.authentication”, “kerberos”);
 UserGroupInformation.setConfiguration(conf);
 UserGroupInformation.loginUserFromKeytab(principal, keytabPath);//设置zookeeper集群地址及端口号
 conf.set(“hbase.zookeeper.quorum”,“node3,node4,node5”);
 conf.set(“hbase.zookeeper.property.clientPort”,“2181”);//创建连接
 connection = ConnectionFactory.createConnection(conf);
 } catch (IOException e) {
 throw new RuntimeException(e);
 }
 }public static void main(String[] args) throws IOException {
 try{
 //获取Admin对象
 admin = connection.getAdmin();//创建表
 createHBaseTable(“tbl1”, “cf1”);
 System.out.println(“===========================”);//查看Hbase中所有表
 listHBaseTables();
 System.out.println(“===========================”);//向表中插入数据
 putTableData(“tbl1”,“row1”, “cf1”, “id”, “100”);
 putTableData(“tbl1”,“row1”, “cf1”, “name”, “zs”);
 putTableData(“tbl1”,“row1”, “cf1”, “age”, “18”);putTableData(“tbl1”,“row2”, “cf1”, “id”, “200”);
 putTableData(“tbl1”,“row2”, “cf1”, “name”, “ls”);
 putTableData(“tbl1”,“row2”, “cf1”, “age”, “19”);
 System.out.println(“===========================”);//查询表中的数据
 scanTableData(“tbl1”);
 System.out.println(“===========================”);//查询指定row数据
 getRowData(“tbl1”, “row1”,“cf1”,“name”);
 System.out.println(“===========================”);//删除指定row数据
 deleteRowData(“tbl1”, “row1”,“cf1”,“name”);
 System.out.println(“===========================”);//查询表中的数据




如何看hbase安全认证_如何看hbase安全认证_02

如何看hbase安全认证_数据库_03