<property> <name>hbase.security.authorization</name> <value>true</value> </property> <property> <name>hfile.format.version</name> <value>3</value> </property> <property> <name>hbase.coprocessor.region.classes</name> <value>org.apache.hadoop.hbase.security.access.AccessController</value> </property> <property> <name>hbase.security.access.early_out</name> <value>false</value> </property>
复制
简介
Hyperbase 同样支持更细粒度的,单元格级别的访问控制,其访问方式有两种:
-
单元格级别权限控制标签 CACL(Cell-Level ACL)
单元格级 CACL 意味着当数据存入 Hyperbase 时,可以对独立的单元格赋予明确的‘RW’权限。
-
单元格可见性标签(Cell Visibility Label)
可见性标签允许管理员把对单元格的安全访问与可见性标签相关联。
下面将解释说明单元格级权限控制标签 CACL。
配置
Hyperbase AccessController 用于启动并执行单元格级权限控制标签 CACL,这需要在启动 Hyperbase 前重新配置 hbase-site.xml 中的属性,如下:
上述配置中需要注意的参数有:
-
Kerberos 需要在一个安全的集群中进行认证。
-
Hyperbase 的版本为 1,那么 hfile.format.version 的默认值为 3。
-
为启动单元格级权限控制标签 CACL,需要将 hbase-site.xml 文件中的 hbase.security.access.early_out 设为 false 。
在 Hbase 版本1中,访问控制早期评估策略是默认启用的,如果一个用户没有被授权可以访问表,或者列族,甚至单个列,那么一个 AccessDeniedException 就会被抛出,这说明该用户没有访问单元格的授权。但是如果用户享有更高级别的授权,那么自然享有对数据的访问权。
上述的配置没有完全列出 Hyperbase 认证所需的全部条件。
API 访问及 Shell 命令
利用 Java API : Mutation.setACL 可以从单元格级别进行授权:
-
Mutation.setACL(String user, Permission perms)
-
Mutation.setACL(Map<String, Permission> perms)
示例:把对一个指定的写入(Put)操作涉及到的所有单元格的 Read 权限授予 user1
put.setACL(“user1”, new Permission(Permission.Action.READ))
复制
示例:也可以加入组名,需要加上前缀 @
put.setACL(“@users”, new Permission(Permission.Action.READ))
复制
所有的单元格级权限控制标签(CACL)都是以标签(Tags)的形式存储在单元格中的。
在 Hbase Shell 中,Grant 命令可以用来授予单元格级权限 CACL,它的作用是对现有单元格级权限控制标签 CACL 进行重写,并且存储在它们的精确维度中。大多数情况下,这只用作测试。一般情况下,单元格级权限 CACL 是在单元格被存入 Hyperbase 时就写定的。
示例说明
示例一:
-
作为 Hbase 用户:
hbase(main):006:0> create ‘table1′, ‘family1′ 0 row(s) in 0.5890 seconds
复制hbase(main):008:0> put ‘table1′, ‘row1′, ‘family1:c1′, ‘value1′ 0 row(s) in 0.1630 seconds
复制hbase(main):009:0> put ‘table1′, ‘row2′, ‘family1:c1′, ‘value2′ 0 row(s) in 0.0050 seconds
复制hbase(main):010:0> put ‘table1′, ‘row3′, ‘family1:c1′, ‘value3′ 0 row(s) in 0.0040 seconds
复制hbase(main):011:0> scan ‘table1′ ROW COLUMN+CELL row1 column=family1:c1, timestamp=1445145631200, value=value1 row2 column=family1:c1, timestamp=1445145641859, value=value2 row3 column=family1:c1, timestamp=1445145648967, value=value3 3 row(s) in 0.0890 seconds
复制 -
作为 user1 用户:
hbase(main):012:0> scan ‘table1′ ROW COLUMN+CELL 0 row(s) in 0.0170 seconds
复制原因是用户 user1 没有访问单元格的权限,更不用说更高的表级,列族级,列级的访问权限。 下面,可通过 Grant 命令授予访问单元格的权限。
-
作为 hbase 用户:
hbase(main):014:0> grant ‘table1′, {‘user1′ => ‘RW’}, {FILTER => “(PrefixFilter (‘row1‘))”} 1 row(s) in 0.1120 seconds
复制命令的作用是扫描后找出所有符合条件(以 row1 开头的行)的单元格,并重写所有找到的单元格的 ACL,给用户 user1 授权。
-
作为 user1 用户:
hbase(main):015:0> scan ‘table1′ ROW COLUMN+CELL row1 column=family1:c1, timestamp=1413310193155, value=value1 1 row(s) in 0.0370 seconds
复制此时,用户 user1 已拥有对所有以 row1 开头的单元格的 RW 权限。
-
作为 Hbase 用户:
hbase(main):017:0> grant ‘table1′, {‘user1′ => ‘RW’}, {FILTER => “(PrefixFilter (‘row‘))”} 3 row(s) in 0.0380 seconds
复制该命令重写了所有以 Row 开头的行的 ACL。
-
作为 user1 用户:
hbase(main):019:0> scan ‘table1′ ROW COLUMN+CELL row1 column=family1:c1, timestamp=1413310193155, value=value1 row2 column=family1:c1, timestamp=1413310200666, value=value2 row3 column=family1:c1, timestamp=1413310208109, value=value3 3 row(s) in 0.0380 seconds
复制此时,用户 user1 已拥有对所有以 Row 开头的单元格的 RW 权限。
示例二:
-
作为 user2 用户:
hbase(main):001:0> scan ‘table1′ ROW COLUMN+CELL 0 row(s) in 0.0170 seconds
复制原因是用户 user2 没有对单元格维度的 R 权限。
-
作为 Hbase 用户:
hbase(main):003:0> grant ‘table1′, {‘@users’ => ‘RW’}, {FILTER => “(PrefixFilter (‘row’))”} 3 row(s) in 4.8260 seconds
复制上述 shell 命令是将对单元格的 RW 权限授予组 users ,而用户 user2 在这个组里。
-
作为 user2 用户:
hbase(main):004:0> scan ‘table1′ ROW COLUMN+CELL row1 column=family1:c1, timestamp=1445569240789, value=value1 row2 column=family1:c1, timestamp=1445279966552, value=value2 row3 column=family1:c1, timestamp=1445279973521, value=value3 3 row(s) in 1.3110 seconds
复制由结果可见,此时,用户 user2 已拥有单元格级的 RW 权限。
综上,Hyperbase 单元格级权限控制标签 CACL 是一个可以提供细粒度的访问 Hyperbase 中数据的强大的安全功能。