草庐IT

Apache Sentry,看这篇就够啦!

无糖薄荷Lianne 2023-03-28 原文
sentry-logo.png

CDH初始提供的权限组件就是Apache Sentry,经典的RBAC模型可以很好的支撑server、database、table等在用户的role和group之间的权限管控,打通了Hive和HDFS,也支持impala的权限识别,基本能满足一个公司70%的使用场景。

但是,

Spark不属于CDH提供的组件之一,也没办法使用原生Sentry进行权限管控。

对于uri的权限存在缺陷,不能直接同步到HDFS上,同时对View的权限也不支持。

于是为了解决这些事,我开始梳理Sentry的设计逻辑,以期满足剩下30%的使用需求。

今天,就从数据库设计开始吧!

以下表述来自Sentry 1.5版本

这是一篇平平无奇的纯干货


库表理解

Sentry的设计逻辑虽然是RBAC的模型,但是为了支撑大数据权限,从内容上,它可以将表大体分为两类:Path和Perm。

  • Path

    即与路径相关,也就是与HDFS路径相关,其相关的表当发生新建、修改、删除路径时会有数据变化

  • Perm

    即与权限相关,涉及Hive、Impala和HDFS等组件的权限,当权限发生变化(只能从Hive端或Impala端进行权限调整)时相关表数据会有变化

接下来,先说下每一张表的结构内涵

AUTH_PATH

  • 用途:记录受权限管控的路径,原生CDH体系中基本都是HDFS路径
  • 从属类别:Path
  • 列释义
    • PATH_ID:路径ID,主键,来自SEQUENCE_TABLE,不过Sentry在这里做了很完善的兼容,如果max(PATH_ID)比SEQUENCE_TABLE中的记录大,那么就直接取max(PATH_ID) + 1,并修改SEQUENCE_TABLE的值。
    • PATH_NAME:路径。有意思的是,这里的路径会做一层清理,开头不是/,或者hdfs://,这样的设计可以兼容云存储的路径(不同的协议,例如cos://等)。
    • AUTHZ_OBJ_ID:外键,AUTHZ_PATHS_MAPPING的主键,用于关联,详细解释可以看下面。

AUTH_PATHS_MAPPING

  • 用途:记录受权限管控的实体和路径之间的关系,这里的实体为Hive元数据库中的database、table等,在这个表里都属于OBJ
  • 从属类别:Path
  • 列释义:
    • AUTHZ_OBJ_ID:受权限管控的实体主键。与上面的PATH_ID一样,也是来自SEQUENCE_TABLE
    • AUTHZ_OBJ_NAME:实体名称,例如库名、表名等。有意思的是,视图是虚拟表,在Sentry中会认为是Table类型(与物理表类型一样,但是它没有对应的PATH)
    • CREATE_TIME_MS:创建时间
    • AUTHZ_SNAPSHOT_ID:外键,快照ID,AUTHZ_PATHS_SNAPSHOT_ID的主键。这是整个Sentry一致性保证的核心,详情以后会详述。

AUTH_PATHS_SNAPSHOT_ID

  • 用途:快照记录。快照是个非常哇塞的设定。
  • 从属类别:Path
  • 列释义:
    • AUTHZ_SNAPSHOT_ID:快照ID,就一列,每次递增1,初始是0。

SENTRY_DB_PRIVILEGE

  • 用途:库表结构相关权限记录。使用Hive的权限数据都在这上面。权限包括具体的操作和目标实体。如果是一个目标实体的多个操作权限,那就是多行。
  • 从属类别:Perm
  • 列释义:
    • DB_PRIVILEGE_ID:权限ID,主键,也是来自SEQUENCE_TABLE
    • PRIVILEGE_SCOPE:权限范围,例如server(集群范围),database(库范围),table(表范围)等
    • SERVER_NAME:集群名称
    • DB_NAME:库名称
    • TABLE_NAME:表名称,上面提到过,视图view在这里也会被当作表,其权限范围也是Table。如果是库范围,这里会填写*,代表所有表。下面的列名称同样的道理。
    • COLUMN_NAME:列名称
    • URI:路径名称。但是Sentry这里的路径不会同步给HDFS,所以如果想要直接通过Hive给某个HDFS路径授权是做不到的。至少原生的Sentry做不到。
    • ACTION:操作。包括select,all等
    • CREATE_TIME:创建时间
    • WITH_GRANT_OPTION:true/false,拥有该实体的权限是否同时拥有对该实体授权的权限,(管理员角色会跳过这个判断,设置管理员角色在Sentry的配置文件中或CDH的配置中)。绝大部分情况下是false,因为会使用统一的管理员账户进行授权,而不会把单独实体的权限下放到其他角色中。

