Kerberos安全认证-连载11-HBase Kerberos安全配置及访问_kerberos 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进行访问:

​​​​​​​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
TABLE

ERROR: 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 shell

hbase(main):001:0> create ‘person’,‘cf1’,‘cf2’
Created table person

hbase(main):002:0> list
person

hbase(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(“===========================”);

//查询表中的数据
scanTableData(“tbl1”);
System.out.println(“===========================”);

//删除表
deleteHBaseTable(“tbl1”);

//查看Hbase中所有表
listHBaseTables();
System.out.println(“===========================”);
}catch (Exception e) {
e.printStackTrace();
}finally {
if(admin != null) {
admin.close();
}
if(connection != null) {
connection.close();
}
}

}

//判断表是否存在
private static boolean isTableExist(String tableName) {
try {
return admin.tableExists(TableName.valueOf(tableName));
} catch (IOException e) {
e.printStackTrace();
}
return false;
}

private static void createHBaseTable(String tableName, String… cfs) {
if(isTableExist(tableName)) {
System.out.println(“表已经存在!”);
return;
}
if(cfs == null || cfs.length == 0){
System.out.println(“列族不能为空!”);
return;
}
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName));
List cFDBList = new ArrayList<>();
for (String cf : cfs) {
cFDBList.add(ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(cf)).build());
}
tableDescriptorBuilder.setColumnFamilies(cFDBList);
try {
admin.createTable(tableDescriptorBuilder.build());
System.out.println(“创建表” + tableName + “成功!”);
} catch (IOException e) {
System.out.println(“创建失败!”);
e.printStackTrace();
}

}

//查看Hbase中所有表
private static void listHBaseTables() {
try {
TableName[] tableNames = admin.listTableNames();
System.out.println(“打印所有命名空间表名:”);
for (TableName tableName : tableNames) {
System.out.println(tableName);
}
} catch (IOException e) {
e.printStackTrace();
}

}

//向表中插入数据
private static void putTableData(String tableName, String rowKey, String cf, String column, String value) {
Table table = null;
try {
table = connection.getTable(TableName.valueOf(tableName));
Put p = new Put(Bytes.toBytes(rowKey));
p.addColumn(Bytes.toBytes(cf), Bytes.toBytes(column), Bytes.toBytes(value));
table.put§;
System.out.println(“插入数据成功!”);
} catch (IOException e) {
e.printStackTrace();
} finally {
closeTable(table);
}

}

//查询表中的数据
private static void scanTableData(String tableName) {
if(tableName == null || tableName.length() == 0) {
System.out.println(“请正确输入表名!”);
return;
}
Table table = null;
try {
table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();

ResultScanner resultScanner = table.getScanner(scan);
Iterator iterator = resultScanner.iterator();
while(iterator.hasNext()) {
Result result = iterator.next();
Cell[] cells = result.rawCells();
for(Cell cell : cells) {
//得到rowkey
System.out.println("rowkey: " + Bytes.toString(CellUtil.cloneRow(cell)));
//得到列族
System.out.println("列族: " + Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("列: " + Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println("值: " + Bytes.toString(CellUtil.cloneValue(cell)));
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
closeTable(table);
}
}

//查询指定row数据
private static void getRowData(String tableName, String rowkey,String colFamily, String col) {
Table table = null;
try {
table = connection.getTable(TableName.valueOf(tableName));
Get g = new Get(Bytes.toBytes(rowkey));
// 获取指定列族数据
if(col == null && colFamily != null) {
g.addFamily(Bytes.toBytes(colFamily));
} else if(col != null && colFamily != null) {
// 获取指定列数据
g.addColumn(Bytes.toBytes(colFamily), Bytes.toBytes(col));
}
Result result = table.get(g);
System.out.println(“查询指定rowkey 数据如下”);

for(Cell cell : result.rawCells()) {
//得到rowkey
System.out.println("rowkey: " + Bytes.toString(CellUtil.cloneRow(cell)));
//得到列族
System.out.println("列族: " + Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("列: " + Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println("值: " + Bytes.toString(CellUtil.cloneValue(cell)));
}

} catch (IOException e) {
e.printStackTrace();
} finally {
closeTable(table);
}

}

//删除指定row数据
private static void deleteRowData(String tableName , String rowKey, String colFamily, String … cols) {
if(tableName == null || tableName.length() == 0) {
System.out.println(“请正确输入表名!”);
return;
}
Table table = null;
try {
table = connection.getTable(TableName.valueOf(tableName));
Delete del = new Delete(Bytes.toBytes(rowKey));
// 删除指定列族
del.addFamily(Bytes.toBytes(colFamily));
// 删除指定列
for (String col : cols) {
del.addColumn(Bytes.toBytes(colFamily), Bytes.toBytes(col));
}
table.delete(del);
System.out.println(“删除数据成功!”);
} catch (IOException e) {
e.printStackTrace();
} finally {
closeTable(table);
}

}

//删除表
private static void deleteHBaseTable(String tableName) {
try {
if(!isTableExist(tableName)) {
System.out.println(“要删除的表不存在!”);
return;
}
admin.disableTable(TableName.valueOf(tableName));
admin.deleteTable(TableName.valueOf(tableName));

} catch (IOException e) {
e.printStackTrace();
}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网络安全面试题

绿盟护网行动

还有大家最喜欢的黑客技术

网络安全源码合集+工具包

所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

nvert/5912337446dee53639406fead3d3f03c.jpeg)

网络安全源码合集+工具包

所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-b40X0SIj-1712503491709)]

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值