文档章节

Hadoop源码解析之: HBase Security

猪刚烈
 猪刚烈
发布于 2014/10/12 11:47
字数 1729
阅读 36
收藏 1
点赞 0
评论 0
文不打算对这部分代码进行全面的解读,而是先对几个主要类的职能进行概述,然后再罗列一些有价值的重要细节。本文原文连接:http://blog.csdn.net/bluishglc/article/details/11903613 转载请注明出处!
  • 第一部分:HBase Security 概述

HBase Security主要是基于User和User Group(Role)对表(或是更细粒度的Family、Qualifer)进行安全检查(目前HBase Security暂不支持基于行的安全检查,但后续版本中会追加进来)。在authentication方面,它主要是通过Kerberos来完成的,这部分不是HBase Security实现的重点,HBase Security的大部分代码是在解决authorization的问题,也就是根据用户权限判定其是否有权访问某项资源。

HBase Security主要有这样几个重要的类:

org.apache.hadoop.hbase.security.access.AccessController

这是对所有访问进行拦截的入口,它既是MasterObserver又是RegionObserver,言下之意,它能拦截所有的操作。

org.apache.hadoop.hbase.security.access.AccessControlLists

这是专门负责对Permission进行读写(包括数据库和ZooKeeper)操作的类,你可以认为这一个DAO或是Repository

org.apache.hadoop.hbase.security.access.TableAuthManager

这是负责对用户进行权限检查的类,它主要有多个重载的authorize方法组成。同时,由于这个类的实例cache了所用的permission,因此它还有一些借助ZKPermissionWatcher进行同步本地与ZooKeeper数据的工作。

org.apache.hadoop.hbase.security.access.ZKPermissionWatcher

这是一个专门监视_acl_节点的一个ZooKeeper的Watcher. HBase Security在设计上为了考虑性能,会把所有的permission加载到内存中,但是如果permission发生变化,各节点需要同步这些变化,因此将所有的permission写入到ZooKeeper,然后再通过一个“观察者”实时监控并更新permission,这个“观察者”就是KPermissionWatcher。

补充一句:从代码上看,TableAuthManager和ZKPermissionWatcher两个类耦合过于紧密,彼此互为对方的field. 此处的设计并不好,其实可以将两者合二为一,让TableAuthManager实现ZooKeeperListener。

  • 第二部分:若干重要细节

以下是一些有价值的细节问题,有关于配置部署的,有关于代码实现的。

1. 打开安全检查的方式是注册一些安全相关的coprocessor, 具体做法是在所有节点的hbase-site.xml中加入以下内容重启集群,  其中指定rpc engine为SecureRpcEngine
是因为该引擎能传递remote client传递的用户凭证(如用户名..),安全检查是以用户提供的凭证为基础进行的.

<property>
      <name>hbase.rpc.engine</name>
      <value>org.apache.hadoop.hbase.ipc.SecureRpcEngine</value>
 </property>
 <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>

2. 打开安全机制前,最好指定一个superuser, 否则在刚打开安全机制时,_acl_表为空,意味着任何用户都无法从事任何操作,所以需要使用superuser来为用户分配权限.指定superuser的方法是在hbase-site.xml中加入:
<property>
    <name>hbase.superuser</name>
    <value>superuser-accout: such as root</value>
 </property>

3. 存储权限数据的表:_acl_ 的schema



4. 表的owner,也就是建表账户将自动拥有对该表的所有操作权限:RWXCA. 参见方法:
org.apache.hadoop.hbase.security.access.RowBasedAccessController.postCreateTable(...)

5. 用户或组的权限可以指定到 <table> <column family> <column qualifier> 三种不同的层次(粒度)上. 通过试验表明, 下层权限会自动继承上层权限!,.如给一个sample表R的权限,column family:cf也是R的权限,而qualifier:q是W的权限,那么用户即能读取也能写入cf:q.

6. 紧接第4点,考虑一种更为复杂的情况:

假定sample表有100个qualifier, 100个qualifier分属多个family,假定没有指定sample表级别的读权限,但是通过对多个family和family下的qualifier设定读权限,其中80个qualifier已经具备了读权限,那么,当该用户执行scan 'sample' 操作时,结果会如何呢?通过试验表明,所有具备读权限的qualifier都列出了,所有没有读权限的qualifier都被过滤掉了。 这是一种合理的处理方式,而关于这部分的处理逻辑是通过在权限检查时通过 org.apache.hadoop.hbase.security.access.AccessControlFilter进行过滤实现的。这个Filter其实也非常简单,它是主要是通过 org.apache.hadoop.hbase.security.access.TableAuthManager.authorize(User, byte[], KeyValue, Action)进行最细度(精确的 qualifier)的检查,只有确定有权读写的qualifier才会通过检查,否则就被过滤掉。

