联 系 我 们
售前咨询
售后咨询
微信关注:星环科技服务号
更多联系方式 >
7.3 单元格级权限控制标签 CACL
更新时间:9/3/2024, 8:27:41 AM

简介

Hyperbase 同样支持更细粒度的,单元格级别的访问控制,其访问方式有两种:

  • 单元格级别权限控制标签 CACL(Cell-Level ACL)

    单元格级 CACL 意味着当数据存入 Hyperbase 时,可以对独立的单元格赋予明确的‘RW’权限。

  • 单元格可见性标签(Cell Visibility Label)

    可见性标签允许管理员把对单元格的安全访问与可见性标签相关联。

下面将解释说明单元格级权限控制标签 CACL。

配置

Hyperbase AccessController 用于启动并执行单元格级权限控制标签 CACL,这需要在启动 Hyperbase 前重新配置 hbase-site.xml 中的属性,如下:

<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>
复制

上述配置中需要注意的参数有:

  • 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 时就写定的。

示例说明

示例一:

  1. 作为 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
    复制
  2. 作为 user1 用户:

    hbase(main):012:0> scan ‘table1′
    ROW COLUMN+CELL
    0 row(s) in 0.0170 seconds
    复制

    原因是用户 user1 没有访问单元格的权限,更不用说更高的表级,列族级,列级的访问权限。 下面,可通过 Grant 命令授予访问单元格的权限。

  3. 作为 hbase 用户:

    hbase(main):014:0> grant ‘table1′, {‘user1′ => ‘RW’}, {FILTER => “(PrefixFilter (‘row1‘))”}
    1 row(s) in 0.1120 seconds
    复制

    命令的作用是扫描后找出所有符合条件(以 row1 开头的行)的单元格,并重写所有找到的单元格的 ACL,给用户 user1 授权。

  4. 作为 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 权限。

  5. 作为 Hbase 用户:

    hbase(main):017:0> grant ‘table1′, {‘user1′ => ‘RW’}, {FILTER => “(PrefixFilter (‘row‘))”}
    3 row(s) in 0.0380 seconds
    复制

    该命令重写了所有以 Row 开头的行的 ACL。

  6. 作为 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 权限。

示例二:

  1. 作为 user2 用户:

    hbase(main):001:0> scan ‘table1′
    ROW COLUMN+CELL
    0 row(s) in 0.0170 seconds
    复制

    原因是用户 user2 没有对单元格维度的 R 权限。

  2. 作为 Hbase 用户:

    hbase(main):003:0> grant ‘table1′, {‘@users’ => ‘RW’}, {FILTER => “(PrefixFilter (‘row’))”}
    3 row(s) in 4.8260 seconds
    复制

    上述 shell 命令是将对单元格的 RW 权限授予组 users ,而用户 user2 在这个组里。

  3. 作为 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 中数据的强大的安全功能。