安全&权限

我的废话:

大年三十夜,看春晚实在是太无聊了,整个《新闻联播》的电视剧版本,还不如上上网,看看资料,喝喝老酒,写点东西来的快活。

近2年来云计算的话题到目前为止风风火火从来没有平静过,一直是大家嘴边讨论的热门话题,人们期望运用云计算提供可靠、稳定、高速的计算,在云计算中Google是目前最大的云计算供应商,例如:Google GAE(Google App Engine)和Google的Docs在线文章服务,这些SaaS上线产品的数据存储(datastore)是由BigTable提供存储服务的,在次之前我提到过Yahoo贡献给Apache的那些山寨版本(Google与Yahoo的那些利器),其中Apache的HBase就是山寨了Google的BigTable。

我们知道在云计算的技术话题中Apache的Hadoop项目是一块基石,利用Hadoop项目中的产品可以建立云计算平台和超大型的计算。不知道你是否有想过如果将HBase作为Google GAE上的数据存储(datastore),那么每个用户之间的数据访问权限怎么办?如果使用HBase提供对大客户提供“私有云”(private cloud)或者另一种可能一个公司内部的集群上运行HBase,公司的内部可能有几个部门,某几个部门之间的数据都是独立分离但又运行在一个平台上,那么你就会发现HBase不具备这样的功能,貌似目前HBase的最高版本0.90.0还没有这样的功能对用户的表、Row、Cell的访问权限。但是我们知道Google的GAE上每个用户访问的数据肯定是有权限划分的,不然我只要有权限登录GEA就能看见所有用户存放的数据了。这样的问题你有可能没有想过,但趋势公司的工程师们却为此想到了这点,并且把他们的设想和设计提交了HBase项目组,并且提出了以下主要的设计思想:

  1. Client access to HBase is authenticated
  2. User data is private unless access has been granted
  3. Access to data can be granted at a table or per column family basis.

对HBase中的表和数据划分权限等级和身份验证后,操作权限被分为3大类,每类中包含的操作权限如下所示:

hbase赋权限 hbase表权限_Google

对于方案中涉及到存储的权限的是指整个表或表中的列族,也就是说只考虑在表这个级别的权限,表与表之间的所属关系是存放在 .META. 系统表中,以regioninfo:owner 的格式进行存放,例如:系统中table1这个表是有权限的,这个表权限的存根保存在3个地方 :

  • The row in .META. for the first region of table1
  • The node /hbase/acl/table1 of Zookeeper
  • The in-memory Permissions Mirror of every regionserver that serves table1

如图所示,图中的箭头表示了数据流向的顺序:

hbase赋权限 hbase表权限_Apache_02

方案中HBase在分布式、集群环境下,而权限一致性的问题交给了Zookeeper来处理,在多个regionservers中,每个服务器的HRegion中存放着多个表,并且实现了(implement)ZKPermissionWatcher接口的nodeCreated() 和 nodeChanged() 方法,这2个方法对Zookeeper 的节点进行监控, 节点的状态发生相应的变化时会ZooKeeper刷新镜像中的权限。

如图所示:

hbase赋权限 hbase表权限_hbase赋权限_03

HBase的这一关于权限的功能正在设计和研讨当中,让我们继续对他保持关注,看看今后将会发生的变化能给我们带来什么样的效果,非常期待这个功能早日正式发布。