HBase的ACL说明

HBase版本:1.1.2

前言

该文只是对Kerberos应用部分中HBase使用的一个补充,主要介绍了HBase ACL的使用。

一、HBase ACL

HBase ACL的全称为HBase Access Control List,它可以实现对各UserGroupNamespaceTableColumn FamilyColumn Qualifier层级的数据权限控制。

我们可以使用grant命令对上述层级进行授权。

二、启用HBase自身权限控制

HBase在不开启授权的情况下,任何账号对HBase集群可以进行任何操作,比如disable tabledrop table等等。

HBase的安全模块包括两个部分,一个是Enable Authentication,一个是Enabled Authorization。前者是在开启Kerberize集群(Kerberos)的时候会用到(感兴趣的可以点击前往查看);后者在开启HBase自身权限控制的时候会用到。今天主要说一下后者的使用,如图所示:

Ambari HBase配置

将值修改为Native,我们注意到hbase-site会有三个配置提示被修改,点击确定并重启HBase服务:

hbase-site.xml文件会被修改:

<property>
    <name>hbase.security.authorization</name>
    <value>true</value>
</property>
<property>
    <name>hbase.coprocessor.master.classes</name>
    <value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
    <name>hbase.coprocessor.region.classes</name>
 <value>org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint</value>
</property>
<property>
  	<name>hbase.coprocessor.regionserver.classes</name>
  	<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>

如果没有使用Ambari统一管理服务的话,可以修改/usr/hdp/2.6.4.0-91/hbase/conf/hbase-site.xml文件,然后重启HBase服务。

按照上述操作,HBase ACL开启成功。

三、HBase ACL权限控制说明

HBase访问级别是相互独立授予的,并允许在给定范围内进行不同类型的操作。

1. 操作级别说明
操作级别说明
Read ( R )读取某个Scope资源的数据
Write ( W )在某个Scope的资源内写入数据
Execute ( X )在某个Scope执行协处理器
Create ( C )在某个Scope创建/删除表等操作
Admin ( A )在某个Scope进行集群相关操作,例如在给定的范围内平衡集群或分配区域。该权限可对命名空间进行操作
2. 某个范围(Scope)的说明
范围说明
Superuser超级账号可以进行任何操作,运行HBase服务的账号默认是hbase。也可以通过在hbase-site.xml中配置hbase.superuser的值可以添加超级账号
GlobalGlobal Scope拥有集群所有table的Admin权限
Namespace在Namespace Scope进行相关权限控制
Table在Table Scope进行相关权限控制
Column Family在Column Family Scope进行相关权限控制
Column Qualifier在Column Qualifier Scope进行相关权限控制
3. 实体说明
实体说明
User对某个用户授权
GROUP对某个用户组授权

四、设置权限

授权就是将对 [某个范围的资源] 的 [操作权限] 授予[某个实体]

设置hbase权限的命令格式:

