hbase-0.98版已经出了,主要的改变有以下几点:
1、修复了一些bug,添加了cell可视化标签、cell ACLs和透明的服务器端加密。
2、一些性能改进包括:预写式日志线程模型,在高负载下提高了事务吞吐量;反向扫描;在快照文件上的mapreduce;striped compaction
HBase 0.98主要基于单元格的安全在安全性上趋同于Apache Accumulo(和hbase类似,参照bigtable,基于hadoop,zookeeper和thrift构建)
权限控制:table -> column family -> cell.
R (read), W (write), C (create), A (admin).
Permission |
Operation |
Read |
Get |
|
Exists |
|
Scan |
Write |
Put |
|
Delete |
|
Lock/UnlockRow |
|
IncrementColumnValue |
|
CheckAndDelete/Put |
|
Flush |
|
Compact |
Create |
Create |
|
Alter |
|
Drop |
Admin |
Enable/Disable |
|
Snapshot/Restore/Clone |
|
Split |
|
Major Compact |
|
Grant |
|
Revoke |
|
Shutdown |
权限的授予范围如下:
create和admin权限仅仅在表的范围内有效
表:
read:用户能从表中的任何列簇读取数据
write:用户可以写入数据到表中的任何列簇中
create:用户可以更改表的属性:add,alter或者drop列簇,还可以drop一个表
admin:用户可以更改表属性:add,alter或者drop列簇;还可以enable或者disable,drop一个表,还可以出发region的重新分配和定位。
列簇:
read:用户能从列簇中读数据
write:用户可以写数据到列簇中
hbase中有一个隐含的超级用户,在hbase的configuration文件中配置。类似于linux系统中的root。仅仅超级用户才被允许创建表,打开或者关闭balancer或者进行其他影响全局的操作。超级用户负责分配所有资源。
hbase的表有了新的元数据属性:owner,指明那个用户拥有该表。默认的拥有者是创建该表的用户。一个给定时间仅仅有一个用户能拥有该表,一个表的拥有者有对于该表操作的所有权限。
服务器端的访问控制配置:
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.token.TokenProvider,
org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
使用Tags进行cell级别的访问控制
0.98引入了tags机制实现了cell级别的访问控制。可以使用如下API来设定cell的ACLs。
Mutation.setACL(String user, Permission perms)
Mutation.setACL(Map<String, Permission> perms)
例如,对于用户user1提供一个读权限,则可以进行如下设定:
put.setACL(“user1”, new Permission(Permission.Action.READ))
表和列簇的ACL优先权要高于cell级别的ACL。为了应用cell级别的优先权,需要使用如下API:
Mutation.setACLStrategy(boolean cellFirstStrategy)
例如,对于put操作设定,如下:
put.setACLStrategy(true);
另外,要记得想要正常使用这个特性,还需要将HFile V3打开,在configuration文件中做如下设定:
<property>
<name>hfile.format.version</name>
<value>3</value>
</property>
注意:ACL的删除没有任何影响。ACLs对当前Put做的操作不会印象到之前的Put。
通过shell进行访问控制
权限授予:
grant <user|@group> <permissions> [ <table> [ <column family> [ <column qualifier> ] ] ]
<user|@group>代表用户或组别(以 '@'开始),组别通过hadoop组别映射服务来创建和管理。
<permissions> 是0或1个字母从"RWCA"中选取,分别代表: READ('R'), WRITE('W'), CREATE('C'), ADMIN('A').
权限收回:
revoke <user|@group> [ <table> [ <column family> [ <column qualifier> ] ] ]
权限更改:
alter 'tablename', {OWNER => 'username|@group'}
权限查看:
查看一个用户对某个表的权限可以使用如下命令:
user_permission <table>
安全的bulkload:
bulkload有一个安全模式,客户端传输文件所有者的信息是使用mapreduce任务到hbase的。安全的bulkload是通过协处理器(coprocessor),命名为SecureBulkLoadEndpoint。staging使用目录,"hbase.bulkload.staging.dir",默认为/tmp/hbase-staging/。
算法如下:
1、创建一个hbase拥有者的目录,/tmp/hbase-staging/并设置权限(-rwx--x--x, 711)
2、用户写入输出数据到他的安全输出目录 /user/foo/data
3、调用hbase创建一个私密目录,将其权限设置为readable/writable (-rwxrwxrwx, 777),目录为:/tmp/hbase-staging/averylongandrandomdirectoryname
4、用户将全局数据设为可读和可写,紧接着将他们移动到随机的STAGING目录,然后调用bulkLoadHFiles()
为了能让bulk load更好的工作,需要修改hbase-site.xml文件(所有的机器上的)并且添加SecureBulkLoadEndpoint到regionserver协处理器中:
<property>
<name>hbase.bulkload.staging.dir</name>
<value>/tmp/hbase-staging</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.token.TokenProvider,
org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint</value>
</property>
可视化标签
这个特征用被标记的可视化功能提供了cell级别的安全。cells与可视化表达相关联。可视化的表达可以通过‘&’,'|'和"!"联系在一起。也使用‘,’指定其优先级。例如,一个标签集{ confidential, secret, topsecret, probationary },其中前三个是敏感性分类,最后一个介绍了员工试用与否。如果一个cell使用这样的可视化表达式( secret | topsecret ) & !probationary, 那么任何secret 或topsecret 标签的用户都能看到这个cell,只要用户不与probationary标签关联。此外,任何用户只与保密的标签相关,无论是否在实习期,都将看不到该cell,甚至不知道它的存在。
可以使用如下API来设定可视化标签:
Mutation#setCellVisibility(new CellVisibility(String labelExpession));
我们将都建用户标签集在rpc上下文请求被hbase regionserver第一次接收的时候。用户与标签的关联是可插拔的。默认的插件通过在认证中指定的标签添加get或scan并且检查用户的权限标签列表看他们是否有相应的权限。
Get#setAuthorizations(new Authorizations(String,...));
Scan#setAuthorizations(new Authorizations(String,...));
可视化标签管理
增加标签:
1)通过java API:VisibilityClient#addLabels(Configuration conf, final String[] labels)
2)通过shell命令:add_labels [label1, label2]
有效的标签可以包含字母、数字字符和字符 '-', '_', ':', '.'和 '/'。
用户标签关联:
1)通过java API:
关联,VisibilityClient#setAuths(Configuration conf, final String[] auths, final String user)
解除关联,VisibilityClient#clearAuths(Configuration conf, final String[] auths, final String user)
2)通过shell命令:
关联,set_auths user,[label1, label2].
解除关联,clear_auths user,[label1, label2]
也可以通过VisibilityClient#getAuths(Configuration conf, final String user) 或者get_auths命令来查看给定用户关联的标签,标签和用户权限信息将被存储在系统表“labels”中。
服务器端配置:
hbase存储cell级别的标签作为cell tags。HFile的版本3增加了对cell tags的支持。需要确定配置文件中加入了如下语句:
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.visibility.VisibilityController</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.visibility.VisibilityController</value>
</property>
转载请注明出处: http://blog.csdn.net/iAm333