7. Permission的Class Hierarchy:

Permission (包含了Action)
        |
        |--TablePermission (又包含了table,family,qualifier)
                    |
                    |--UserPermission(又包含了user)

8. 关于  cache:

AccessController在初始化的时候会load所有的permission,然后写到zookeeper里.参考:org.apache.hadoop.hbase.security.access.AccessController.initialize(RegionCoprocessorEnvironment)

同时, 一个ZooKeeper的监听器ZKPermissionWatcher会关注 ZooKeeper的任何变化,当Permission数据写入zookeeper时,方法org.apache.hadoop.hbase.security.access.ZKPermissionWatcher.nodeDataChanged(String)
会被触发,这个方法会负责把前面刚刚写入的Perssmion加载到缓存里!

Cache分为两类: 表级Cache和全局Cache.  表级Cache是一个以表名为Key,以这个表对应的<用户,权限>对为Value的Map, 而全局Cache 是指那些不针对某个具体表的全局Permission, 所以它的结构是一个<用户,权限>对组成的map. 关于全局Cache一个重要的细节是: 很显然, 所有的superuser是应该放在全局cache里,而且应被赋予所有权限.(参考:org.apache.hadoop.hbase.security.access.TableAuthManager.initGlobal(Configuration))

 表级Cache:

TABLE_USER_CACHE: Map<TableName,Map<UserName,Permission>>
TABLE_GROUP_CACHE: Map<TableName,Map<UserName,Permission>>


全局Cache:

USER_CACHE:Map<USerName,Permission>
GROUP_CACHE: Map<TableName,Map<UserName,Permission>>


cache隶属于一个TableAuthManager实例, 而TableAuthManager是一个管理多个自身实例的单态, 它维护一个全局的map,这个map里一个ZooKeeperWatcher实例对应一个它的实例. 参考:org.apache.hadoop.hbase.security.access.TableAuthManager.get(ZooKeeperWatcher, Configuration)

9. ZooKeeperListener的典型应用案例:ZKPermissionWatcher