grant <user> <permissions> [<@namespace> [<table> [<column family> [<column qualifier>]]]

这里我们新建一个test用户,来为test用户设置一下权限。

新建Linux用户:useradd test

[root@xxxxx ~]# useradd test
[root@xxxxx ~]# id test
uid=1026(test) gid=1026(test) groups=1026(test)

查看进入hbase shell的当前用户:

hbase(main):001:0> whoami
test (auth:SIMPLE)
    groups: test

另外新建一个shell客户端,切换到HBase的超级用户下,默认为hbase

1. 创建、查看、删除namespace权限

使用超级用户赋予test用户创建、查看、删除namespace的权限

# Global范围的授权
grant 'test','A'

使用test用户创建、查看、删除namespace

# 创建、查看、删除namespace
list_namespace
create_namespace 'test_ns'
drop_namespace 'test_ns'

2. 查看权限(用户拥有ADMIN级别的权限才可使用该命令)
user_permission '.*'

3. 创建/删除表

使用超级用户赋予test用户在test_ns内创建/删除表的权限。

# Namespace范围的授权
# 赋予test用户在test_ns命名空间内有创建/删除表的权限
grant 'test','AC','@test_ns'  #命名空间前要加@符号

查看权限:

user_permission '@.*'

使用test用户创建/删除表:

# 创建表
create 'test_ns:hbase_1102',  {NAME=>'cf1'}, {NAME=>'cf2'}
# drop(删除)表之前,需要先disable表
disable 'test_ns:hbase_1102'
drop 'test_ns:hbase_1102'

这时候的test_ns:hbase_1102表的权限为:

4. 为test用户设置表权限

首先为了演示权限的控制,给test_ns:hbase_1102表创造一些数据:

插入数据

hbase(main):048:0> put 'test_ns:hbase_1102', '001','cf1:name','Tom'
0 row(s) in 0.0170 seconds

hbase(main):049:0> put 'test_ns:hbase_1102', '001','cf1:gender','man'
0 row(s) in 0.0170 seconds

hbase(main):050:0> put 'test_ns:hbase_1102', '001','cf2:chinese','90'
0 row(s) in 0.0120 seconds

hbase(main):051:0> put 'test_ns:hbase_1102', '001','cf2:math','91'
0 row(s) in 0.0080 seconds

读取数据

scan 'test_ns:hbase_1102'

1. 只读列族权限

使用超级用户为test用户设置test_ns:hbase_1102表的cf1的只读权限

# Column Family范围的授权
grant 'test','R','test_ns:hbase_1102','cf1'

这样我们的效果预期是使用scan 'test_ns:hbase_1102’的时候,仅显示列族cf1的相关信息,但是是这样的吗?请继续往下看:

# 查看test_ns:hbase_1102的权限
user_permission 'test_ns:hbase_1102'

很明显,test_ns:hbase_1102表有两条关于test用户的权限说明,它的权限层级不同的时候是不会被影响的。假如我们要设置为只读cf1这个列族信息的话,需要将第一条相关test的权限进行回收:

# revoke命令格式
revoke <user> [<@namespace> [<table> [<column family> [<column qualifier>]]]]

使用HBase超级用户执行:

# revoke回收权限
revoke 'test','test_ns:hbase_1102'
# 再次查看表权限
user_permission 'test_ns:hbase_1102'

这样的话,就做到了控制test用户只读列族cf1的信息了,使用test用户执行:

scan 'test_ns:hbase_1102'

2. 只读列族中某列权限

使用HBase超级用户执行:

revoke 'test','test_ns:hbase_1102','cf1'
# Column Qualifier范围的授权
grant 'test','R','test_ns:hbase_1102','cf1','name'

使用test用户执行:

scan 'test_ns:hbase_1102'

符合预期设想。

五、总结

HBase ACL的开启还是很有必要的,它能细粒化地控制用户对HBase数据的操作。根据HBase ACL的实战演练,需要注意HBase ACL的范围(Scope)权限是互不干扰的,如果需要达到预期的权限,建议多使用user_permission命令查看权限。如果权限没有达到预期,建议再revoke一下。

本文主要讲解了HBase ACL的说明使用:

  • ACL权限控制说明
  • 使用grant命令
  • 使用revoke命令
  • 如何查看某表的权限

HBase ACL相对来说比较简单,但也呼吁大家动手实践一下~


如果您觉得文章写得不错,请扫码关注公众号支持作者~您的关注是我写作的最大动力?

关注大数据实战演练

HBase是一个分布式的、面向列的NoSQL数据库,其表的结构与关系型数据库不同。HBase表的建表语句可以通过HBase Shell或HBase API来执行。 下面是一个示例的HBase建表语句: ```shell create 'mytable', 'cf1', 'cf2' ``` 上述语句创建了名为"mytable"的表,并且指定了两个列族"cf1"和"cf2"。列族是表中列的集合,可以理解为逻辑上的分组。 在HBase中,列是没有预定义的模式的,因此可以根据需要动态添加列。对于每个列,可以存储多个版本的数据。 可以通过以下语句修改表的配置: ```shell alter 'mytable', NAME => 'cf1', VERSIONS => 3 ``` 上述语句将列族"cf1"的版本数设置为3。 另外,还可以通过HBase API来创建表。以下是一个Java API的示例: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; public class CreateTableExample { public static void main(String[] args) throws Exception { Configuration conf = HBaseConfiguration.create(); try (Connection connection = ConnectionFactory.createConnection(conf); Admin admin = connection.getAdmin()) { TableName tableName = TableName.valueOf("mytable"); HTableDescriptor tableDescriptor = new HTableDescriptor(tableName); HColumnDescriptor columnDescriptor1 = new HColumnDescriptor("cf1"); HColumnDescriptor columnDescriptor2 = new HColumnDescriptor("cf2"); tableDescriptor.addFamily(columnDescriptor1); tableDescriptor.addFamily(columnDescriptor2); admin.createTable(tableDescriptor); } } } ``` 上述代码使用HBase的Java API创建了名为"mytable"的表,并添加了两个列族"cf1"和"cf2"。 需要注意的是,上述示例只是简单的表结构创建示例,实际使用时,还需根据具体需求进行适当调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

create17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值