特别说明:该专栏文章均来源自微信公众号《大数据实战演练》,欢迎关注!
HBase版本:1.1.2 前言
该文只是对Kerberos应用部分中HBase使用的一个补充,主要介绍了HBase ACL的使用。
一、HBase ACL
HBase ACL
的全称为HBase Access Control List
,它可以实现对各User
、Group
、Namespace
、Table
、ColumnFamily
、Column Qualifier
层级的数据权限控制。
我们可以使用grant
命令对上述层级进行授权。
二、启用HBase自身权限控制
HBase
在不开启授权的情况下,任何账号对HBase
集群可以进行任何操作,比如disable table
、drop table
等等。
HBase
的安全模块包括两个部分,一个是Enable Authentication
,一个是Enabled Authorization
。前者是在开启Kerberize
集群(Kerberos
)的时候会用到(感兴趣的可以点击前往查看);后者在开启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的值可以添加超级账号 |
Global | Global 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级别的权限才可使用该命令)
代码语言:javascript复制user_permission '.*'
3. 创建/删除表
使用超级用户赋予test
用户在test_ns
内创建/删除表的权限。
# Namespace范围的授权
# 赋予test用户在test_ns命名空间内有创建/删除表的权限
grant 'test','AC','@test_ns' #命名空间前要加@符号
查看权限:
代码语言:javascript复制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
表创造一些数据:
代码语言:javascript复制插入数据
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
代码语言:javascript复制读取数据
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的相关信息,但是是这样的吗?请继续往下看:
代码语言:javascript复制# 查看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
相对来说比较简单,但也呼吁大家动手实践一下~
长按下方二维码,关注更多精彩内容
如果感觉本文对您有帮助,请点赞或订阅支持一下,您的支持是我坚持写作最大的动力,谢谢!