Hadoop源码解析之: HBase Security
- 第一部分:HBase Security 概述
- 第二部分:若干重要细节
<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. 表的owner,也就是建表账户将自动拥有对该表的所有操作权限:RWXCA. 参见方法:
org.apache.hadoop.hbase.security.access.RowBasedAccessController.postCreateTable(...)
4. 用户或组的权限可以指定到 <table> <column family> <column qualifier> 三种不同的层次(粒度)上. 通过试验表明, 下层权限会自动继承上层权限!,.如给一个sample表R的权限,column family:cf也是R的权限,而qualifier:q是W的权限,那么用户即能读取也能写入cf:q.
5. 紧接第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才会通过检查,否则就被过滤掉。
6. Permission的Class Hierarchy:
Permission (包含了Action)
|
|--TablePermission (又包含了table,family,qualifier)
|
|--UserPermission(又包含了user)
7. 关于 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)
8. 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数据!
9. 关于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实例.
Hadoop源码解析之: HBase Security的更多相关文章
- Hadoop源码解析之: TextInputFormat如何处理跨split的行
我们知道hadoop将数据给到map进行处理前会使用InputFormat对数据进行两方面的预处理: 对输入数据进行切分,生成一组split,一个split会分发给一个mapper进行处理. 针对每个 ...
- Hadoop源码解析 1 --- Hadoop工程包架构解析
1 Hadoop中各工程包依赖简述 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster: http:// ...
- Hadoop源码解析之 rpc通信 client到server通信
rpc是Hadoop分布式底层通信的基础,无论是client和namenode,namenode和datanode,以及yarn新框架之间的通信模式等等都是采用的rpc方式. 下面我们来概要分析一下H ...
- Spring Security 访问控制 源码解析
上篇 Spring Security 登录校验 源码解析 分析了使用Spring Security时用户登录时验证并返回token过程,本篇分析下用户带token访问时,如何验证用户登录状态及权限问 ...
- Spring Security 解析(七) —— Spring Security Oauth2 源码解析
Spring Security 解析(七) -- Spring Security Oauth2 源码解析 在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因 ...
- Spring Security源码解析一:UsernamePasswordAuthenticationFilter之登录流程
一.前言 spring security安全框架作为spring系列组件中的一个,被广泛的运用在各项目中,那么spring security在程序中的工作流程是个什么样的呢,它是如何进行一系列的鉴权和 ...
- zookeeper集群搭建及Leader选举算法源码解析
第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...
- Flink 源码解析 —— 源码编译运行
更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ...
- Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?
前言 如今,许多用于分析大型数据集的开源系统都是用 Java 或者是基于 JVM 的编程语言实现的.最着名的例子是 Apache Hadoop,还有较新的框架,如 Apache Spark.Apach ...
随机推荐
- windows 基于命令行制作vhd虚拟磁盘
什么是VHD? VHD是Virtual Hard Disk的简称,就是虚拟硬盘,就是能把VHD文件直接虚拟成一个硬盘,在其中能像真实硬盘一样操作,读取.写入.创建分区.格式化.如果你用过虚拟机,就会知 ...
- poj 2411 新写法
别以为我在刷水题.... 今天做了场srm,500pt想到了是dp但是无从下手,但是看了rng_58的神代码后顿觉海阔天空啊(盯着看了一个下午),相比于一年前的写法,真的是不忍直视啊, TC真是个好地 ...
- Yii2 框架下bootstrap 弹窗预览视频等~
Yii2 本身已经引用了'yii\bootstrap\BootstrapAsset',所以使用bootstrap 非常简洁. 1 在PHP页面引用命名空间 use app\assets\AppAsse ...
- 我的Android进阶之旅------>Android服务的生命周期回调方法
先引用一段官网上的文字 ======================================================================================== ...
- Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式
tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态. ...
- Android设置背景
一.设置图片背景 首先你先将一个的背景图片存入工程中res/drawble(当然drawble-hdpi.drawble-mdpi.drawble-ldpi中一个或者几个文件夹都可)文件夹中.假如我存 ...
- Node.js 入门教程和学习资源汇总
这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...
- Integer to Roman(JAVA)
public String intToRoman(int num) { int[] values={1000,900,500,400,100,90,50,40,10,9,5,4,1}; String[ ...
- Sql中的Exists和in
最近学习数据库的分页算法,提到第一种 SELECT TOP 页大小 *FROM table1WHERE id NOT IN ( SELECT TOP 页大小*(页数 ...
- SharePoint各版本信息
参考网页http://blogs.msdn.com/b/erica/archive/2013/05/30/sharepoint-server-2010-version-reference.aspx