简介

HBase ACL的全称为HBase Access Control List,它可以实现对各User、Group、Namespace、Table、Column Family、Column Qualifier层级的数据权限控制。可以使用grant命令对上述层级进行授权。

启用HBase ACL

HBase在不开启授权的情况下,任何账号对HBase集群可以进行任何操作,比如disable table、drop table等等。HBase的安全模块包括两个部分,一个是Enable Authentication,一个是Enabled Authorization。前者是在开启Kerberize集群(Kerberos)的时候会用到;后者在开启HBase自身权限控制的时候会用到。
修改HBase配置(hbase-site.xml):

  1. export HBASE_HOME=/home/bigdata/modules/hbase-1.2.5
  2. vi ${HBASE_HOME}/conf/hbase-site.xml

内容如下:

  1. <property>
  2. <name>hbase.security.authorization</name>
  3. <value>true</value>
  4. </property>
  5. <property>
  6. <name>hbase.coprocessor.master.classes</name>
  7. <value>org.apache.hadoop.hbase.security.access.AccessController</value>
  8. </property>
  9. <property>
  10. <name>hbase.coprocessor.region.classes</name>
  11. <value>org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint</value>
  12. </property>
  13. <property>
  14. <name>hbase.coprocessor.regionserver.classes</name>
  15. <value>org.apache.hadoop.hbase.security.access.AccessController</value>
  16. </property>

重启HBase服务:

  1. export HBASE_HOME=/home/bigdata/modules/hbase-1.2.5
  2. ${HBASE_HOME}/bin/stop-hbase.sh
  3. ${HBASE_HOME}/bin/start-hbase.sh

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 [<@namespace> [

[ []]]
如下将以一个案例的形式说明设置权限的过程。

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

使用HBase ADMIN用户(默认:安装用户)赋予root用户创建、查看、删除namespace的权限。

  1. # Global范围的授权
  2. hbase(main)> grant 'root','A'

使用root用户创建、查看、删除namespace。

  1. # 创建、查看、删除namespace
  2. hbase(main)> list_namespace
  3. hbase(main)> create_namespace 'test_ns'
  4. hbase(main)> drop_namespace 'test_ns'

2. 查看权限

  1. # 用户拥有ADMIN级别的权限才可使用该命令
  2. hbase(main)> user_permission '.*'

3. 创建/删除表

使用HBase ADMIN用户(默认:安装用户)赋予root用户在test_ns内创建/删除表的权限。

  1. # Namespace范围的授权
  2. # 赋予test用户在test_ns命名空间内有创建/删除表的权限(命名空间前要加@符号)
  3. hbase(main)> grant 'root','AC','@test_ns'

查看权限:

  1. hbase(main)> user_permission '@.*'

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

  1. # 创建表
  2. hbase(main)> create 'test_ns:hbase_grant-test', {NAME=>'cf1'}, {NAME=>'cf2'}
  3. # 查看创建表的权限
  4. hbase(main)> user_permission 'test_ns:hbase_grant-test'
  5. # drop(删除)表之前,需要先disable表
  6. hbase(main)> disable 'test_ns:hbase_grant-test'
  7. hbase(main)> drop 'test_ns:hbase_grant-test'

4. 设置表权限

首先为了演示权限的控制,给上述root用户创建的表创造一些数据:

  1. hbase(main)> put 'test_ns:hbase_grant-test', '001','cf1:name','Tom'
  2. hbase(main)> put 'test_ns:hbase_grant-test', '001','cf1:gender','man'
  3. hbase(main)> put 'test_ns:hbase_grant-test', '001','cf2:chinese','90'
  4. hbase(main)> put 'test_ns:hbase_grant-test', '001','cf2:math','91'
  5. hbase(main)> scan 'test_ns:hbase_grant-test'

1. 设置只读列族权限

使用HBase ADMIN用户(默认:安装用户)执行:

  1. # Column Family范围的授权
  2. # 设置表“test_ns:hbase_grant-test”的cf1的只读权限
  3. hbase(main)> grant 'root','R','test_ns:hbase_grant-test','cf1'

查看权限:

  1. hbase(main)> user_permission 'test_ns:hbase_grant-test'

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

  1. # revoke命令格式 revoke <user> [<@namespace> [<table> [<column family> [<column qualifier>]]]]
  2. # 回收权限
  3. hbase(main)> revoke 'root','test_ns:hbase_grant-test'

再次查看用户权限,只有一条了,这样的话,就做到了控制root用户只读列族“cf1”的信息了,使用root用户执行:

  1. hbase(main)> scan 'test_ns:hbase_grant-test'

此时,只有“cf1”可以读取,符合预期设想。

2. 设置只读列族中某列权限

使用HBase ADMIN用户(默认:安装用户)执行:

  1. hbase(main)> revoke 'root','test_ns:hbase_grant-test','cf1'
  2. # Column Qualifier范围的授权
  3. hbase(main)> grant 'root','R','test_ns:hbase_grant-test','cf1','name'

查看权限:

  1. hbase(main)> user_permission 'test_ns:hbase_grant-test'

使用test用户执行:

  1. hbase(main)> scan 'test_ns:hbase_grant-test'

此时,只有“cf1:name”可以读取,符合预期设想。

总结

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

参考

CSDN:HBase的ACL说明
https://blog.csdn.net/CREATE_17/article/details/87567609