hbase权限管理(访问控制标签ACL)

全栈工程师开发手册 (作者:栾鹏)
架构系列文章


默认情况下,访问hbase是不需要用户密码等认证方式的。

HBase访问控制标签(ACL)

HBase中的ACL基于用户的成员身份或组中的排除,以及给定组访问给定资源的权限。ACL是作为一个称为AccessController的协处理器实现的。
HBase不维护私有组映射,但依赖于Hadoop组映射器,它映射目录中的实体(LDAP或Active Directory)和HBase用户。任何支持的Hadoop组映射器都将起作用。然后,针对资源(全局,名称空间,表格,单元或端点)授予用户特定的权限(读取,写入,执行,创建,管理)。

HBase的访问控制是也是基于Kerberos的, 启用Kerberos和访问控制后,客户端对HBase的访问将得到验证,并且用户数据是专用的,除非明确授予访问权限。

认证机制利用了Java的JAAS。 当HBase接受到透过RPC过来的请求时,将调用JAAS的doAs函数.

与关系数据库相比,HBase具有更简单的安全模型,特别是在客户端操作方面。例如,插入(新记录)和更新(现有记录)之间没有区别,两者都将折叠为已放置。

我们不需要详细介绍Kerberos的原理,但是大概流程可以说一下:

当HBase客户端访问HBase的时候,首先必须访问KDC获取一个经过授权的票据,以后Client在访问HBase server的时候可以通过这个票据进行访问。
正常情况下当我们通过HBase客户端访问的时候,都需要进行一次认证的过程,认证过后,KDC返回的票据具有有效期,一般默认是10小时,换句话说在这10个小时内你不需要再次登录KDC进行认证。

开启认证

HBase的权限管理依赖协协处理器。所以我们需要配置hbase.security.authorization=true,以及hbase.coprocessor.master.classeshbase.coprocessor.master.classes使其包含org.apache.hadoop.hbase.security. access.AccessController来提供安全管控能力。所以需要设置下面参数:

通过在hbase-site.xml中设置以下属性来安装和配置AccessController协处理器。这些属性包含一个类的列表。
如果您使用AccessController以及VisibilityController,则AccessController必须首先位于列表中,因为在这两个组件都处于活动状态时,VisibilityController会将其系统表上的访问控制委派给AccessController。

<property>
      <name>hbase.superuser</name>
      <value>hbase</value>
</property>
<property>
    <name>hbase.coprocessor.region.classes</name>    
	<value>org.apache.hadoop.hbase.security.access.AccessController</value>  
</property>
<property>
    <name>hbase.coprocessor.master.classes</name>
    <value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
    <name>hbase.rpc.engine</name>
    <value>org.apache.hadoop.hbase.ipc.SecureRpcEngine</value>
</property>
<property>
      <name>hbase.security.authorization</name>
      <value>true</value>
</property>

ThriftServer其实是HBase服务的客户端,既然HBase开启了Kerberos认证,那么ThrifServer也必须配置Kerberos的信息才能正常访问HBase集群服务。

在ThriftServer的hbase-site.xml文件中添加新配置:

  <property>
    <name>hbase.security.authentication</name>
    <value>kerberos</value>
  </property>
    <property>
    <name>hbase.thrift.kerberos.principal</name>
    <value>hbase/_HOST@EMR.123456.COM</value>
  </property>
    <property>
    <name>hbase.thrift.keytab.file</name>
    <value>/etc/ecm/hbase-conf/hbase-thrift.keytab</value>
  </property>

上述配置中实际值以用户为准(principle和keytab需对应)。

thrift和rest接口权限控制,未完待续

hbase 权限

HBase提供的五个权限标识符:RWXCA,分别对应着READ(‘R’), WRITE(‘W’), EXEC(‘X’), CREATE(‘C’), ADMIN(‘A’)

HBase访问级别是相互独立授予的,并允许在给定范围内进行不同类型的操作。

  • 读取(R) - 可以读取给定范围的数据。
  • 写入(W) - 可以在给定范围写入数据。
  • 执行(X) - 可以在给定范围内执行协处理器端点。
  • 创建(C) - 可以在给定范围内创建表或删除表(甚至不创建它们)。
  • 管理员(A) - 可以执行群集操作,例如在给定的范围内平衡群集或分配区域。