security的一个设计需求是:,所有region和master对应的coprocessor所依赖的authManager都需要加载所有的permission到cache里,通过内存中permission实例进行权限检查. security的实现方式是:当_acl_表对应的region open的时候,加载所有的permission(参考AcessController(L720-L723),当所有的permission加载之后,就把它们再写到zookeeper节点上,参考 org.apache.hadoop.hbase.security.access.AccessController.initialize(RegionCoprocessorEnvironment).
而由于所有的 authManager 实例都含有一个ZKPermissionWatcher,这是一个ZooKeeperListener, 当zookeeper节点上的数据发生变化时,这个watcher的nodeCreated方法会被触发,进而重新加载permission数据!

10. 关于AccessController和TableAuthManager与ZooKeeperWatcher的实例数量
对于AccessController来说,做为MasterObserver时, 会创建一个实例.作为BaseRegionObserver来说, 一个region(不是region server)会创建一个是实例!而TableAuthManager与ZooKeeperWatcher的实例是一一对应的,参考:
org.apache.hadoop.hbase.security.access.TableAuthManager.get(ZooKeeperWatcher, Configuration)
而ZooKeeperWatcher的实例自来于Master或Region启动( MasterObserver 的start方法和BaseRegionObserver的postOpen)时从MasterServices或RegionServerServices中取得的ZooKeeper的实例!而这个ZooKeeper实例是一个server(node)对应一个. 所以对于同一个regionserver上的所有region,引用的是同一个zookeeper实例.


本文转载自:http://blog.csdn.net/bluishglc/article/details/11903613

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
Sqoop数据导入到HBase遇上的问题及解决方法

  【IT168 技术】运行bin/sqoop import --connect jdbc:mysql://ip:port/database --username * --password **--hbase-bulkload --hbase-create-table --column-family info --hbase-row-k......

中国大数据 ⋅ 05/31 ⋅ 0

hadoop及hbase集群启停的几种方式

1、生产环境集群 2、web管理页面 hadoop web管理页面(主备) http://192.168.10.101:50070 http://192.168.10.102:50070 hbase web管理页面(主备) http://192.168.10.101:16010 http://1......

断臂人 ⋅ 06/07 ⋅ 0

记一次测试环境Hbase数据备份恢复以及恢复后部分表无法删除的问题处理

一、Hbase数据备份恢复 说明: 因为测试环境要修改hadoop配置文件hdfs-site.xml的参数hdfs.rootdir 修改前的配置 hbase.rootdir hdfs://masters/hbase1 修改后的配置 hbase.rootdir hdfs://m...

断臂人 ⋅ 06/15 ⋅ 0

win环境下 hbase 数据库搭建流程

Hbase单机版安装使用教程 Hbase介绍请参考技术支持文档,这里只说明Hbase 的安装和使用 第一步:下载安装Hbase数据库 链接:链接:https://pan.baidu.com/s/1si6Nokvz8xkUsmefsRlntQ 密码:k...

lijiaweizuishuai ⋅ 05/28 ⋅ 0

Apache HBase 2.0.0 发布,Hadoop 数据库

Apache HBase 2.0.0 发布了,HBase 2.0.0 是 HBase 的第二个主要版本。 此次更新信息如下: 一个新的区域分配管理器(“AMv2”), 用于配置读取和/或写入路径以运行堆外的装置,以及可选的内...

雨田桑 ⋅ 05/03 ⋅ 0

记录一次生产环境hadoop集群优化以及pid文件缺失处理

一、优化准备 优化需要根据实际情况综合分析 1、关闭系统swap分区(如果未关闭的话) 在Hadoop中,如果使用系统默认设置,会导致swap分区被频繁使用,集群会不断发出警告。 对于每个作业处理...

断臂人 ⋅ 06/07 ⋅ 0

HIVE和HBASE之间,主要的区别是什么?

  【IT168 评论】Apache Hive是一个构建在hadoop基础设施之上的数据仓库。通过Hive可以使用HQL语言查询存放在HDFS上的数据。HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hiv...

中国大数据 ⋅ 05/18 ⋅ 0

八年磨一剑,重新定义HBase——HBase 2.0&阿里云HBase解读

摘要:2018年6月6日,阿里云ApsaraDB for HBase2.0正式发布!从2010年开始“试水”到2018年,拥有了3个PMC,6个Committer,拥有中国最多HBase Committer的公司之一的阿里巴巴是如何八年磨一剑...

Mr_zebra ⋅ 06/13 ⋅ 0

hbase 数据库简介安装与常用命令的使用

一:hbase 简介与架构功能 二:hbase 安装与配置 三:hbase 常见shell 命令操作 一:hbase 简介与架构功能 1.1 为什么要使用hbase 数据库 1.2 hbase 简介: 1.3 HBase与Hadoop的对比 1.4 HB...

flyfish225 ⋅ 04/12 ⋅ 0

普及HBase,阿里云HBase团队在行动

一、HBase的历史由来 HBase是一个开源的非关系型分布式数据库(NoSQL),基于谷歌的BigTable建模,是一个高可靠性、高性能、高伸缩的分布式存储系统,使用HBase技术可在廉价PC Server上搭建起...

所在jason ⋅ 05/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Cube、Cuboid 和 Cube Segment

1.Cube (或Data Cube),即数据立方体,是一种常用于数据分析与索引的技术;它可以对原始数据建立多维度索引。通过 Cube 对数据进行分析,可以大大加快数据的查询效率 2.Cuboid 在 Kylin 中特...

无精疯 ⋅ 34分钟前 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 36分钟前 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 47分钟前 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 49分钟前 ⋅ 0

我的第一篇个人博客

虽然这是个技术博客,但是,我总是想写一些自己的东西,所有就大胆的在这里写下了第一篇非技术博客。技术博客也很久没有更新,个人原因。 以后自己打算在这里写一些非技术博客,可能个人观点...

Mrs_CoCo ⋅ 50分钟前 ⋅ 0

Redis 注册为 Windows 服务

Redis 注册为 Windows 服务 redis 注册为 windows 服务相关命令 注册服务 redis-server.exe –service-install redis.windows.conf 删除服务 redis-server –service-uninstall 启动服务 re......

Os_yxguang ⋅ 50分钟前 ⋅ 0

世界那么大,语言那么多,为什么选择Micropython,它的优势在哪?

最近国内MicroPython风靡程序界,是什么原因导致它这么火呢?是因为他功能强大,遵循Mit协议开源么? 错!因为使用它真的是太舒服了!!! Micropython的由来,这得益于Damien George这位伟大...

bodasisiter ⋅ 54分钟前 ⋅ 0

docker 清理总结

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器(docker rm没有加-f参数,运行中的容器不会删掉) docker rm $(docker ps -a -q) 删除所有未打 dangling 标...

vvx1024 ⋅ 今天 ⋅ 0

关于学习

以前学车的时候,教练说了这样的一句话:如果一个人坐在车上一直学,一直学,反而不如大家轮流着学。因为一个人一直学,就没有给自己留空间来反思和改进。而轮流着学的时候大家下来之后思考上...

mskk ⋅ 今天 ⋅ 0

压缩工具之gzip-bzip2-xz

win下常见压缩工具:rar zip 7z linux下常见压缩工具:zip gz bz2 xz tar.gz tar.bz2 tar.xz gzip 不支持目录压缩 gzip 1.txt #压缩。执行后1.txt消失,生成1.txt.gz压缩文件 gzip -d 1.txt....

ZHENG-JY ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部