热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hive系列(一)metastore的认证和授权

2019独角兽企业重金招聘Python工程师标准>>> Hive系列(一)metastore的认证和授权

1 Hive系列目录
  • Metastore认证和验权
  • HiveServer2认证和验权
  • sentry的权限设计
  • HiveServer2接入sentry后的认证和验权
  • Metastore接入sentry后的认证和验权
  • HiveServer2 thrift服务详细分析
2 Metastore

2.1 Metastore服务介绍

metastore主要维护2种数据:

  • 数据库、表、分区等数据,算是DDL操作
  • 权限、角色类的数据,算是DCL操作

metastore通过开启thrift rpc服务,开启对上述2种数据的操作接口,接口即 ThriftHiveMetastore.Iface 内容见下图

第一种数据的操作如下:

Hive系列(一)metastore的认证和授权

第二种数据的操作如下:

Hive系列(一)metastore的认证和授权

metastore对该接口的实现为:HMSHandler,它主要有以下属性:

  • ThreadLocal threadLocalMS

    RawStore主要用于和数据库打交道,存储上述2种相关数据,RawStore和当前线程进行绑定,默认实现是ObjectStore

  • List preListeners

    当上述2种数据将要发生变化的时候,都会首先调用上述MetaStorePreEventListener执行一些预处理操作,如验证一个用户是否有权限来执行该操作

  • List listeners

    当上述第一种数据发生变化后,会调用上述MetaStoreEventListener执行一些处理

2.2 Metastore服务的认证和验权

由上述可以了解到,在metastore的数据发生修改之前可以进行验权操作,hive默认提供了一个AuthorizationPreEventListener实现了上述MetaStorePreEventListener接口执行一些验权操作

Hive系列(一)metastore的认证和授权

从上面可以看到,仅仅对DDL操作进行了验权,并没有对DCL操作进行验权,这也是一个比较奇怪的地方。即如果你能直连到metastore服务,就可以随意的进行授权操作。

接下来我们详细看看这个认证和授权的过程

涉及到2个接口:

  • HiveMetastoreAuthenticationProvider:认证提供者,用于用户的认证,一个HiveMetastoreAuthenticationProvider对象对应一个用户,该对象包含用户的userName和groups信息

  • HiveMetastoreAuthorizationProvider:授权提供者,用于用户的验权

下面分别来详细说明

2.2.1 Metastore服务的认证

上述HiveMetastoreAuthenticationProvider的默认实现是HadoopDefaultMetastoreAuthenticator,通过hadoop中的UserGroupInformation来获取当前用户名和组的信息,如下所示

Hive系列(一)metastore的认证和授权

metastore的client端用户是如何被传递到这里的呢?

这就涉及到了metastore开启的thrift rpc服务了,metastore使用的是thrift的TThreadPoolServer来作为server。这种模式下,会启动一个线程池,每来一个客户端连接就取出一个线程来专门处理该连接,该连接就一直占用该线程了,这种方式就是传统的BIO方式,能够支持的并发量比较小。

metastore开启的rpc服务分成3种类型:

  • 使用sasl方式: 是一种安全的方式,使用kerberos认证用户的身份,这一部分内容比较多,可能之后再详细分析这一块。

  • setUgi方式:

    是一种非安全的方式,即并没有对用户的身份进行合法性验证。当hive.metastore.execute.setugi=true时即采用这种模式。这种模式下如下操作:

    • client端会通过set_ugi方法来向服务器端传递用户的ugi信息

    • 服务器端将用户的ugi信息绑定到当前连接上

    • client端向服务器端发送操作数据的请求,服务器端取出连接中的ugi信息,使用ugi的doas方法来执行操作

    • client占用服务器端的一个线程,会创建出一个HiveMetastoreAuthenticationProvider对象,该对象在创建过程中要获取当前的ugi信息,即获取到上述ugi信息,并且把client的上述HiveMetastoreAuthenticationProvider对象绑定在该线程中,至此便可以得到client的用户信息。而groups信息则是通过hadoop默认的方式即获取本metastore服务所在的机器上,该用户所属的groups信息。

  • 其他:

    就仅仅是将client的ip绑定到当前线程上,就没有所谓的用户信息了

上述的sasl也是通过ugi.doas方式来供后续获取用户信息的,但是sasl多了用户身份合法性的验证过程。而setUgi方式client端传过来什么用户就认为是什么用户,所以只有sasl方式才是安全的方式,其他2种是非安全方式。

2.2.2 Metastore服务的验权

上一部分我们获取到了用户信息,下面就是要验证用户是否有权限执行相关操作,验权接口就是HiveMetastoreAuthorizationProvider,实现类如下:

Hive系列(一)metastore的认证和授权

默认是DefaultHiveMetastoreAuthorizationProvider。

  • DefaultHiveMetastoreAuthorizationProvider:

    根据userName和groups信息从数据库中获取权限信息来验证用户是否有权限

  • StorageBasedAuthorizationProvider:

    判断一个用户是否对数据库、表等是否有权限依据该用户在HDFS上对这些文件是否有对应的权限

3 总结

总结如下:

  • metastore只做了DDL操作的相关认证,并没有做DCL操作的认证,一旦通过hive cli连接metastore,用户就可以随意进行赋权操作

  • 根据用户和用户所属的groups信息来获取权限,大数据系统中用户和groups关系的维护最好是自己统一维护,而不是借助默认的linux机器上用户和groups的关系,不然之后会有很多麻烦的。

画了一个默认情况下简单的示意图如下:

Hive系列(一)metastore的认证和授权

4 结束语

本篇简单介绍了metastore端的认证和授权,下一篇就再介绍下HiveServer2的认证和授权

转载于:https://my.oschina.net/pingpangkuangmo/blog/693973


推荐阅读
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
author-avatar
我爱板材_527
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有