SENTRY_GM_PRIVILEGE

  • 用途:GM是Generic Model的缩写,说白了就是通用权限模型。SENTRY_DB_PRIVILEGE模型是典型的为Hadoop生态定制的,支持权限实体层级从Server开始细化到Column,还能支持Uri,但很明显,这样的体系结构在其他引擎中并非通用。GM就是为了适配更常用的实体模型而设计的,更符合RBAC的设计理念。他的主要设计就是预定义resource0-3,代表实体的四个层级,(在sentry1.5版本最多支持4个层级)。当然这样的设计在现在看来还有优化空间,但是对于其他引擎的对接,这样的设计使用还是够的。
  • 从属类别:Perm
  • 列释义:
    • GM_PRIVILEGE_ID:权限id
    • ACTION:操作
    • COMPONENT_NAME:组件名称,Service的下一层级,服务内的组件名称
    • CREATE_TIME:创建时间
    • WITH_GRANT_OPTION:
    • RESOURCE_NAME_0:受权限管控的第一层级资源名称
    • RESOURCE_NAME_1:第二层级
    • RESOURCE_NAME_2:第三层级
    • RESOURCE_NAME_3:第四层级
    • RESOURCE_TYPE_0:受权限管控的第一层级资源的类型
    • RESOURCE_TYPE_1:第二层级
    • RESOURCE_TYPE_2:第三层级
    • RESOURCE_TYPE_3:第四层级
    • SCOPE:权限范围,默认都是Service范围,从这里就可以看出DB那张表是做了定制化设计的,通用的干脆先都写成最外层限制,具体的根据resource填写的判断
    • SERVICE_NAME:需要管控的服务名称,应该是为了兼容不同引擎组件共用sentry做权限管控而设计的

SENTRY_GROUP

  • 用途:group信息,对应HDFS上面的Group
  • Perm
  • 列释义:
    • GROUP_ID:group主键
    • GROUP_NAME:group名称
    • CREATE_TIME:创建时间

SENTRY_HMS_NOTIFICATION_ID

  • 用途:对接Hive Metastore(HMS)的event_id,用这个id保持与HMS内信息的一致。这个逻辑与刚刚那个快照一样哇塞,下篇文章详细描述下如何哇塞。
  • 从属类别:Path & Perm(不管啥玩意儿变,它都会跟着变)
  • 列释义:
    • NOTIFICATION_ID:对标HMS的event_id,代表当前的最新事件编号。数字是一直累加的,不会后退。Sentry Server和Sentry Plugin也都持有上一次的NOTIFICATION_ID,随时和库里的做对比进行检测。如果不同就触发更新。

