全栈工程师开发手册 (作者:栾鹏)
架构系列文章
默认情况下,访问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.classes
和hbase.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权限