HBase版本:1.1.2
前言
该文只是对Kerberos应用部分中HBase使用的一个补充,主要介绍了HBase ACL的使用。
一、HBase ACL
HBase ACL的全称为HBase Access Control List,它可以实现对各User、Group、Namespace、Table、Column Family、Column Qualifier层级的数据权限控制。
我们可以使用grant命令对上述层级进行授权。
二、启用HBase自身权限控制
HBase在不开启授权的情况下,任何账号对HBase集群可以进行任何操作,比如disable table、drop table等等。
HBase的安全模块包括两个部分,一个是Enable Authentication,一个是Enabled Authorization。前者是在开启Kerberize集群(Kerberos)的时候会用到(感兴趣的可以点击前往查看);后者在开启HBase自身权限控制的时候会用到。今天主要说一下后者的使用,如图所示:
Ambari HBase配置
将值修改为Native,我们注意到hbase-site会有三个配置提示被修改,点击确定并重启HBase服务:
hbase-site.xml文件会被修改:
hbase.security.authorizationtruehbase.coprocessor.master.classesorg.apache.hadoop.hbase.security.access.AccessControllerhbase.coprocessor.region.classesorg.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpointhbase.coprocessor.regionserver.classesorg.apache.hadoop.hbase.security.access.AccessController
如果没有使用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 [ [
[ []]]
这里我们新建一个test用户,来为test用户设置一下权限。
新建Linux用户:useradd test
[root@xxxxx ~]# useradd test[root@xxxxx ~]# id testuid=1026(test) gid=1026(test) groups=1026(test)
查看进入hbase shell的当前用户:
hbase(main):001:0> whoamitest (auth:SIMPLE) groups: test
另外新建一个shell客户端,切换到HBase的超级用户下,默认为hbase。
1. 创建、查看、删除namespace权限
使用超级用户赋予test用户创建、查看、删除namespace的权限
# Global范围的授权grant 'test','A'
使用test用户创建、查看、删除namespace
# 创建、查看、删除namespacelist_namespacecreate_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 secondshbase(main):049:0> put 'test_ns:hbase_1102', '001','cf1:gender','man'0 row(s) in 0.0170 secondshbase(main):050:0> put 'test_ns:hbase_1102', '001','cf2:chinese','90'0 row(s) in 0.0120 secondshbase(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 [ [
[ []]]]
使用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相对来说比较简单,但也呼吁大家动手实践一下~
--end--