SENTRY_PATH_CHANGE

  • 用途:PATH更改事件记录。其中,包括创建路径(创建库、表),删除路径(删除库、表),修改路径等都会生成事件,记录在这个表中。HDFS读取更新的事件就是从这张表读取。
  • 从属类别:Path
  • 列释义:
    • CHANGE_ID:主键,递增。(Sentry的表设计并没有使用MySQL的auto_increment,也就是由server自己控制自增处理,个人盲猜原因之一是因为这个项目的启动时间还是分布式刚开始兴起的时候,使用单机的思路来做的处理。这里给我们后续做自定义补充开发造成了很大的麻烦)
    • NOTIFICATION_HASH:上面那个NOTIFICATION_ID的hash结果,反正也是唯一值,从实际上来看既没有被用作校验,也没有被用作实际权限内容,甚至可以直接用Java的UUID来代替。只要在表里是唯一的就行。
    • CREATE_TIME_MS:创建时间
    • PATH_CHANGE:Sentry内部定义的结构,用于和HDFS上的Sentry Plugin进行内容的交互。Path改变的信息(增加或删除)以及这次改变对应的Notification_id会被按照一种格式(类似于json,但是要复杂很多)组装到这里;Sentry Plugin从这里取到后,解析出来,翻译成HDFS的POXIS权限保存在NAMENODE的内存中,用于路径使用的权限控制。有空单独写一篇文章梳理一下这个结构。

SENTRY_PERM_CHANGE

  • 用途:从表名上看就能知晓,这是与上面的SENTRY_PATH_CHANGE表核心逻辑是一样的。当权限相关的信息存在修改时,例如授权,或者回收权限等,这里都会新增一条记录。
  • 从属类别:Perm
  • 列释义:
    • CHANGE_ID:主键,递增。
    • CREATE_TIME_MS:创建时间。
    • PATH_CHANGE:权限的修改伴随着对应HDFS目录权限的修改和调整,这里的记录就是这些内容。

SENTRY_ROLE

  • 用途:顾名思义,角色表。
  • 从属类别:Perm
  • 列释义:
    • ROLE_ID:角色id
    • ROLE_NAME:角色名称。
    • CREATE_TIME:创建时间。

SENTRY_ROLE_DB_PRIVILEGE_MAP

  • 用途:角色和权限信息的关联表,就是n:n的两个表之间,使用id对接的那个表。
  • 从属类别:Perm
  • 列释义:
    • ROLE_ID:角色id
    • DB_PRIVILEGE_ID:权限id,SENTRY_DB_PRIVILEGE的主键。
    • GRANTOR_PRINCIPAL:授权方。也是角色名称。

SENTRY_ROLE_GM_PRIVILEGE_MAP

  • 用途:与上面类似,角色和通用模型权限的关联表。
  • 从属类别:Perm
  • 列释义:
    • ROLE_ID:角色id
    • GM_PRIVILEGE_ID:权限id

SENTRY_ROLE_GROUP_MAP

  • 用途:角色和组之间的关联表,俩n:n表之间,id对接的那个表
  • 从属类别:Perm
  • 列释义:
    • ROLE_ID:角色id
    • GROUP_ID:组id
    • GRANTOR_PRINCIPAL:授权的角色名称。从这个设计上看,这个表应该也是围绕Hadoop生态体系定制的。

SENTRY_USER

  • 用途:用户元信息。
  • 从属类别:Perm
  • 列释义:
    • USER_ID:用户id
    • USER_NAME:用户名
    • CREATE_TIME:创建时间。

SENTRY_USER_DB_PRIVILEGE_MAP

  • 用途:顾名思义,用户权限关联表。
  • 从属类别:Perm
  • 列释义:
    • USER_ID:用户id
    • DB_PRIVILEGE_ID:权限id,表SENTRY_DB_PRIVILEGE的主键。
    • GRANTOR_PRINCIPAL:授权的用户名。

SENTRY_VERSION

  • 用途:Sentry的版本信息表。没什么实际意义,毕竟许多apache的项目都会设计这样的表用于从元数据层记录服务的版本号等信息,另一方面,如果涉及不同版本服务共用这一套元数据库,这里将记录多条信息。
  • 从属类别:common(公用)
  • 列释义:
    • VER_ID:Sentry安装版本
    • SCHEMA_VERSION:版本
    • VERSION_COMMENT:备注