HBase提供的安全管控级别包括:

  • Superuser:拥有所有权限的超级管理员用户。通过hbase-site.xml的hbase.superuser参数配置. Superuser可以执行HBase中可用的任何操作,以访问任何资源。在你的集群上运行HBase的用户就是superuser.
  • Global:全局权限可以作用在集群所有的表上。
  • Namespace :命名空间级。在命名空间范围授予的权限适用于给定名称空间内的所有表。
  • Table:表级。在表范围授予的权限适用于给定表中的数据或元数据。
  • ColumnFamily:列簇级权限。在ColumnFamily范围内授予的权限适用于该ColumnFamily内的单元格。
  • Cell:单元级。在单元格范围内授予的权限适用于该确切的单元格坐标(键,值,时间戳)(key, value, timestamp)。这允许政策与数据一起发展。
    要更改特定单元格上的ACL,请使用新ACL写入更新后的单元格,以获得原始坐标的精确坐标。

实现细节

单元级ACL使用标签(tag)实现(请参阅HBase:标签)。为了使用单元级别的ACL,您必须使用HFile v3和HBase 0.98或更高版本。

由HBase创建的文件由运行HBase进程的操作系统用户拥有。要与HBase文件交互,您应该使用API​​或批量加载功能。
HBase不在HBase内部建立“roles”。相反,组名可以被授予权限。这允许通过组成员身份对角色进行外部建模。通过Hadoop组映射服务在HBase外部创建和操作组。

权限创建和收回

和关系数据库一样,权限的授予和回收都使用grant和revoke,但格式有所不同。grant语法格式:

grant user,permissions,table,column_family,column_qualifier

收回权限revoke的语法格式

revoke user,table,column,family,column qualifier

在启用了hbase.security.authorization之后,默认每个用户只能访问当前的表。而之前创建的表的属主是HBase,其他用户对其没有访问权限。

比如我们给用户user1一个’device’表格赋予读写权限

grant 'user1', 'RW', 'device'

在hbase的命令中通过user_permission来查看权限

user_permission 'device'

再试一下

scan 'device'

收回user1用户在表device上的权限

revoke 'user1','device'

其他级别的权限设置可以参考

Global:

hbase> grant '@admins', 'RWXCA'

Namespace:

hbase> grant 'service','RWXCA','@ test-NS'

Table:

hbase> grant 'service', 'RWXCA', 'user'

Column Family:

hbase> grant '@developers', 'RW', 'user', 'i'

Column Qualifier:

hbase> grant 'service, 'RW', 'user', 'i', 'foo'

Cell:授予单元ACL的语法使用以下语法:

grant <table>, \
  { '<user-or-group>' => \
    '<permissions>', ... }, \
  { <scanner-specification> }
  
<user-or-group>是用户名或组名,前缀@为组的情况。
<permissions>是一个包含任何或所有“RWXCA”的字符串,但只有R和W在单元范围内有意义。
<scanner-specification>是'scan'shell命令使用的扫描器(scan)规范语法和约定。

如果您需要启用单元格acl,则hbase-site.xml中的hfile.format.version选项应该大于或等于3,并且hbase.security.access.early_out选项应设置为false。此示例授予’testuser’用户读取的访问权限以及对’developers’组进行读/写访问,'pii’列中与过滤器匹配的单元格。

hbase> grant 'user', \
  { '@developers' => 'RW', 'testuser' => 'R' }, \ 
  { COLUMNS => 'pii', FILTER => "(PrefixFilter ('test'))" }

shell将运行具有给定条件的扫描器,用新的ACL重写找到的单元格,并将其存储回其确切的坐标。

注意:user/group的授权方式一样,group需要加一个前缀@

grant 'test','R','tbl1'   #给用户test授予表tbl1的读权限
grant '@testgrp','R','tbl1' #给用户组testgrp授予表tbl1的读权限

amespace需要加一个前缀@

grant 'test 'C','@ns_1'  #给用户test授予namespace ns_1的CREATE权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾讯AI架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值