本文为您介绍如何开启HBase ACL(授权)。

背景信息

HBase在不开启授权的情况下,任何账号对HBase集群可以进行任何操作,例如disable table、drop table、major compact等。

对于没有Kerberos认证的集群,即使开启了HBase授权,用户也可以伪造身份访问集群服务。所以建议创建高安全模式(即支持Kerberos)的集群,详情请参见Kerberos概述

基本概念

授权(ACL)就是将对某个范围的资源的操作权限授予某个实体。

在HBase 中,上述对应的三个概念分别为:
  • 某个范围(Scope)的资源
    名称 描述
    Superuser 超级账号可以进行任何操作,运行HBase服务的账号默认是Superuser,也可以在hbase-site.xml中配置hbase.superuser的值来添加超级账号。
    Global Global Scope拥有集群所有table的Admin权限。
    Namespace 在Namespace Scope进行相关权限控制。
    Table 在Table Scope进行相关权限控制。
    ColumnFamily 在ColumnFamily Scope进行相关权限控制。
    Cell 在Cell Scope进行相关权限控制。
  • 操作权限
    名称 描述
    Read(R) 读取某个Scope资源的数据。
    Write (W) 写数据到某个Scope的资源。
    Execute (X) 在某个Scope执行协处理器。
    Create (C) 在某个Scope创建或删除表等操作。
    Admin(A) 在某个Scope进行集群相关操作,如balance、assign等。
  • 某个实体
    名称 描述
    User 对某个用户授权。
    Group 对某个用户组授权。

操作步骤

  1. 进入HBase配置页面。
    1. 登录EMR on ECS控制台
    2. 在顶部菜单栏处,根据实际情况选择地域和资源组
    3. 集群管理页面,单击目标集群操作列的集群服务
    4. 单击HBase服务区域的配置
  2. 添加配置。
    1. 单击hbase-site.xml
    2. 单击新增配置项,新增以下信息。
      Key Value
      hbase.security.authorization true
      hbase.coprocessor.master.classes org.apache.hadoop.hbase.security.access.AccessController
      hbase.coprocessor.region.classes org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.AccessController
      hbase.coprocessor.regionserver.classes org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.token.TokenProvider
  3. 重启HBase服务。
    1. 单击右上角的更多操作 > 重启
    2. 在弹出的对话框中,输入执行原因,单击确定
    3. 确认对话框中,单击确定
  4. 授权(ACL)。
    • grant授权
      grant <user> <permissions> [<@namespace> [<table> [<column family> [<column qualifier>]]]
      • user和group的授权方式一样,但group需要加一个前缀@
        grant 'test','R','tbl1'   #给用户test授予表tbl1的读权限。
        grant '@testgrp','R','tbl1' #给用户组testgrp授予表tbl1的读权限。
      • namespace需要加一个前缀@
        grant 'test','C','@ns_1'  #给用户test授予namespace ns_1的CREATE权限。
    • revoke回收
      revoke 'trafodion'  #回收trafodion用户的所有权限。
    • user_permission查看权限
      user_permission 'TABLE_A'  #查看TABLE_A表的所有权限。