SEQUENCE_TABLE

  • 用途:非常神奇的定义了多个上述表的下一个主键。应该是为了用于高可用部署下的id递增唯一性。从代码上来看,除了这里有记录,每一个Sentry Server中也有内存记录,这个记录会按照某一个频率(一般好像是0.5s,具体有配置处理)刷新读取当前目标表的主键,在具体插入时会和这张表的信息,以及目标表的主键做对比处理,最终取最大值。
  • 从属类别:common(公用)
  • 列释义:
    • SEQUENCE_NAME:部分表对应的类信息。举例子而言,org.apache.sentry.provider.db.service.model.MPath对应的是AUTH_PATH表的主键
    • NEXT_VAL:下一个主键id,一般就是对应表的当前最大主键id+1

打算认真写一些文章了,纯原创,转载需标注哦~
掘金号:无糖薄荷

有关Apache Sentry,看这篇就够啦!的更多相关文章

  1. 【保姆级】python最新版3.11.1开发环境搭建,看这一篇就够了 - 2

    【保姆级】Python最新版开发环境搭建,看这一篇就够了(适用于Python3.11.2安装)文章目录【保姆级】Python最新版开发环境搭建,看这一篇就够了(适用于Python3.11.2安装)一、Python解释器安装Windows安装步骤环境变量配置(非必要)MacOS安装步骤Linux安装步骤二、PyCharm安装三、创建Python工程工欲善其事必先利其器,在使用Python开发程序之前,在计算机上搭建Python开发环境是必不可少的环节,目前Python最新稳定版本是3.11.1,且支持到2027年,如下图所示本文手把手带你从0到1搭建Python最新版3.11.1开发环境,堪称保

  2. 接口测试重点内容看这一篇就够了 - 2

    1、接口的概念系统与系统之间,组件与组件之间,数据传递交互的通道2、接口的类型按协议划分:http、tcp、IP按语言划分:C++、java、PHP……按范围划分:系统之间多个内部系统之间内部系统与外部系统之间程序之间方法与方法之间、函数与函数之间、模块与模块之间3、接口测试的概念对系统或组件之间的接口进行测试,校验传递的数据正确性和逻辑依赖关系的正确行。4、接口测试的原理主要针对服务器,模拟客户端向服务器发送请求,通过工具或者代码来测试服务器针对客户端请求回发的响应数据是否与预期结果一致。5、接口测试的特点符合质量控制前移的理念可以发现一些页面操作发现不了的问题接口测试低成本高效益接口测试是

  3. 零基础学Linux运维,看这一篇就够了(含30G自学教程笔记) - 2

    作为一个10年老运维,在开始这篇文章之前,先送给大家一句话:干啥不好,非要做运维,听人劝,吃饱饭,趁年轻,换行吧!好了,不开玩笑了,回到正文中来。当谈到运维职业发展情况时,很多人都会说运维做不长久,然后劝人做两年就赶快转研发吧!总之是全面唱衰运维!但作为一个老运维,我想说的是:运维转开发确实是一个不错的选择,但运维做不长久则完全是对运维的偏见了!很多人有运维做不长久的偏见的原因其实和运维职业的特性有关,运维有三个老生常谈的特点:打杂,背锅,睡的少!说运维打杂,是说运维工作比较宽泛,运维职业门槛不高,什么都得会一点。公司里但凡跟计算机有关的事,可能都会找到运维,这就导致了运维工作比较杂!至于背黑

  4. 必看新手教程!一篇就够!pycharm链接云服务器--yolov5 yolov7训练自己的数据集(矩池云) - 2

    趁着寒假期间稍微尝试跑了一下yolov5和yolov7的代码,由于自己用的笔记本没有独显,台式机虽有独显但用起来并不顺利,所以选择了租云服务器的方式,选择的平台是矩池云(价格合理,操作便捷)需要特别指出的是,如果需要用pycharm链接云服务器训练,必须要使用pycharm的专业版而不是社区版,专业版可以使用SSH服务连接云服务器。关于专业版的获取,据我所知一是可以买,二是如果你是在校大学生,可以用学生证向JetBrain申请专业版使用权,我就是通过这种方式激活专业版账户的,我记得当时两三天官方就发激活邮件了,还是很人性化的,使用期一年。下面开始正题本教程只涉及将yolov5及yolov7跑通

  5. 看完这篇,我不允许你还不会用Allegro显示PCB的3D模式 - 2

    看完这篇,我不允许你还不会用Allegro显示PCB的3D模式Allegro可以显示PCB的3D效果,利于查看和检查,如下图具体操作如下选择Set-up-userpreferences选择Display

  6. cmake使用详细教程(日常使用这一篇就足够了) - 2

    目录一、cmake安装二、使用cmake来配合程序的编译一、只有一个源文件的程序编译二、同一目录下多个源文件三、同一目录下很多源文件四、头文件在别的文件夹五、头文件源文件分离,并含有多个文件夹六、生成动态库和静态库七、链接库文件 八、CMake其他功能一、添加编译选项操作系统:CentOS7GUNmake版本:3.82gcc版本:8.3.1参考:CMakeLists.txt基础操作一、cmake安装1、在官网下载cmake的安装包,这里我下载的是v3.26wgethttps://github.com/Kitware/CMake/releases/download/v3.26.0-rc4/cma

  7. python继承,看这篇就够了 - 2

    前言说到面向对象,大家都不陌生。在python中,一切皆对象,我们使用类来表示具有相同属性和方法的对象的集合。而继承则是一种创建新类的方式,这个新类可以使用被继承类的属性。今天就来说说python中的继承。继承的概念继承用于类的创建上,新创建的叫子类,而被继承的叫做父类。子类可以使用父类属性,继承是描述类与类之间的关系。为什么要用继承呢?因为继承可以减少代码的冗余以及提高代码的重用性。我们在工作中,用到继承的地方很多。继承的种类python里继承总共有单继承、多继承和多层继承。单继承单继承指的是子类只继承一个父类。示例:classA():def__init__(self):self.a='a'

  8. 【多线程基础】 线程安全及解决方案(看这一篇就够了) - 2

    🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!欢迎志同道合的朋友一起加油喔🦾🦾🦾目录前言1.造成线程不安全的原因有哪些呢?1.1什么是原子性1.2什么是内存可见性1.3共享变量可见性实现的原理 1.4什么是指令重排序2.解决线程安全问题2.1引入关键字synchronized解决线程不安全问题(1) synchronized的使用方法(锁)(2)synchronized的作用 (3)优化后的代码(加锁后)2.2.关于锁/同步监视器的总结(重点掌握):总结1:认识同步监视器(锁) ----- synchronized(同步监视器){}总结2:同步代码块的执行过程(重点理解)总结

  9. 外网SSH远程连接linux服务器,看这一篇就够了 - 2

    文章目录视频教程1.LinuxCentOS安装cpolar2.创建TCP隧道3.随机地址公网远程连接4.固定TCP地址5.使用固定公网TCP地址SSH远程转载自内网穿透工具的文章:无公网IP,SSH远程连接LinuxCentOS服务器【内网穿透】本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的LinuxCentOS服务器,无需公网IP,也不需要设置路由器。视频教程公网SSH远程LinuxCentOS服务器【内网穿透】1.LinuxCentOS安装cpolarcpolar官网:https://www.cpolar.com/cpolar支持一键自动安装脚本cpolar安装(国内使用

  10. 【计网入门就看这篇】从零开始的计网学习——物理层(考研人福利) - 2

    从零开始的计网学习——第2章物理层(考研人福利)今天开始步入CS,今天干了一万字的学习笔记!!!物理层的方方面面,今天必须安排到位,GOGOGOGO!!!🌟前言Wassupguys,我是上火不找我😎今天是从零开始的计网学习!Let’sgetit!文章目录从零开始的计网学习——第2章物理层(考研人福利)前言2.1、物理层的基本概念2.1.1、物理层的四个特性2.2、数据通信的基础知识2.2.1数据通讯的相关术语:数据、信号、信源、信宿、信道2.2.2编码与调制2.2.3奈氏准则和香农定理2.2.4传输方式2.3、传输介质及物理设备2.3.1.思维导图2.3.2.传输介质及其分类2.3.3.导向性

随机推荐