技术开发 频道

直击Hadoop中国云计算大会:HBase安全性

        【IT168 现场报道】一年一度的Hadoop中国2011云计算大会,作为Hadoop in China社区的一次年度技术盛会,于12月2日至3日在北京成功举行。大会的亮点之一就是邀请了多位Apache软件基金会的专家,例如Apache软件基金会主席兼Apache Hadoop项目负责人Doug Cutting先生等。大会的第二天,记者参加的“Hadoop生态系统”分会场报告环节。Trend Micro的专家兼Apache Incubator Flume的提交者,从非结构化数据库的安全性角度作了一场题为“HBase Coprocessors and Security”的主题报告。

  众所周知,大数据时代为类似HBase等非结构化数据库提供了诸多机会。HBase凭借其在海量数据的良好扩展性和高效的读写能力,吸引了更多公司的重视。然而,在众多机遇的背后,HBase也面临着很多挑战,比如构建和运维HBase集群是一个非常有挑战性的工作。而如何保证HBase的安全性自然就成了一个绕不开的话题,实际上,NoSQL存在的产品安全性不高的问题一直成为各路反对者的诟病。现在部署在云计算公有云的HBase集群也在日益增多,试想一下,如果没有访问控制,存储其中的数据可以被随意访问甚至执行删改等误操作,会造成很多潜在的风险,对企业而言,也是无法接受的。但是,如果所有事情都由管理员处理,沟通的代价就会很高,而且管理员不得不处理一些Application相关的工作,导致管理低效。因此,HBase的访问控制,就成为了一个很重要的需求。这次围绕HBase 安全性的演讲,让我们有理由相信HBase提供了足够的安全支持。

  首先谈到的是HBase的新版本特性。作为最新版本,HBase 0.92马上要发布RC版了, 0.92支持最新的Hadoop版本0.20.205,该版本对于HBase有了很大的改进。具体表现在:Distributed WAL splitting策略,Coprocessor框架等等。

  Distributed WAL splitting

  所谓WAL(write-ahead logging)策略指的是Region servers每次将内存数据更新到磁盘之前都需要先写到一个log里,只有当写入成功后才通知客户端该操作成功了。之后,Region servers服务端就可以根据需要在内存中对数据进行随意批处理或者是聚合。WAL策略的工作流程如下:客户端发起数据修改动作,比如产生一个put(),delete()及increment()调用。每个修改操作都会被包装为一个KeyValue对象实例,然后通过RPC调用发送给对应regions的HRegionServer。一旦KeyValue实例到达,它们就会被发送到给定的行所对应的HRegion。数据就会被写入WAL,然后被存入相应的MemStore中。最终,当memstore达到一定大小后,或者过了特定时间段后,数据就会异步地持久化到文件系统中。在此期间数据都是保存在内存中的。WAL可以保证数据不会丢失,即使是在服务端完全失败的情况下。

  WAL是灾难发生时的救生索。与MySQL中的binary log类似,它会记录下针对数据的所有变更。如果服务器crash了,它就可以通过重放日志让一切恢复到服务器crash之前的那个状态。

  而所谓的WAL splitting指的是在log中的修改操作可以被replay之前,把它们按照region分离出来的过程。读取日志然后按照每条记录所属的region分组。这些分好组的修改操作将会保存在目标region附近的一个文件中,用于后续的恢复。

  WAL splitting的实现在几乎每个HBase版本中都有些不同:早期版本通过master上的单个进程读取文件。后来对它进行了优化改成了多线程的。0.92版本中,最终引入了分布式log splitting的概念,将实际的工作从master转移到了所有的region servers中。

  Coprocessors

  Coprocessor Framework, 允许HBase 管理员在Region server中载入定制的代码。Coprocessor的机制可以理解为,server端添加了一些回调函数。coprocessors由3个部分组成:

  Coprocessor interface定义的回调函数如下:

  1、preOpen, postOpen: Called before and after the region is reported as online to the master.

  2、preFlush, postFlush: Called before and after the memstore is flushed into a new store file.

    3、preCompact, postCompact: Called before and after compaction.

    4、preSplit, postSplit: Called after the region is split.

       5、preClose and postClose: Called before and after the region is reported as closed to the master.

  RegionObserver interface定义的回调函数如下:

     1、 preGet, postGet: Called before and after a client makes a Get request.

     2、 preExists, postExists: Called before and after the client tests for existence using a Get.

    3、 prePut and postPut: Called before and after the client stores a value.

    4、 preDelete and postDelete: Called before and after the client deletes a value.

    5、 preScannerOpen postScannerOpen: Called before and after the client opens a new scanner.

   6、 preScannerNext, postScannerNext: Called before and after the client asks for the next row on a scanner.

   7、 preScannerClose, postScannerClose: Called before and after the client closes a scanner.

   8、 preCheckAndPut, postCheckAndPut: Called before and after the client calls checkAndPut().

  9、 preCheckAndDelete, postCheckAndDelete: Called before and after the client calls checkAndDelete().

  EndPoint可以让我们将执行代码逻辑动态进入Server端,并让其执行。

  通过coprocessors,HBase将获得许多新的特性,比如:HBase access control,Column aggregate,Region level indexing,Table metacolumns,New filtering,HBase table, region access statistic,HLog extension。

  在给出相应定义,原理等理论之后,分别从列式聚合,定制WAL行为,安全性三方面给出一些Use case。

  HBase Observers

  HBase Observers类似关系数据库的触发器,提供了与HBase交互过程中的基于事件的回调函数。按类别分,HBase Observers分为RegionObserver,MasterObserver,WALObserver。

  具体来说,RegionObserver在下列事件发生时被触发:

  •   · CRUD(增删改查)或者DML操作
  •   · 表数据的Get, Put, Scan等操作的Pre/post-hooks 回调
  •   · 对客户端数据的响应结果的数据追加或替代
  •   · 覆盖正常的请求处理

  MasterObservers适用场景为DDL操作,元数据操作,集群管理等。WALObserver针对的是WAL的追加或还原。

  值得一提的是,这些HBase Observers可以协同工作,形成一个完整的Observer链,如图:

  EndPoint

  如果说HBase Observers类似关系数据库的触发器,那么HBase的EndPoint概念上则类似存储过程,提供了显式参数RPC函数调用。如图,客户端自定义接口,调用RPC方法。其中,HTable.coprocessorExec()调用返回列数的大小,而此调用又会跨越不同的Region Server,然后分割,并行执行,最后返回结果。

  访问控制器

  访问控制器(AccessController)作为HBase的核心,主要负责访问控制列表(ACL)与权限管理。从ACL的角度看,AccessControllerProtocol提供RPC调用,更新与查询用户权限。而ZooKeeper作为监听器,通过集群同步ACL的变更。从权限管理的角度看,RegionObserver触发的对象为DML操作,而MasterObserver针对的是DDL操作。

  作为一个具体例子,AccessControllerProtocol作为一个EndPoint,实现AccessControllerProtocol接口,代码如下:

  另一个例子,AccessController提供函数preGet通过RegionObserver与MasterObserver实现权限访问检查,代码如下:

  为更加便于理解,这里给出preGet()用例图。这里验证的是用户的credential,如果验证成功,则继续下一步操作,如果失败则抛出AccessDeniedException。

  Secure ZooKeeper

  ZooKeeper作为监听器,在HBase集群起到关键作用,具体表现在:

  •   · Root catalog table location
  •   · Region assignment
  •   · Server "liveness"
  •   · Synchronizes ACLs throughout cluster
  •   · Synchronizes secret key rolling for token authentication

  如前所述,ZooKeeper能监听ACL的变更,如图:

  我们可以看到,绿色的znode为public,一般来说,该作用域适用于客户端所需操作。红色的znode为private,通常为集群操作安全性要求较高的znode。

  总之,安全性是企业应用绕不开的话题。HBase 0.92在安全性方面有非常大的改进,相信越来越多的公司会选择HBase。通过HBase读写数据的产品也会越来越多。更多大会详情,请查看专题链接:

直击Hadoop中国云计算大会:HBase安全

0
相关文章