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

HiveServer2HA安全架构

赴海獨漂櫓,白首度餘生。—木心JustForM前言为了梳理apachesentry_1.5.0开启hdfssync功能后不再支持hs2的MetastoreHA的原因,最近把�Hiv

赴海獨漂櫓,白首度餘生。 — 木心
Just For M

前言

为了梳理 apache sentry_1.5.0 开启 hdfs sync 功能后 不再支持hs2的Metastore HA 的原因,最近把HiveServer2 的部署架构梳理了一遍,网上针对该类信息的文章也非常少,特地在这里整理出来,以供大家讨论。

先描述一下我们的 HiveServer2 的部署背景,我们的大数据平台是CDH, 整个平台使用 KERBEROS 来进行身份验证,权限控制使用的是 Sentry + Acls, 我们的 HiveServer2 服务使用 LDAP 或者 KERBEROS 来对用户进行身份验证,实际上开启 LDAP 验证的 HiveServer2 也是可以进行 KERBEROS 验证的,但是 hive on spark 这个功能的开启,导致了 HiveServer2 必须是 KERBEROS 验证的(他们使用了一个相同的config来进行判断提交任务是否需要 KERBEROS)。

一般情况下部署 HiveServer2 ,大家应该很熟悉。Metastore 可以选择是 内嵌 还是 单独部署,为了保证服务的高可用性(HA),我们可能会部署多台 HiveServer2 以及 多台 Metastore,他们也起到了负载均衡的效果。而在安全的情况下,配置的时候需要些许注意,而 HiveServer2 内部也会多执行一些东西来保证认证安全,下面我们所要讲的就是这些流程。

HiveServer2

《HiveServer2-HA-安全架构》 image.png

图例展示了一个通用的部署模式: HiveServer2 多台,Metastore 多台,使用 mysql 等关系型数据库来保存元数据信息。 HiveServer2 如果需要修改元数据信息,会将请求发送到 Metastore
HiveServer2 使用 Thrift 来进行通信, 用户使用 jdbc 或者 Thrift 连接到 HiveServer2; HiveServer2 每个执行线程如果需要与后面的 Metastore 通信也是使用 Thrift 连接。

ThrfitSasl

看过 kerberos体系下的应用(yarn,spark on yarn) 的用户可能已经对 ThrfitSasl 连接方式了解了,我们这里将描述一下通信过程:

《HiveServer2-HA-安全架构》 image.png

  • 我们的 ThrfitSasl 接受两种验证, KERBEROS 认证以及由自己下发给客户端的 Token;
  • Token 认证是有时效性的,有最大刷新时间和失效时间。
  • 关于Token认证,如果大家对 HDFS 里面NameNodeDataNode 里面的 Token 的逻辑有所耳闻,阅读 HiveServer2 Token逻辑,会感觉似曾相识,是的,hive里面的相关逻辑是借鉴 hadoop-common

    让我们对其中的细节再深入思考一下。

KERBEROS认证

《HiveServer2-HA-安全架构》 image.png

  • 如果 conf 没有 hive.metastore.token.signature ,选择kerberos认证方式,创建SaslClient的实现类GssKrb5Client用于与 SaslServer 通信。
  • hive.server2.enable.doAsfalse 的服务,均使用kerberos认证,因为我们的平台使用 sentry 来做权限管理,所以是不允许 doAs 操作的,提交任务的用户均为hive 用户。
  • 这意味着运行SaslClient端的服务上 UGI 要不断更新,保持自己的
    tgt
  • 关于 javax.security.sasl 实现的逻辑,这里不扩展了,有兴趣的可以查阅资料,后面有机会会专门分析。
Token认证

想一想,如果我们要效仿HDFSDelegation Token逻辑,在实现上我们需要什么?

  • 首先服务端要能够生成有时效性的Token,并且有能判断Token是否过期的能力。
  • 因为需要沿用hadoop-common中的token的数据结构,我们返回的 Token 的格式应该是继承自 AbstractDelegationTokenIdentifier。 在Hive中,这个类型为DelegationTokenIdentifier,其中KindName标示为 HIVE_DELEGATION_KIND
  • 返回的Token 将由UGI统一管理:ugi.addToken(delegationToken)
  • 我们知道UGI可能同时管理访问不同组件的多个Token,所以我们还应该有个选择HIVE_DELEGATION_KIND的选择器:DelegationTokenSelector, 有了它,我们在创建 SaslClient的时候可以获得对应的Token:

《HiveServer2-HA-安全架构》 image.png
《HiveServer2-HA-安全架构》 image.png

上述应该是使用 Token 认证的各个部分的注意事项。

Token认证-服务端

服务端(e.g: Metastore)使用 HiveDelegationTokenManager 来进行Token管理。类中主要包含了一个继承自hadoop-common AbstractDelegationTokenSecretManagerTokenStoreDelegationTokenSecretManager,也是我们这节探讨的重点。

  • Token生成

    • 客户端申请一个Token使用,服务端收到get_delegation_token请求时候(这次通信是kerberos认证的),调用TokenStoreDelegationTokenSecretManager方法 getDelegationToken

      《HiveServer2-HA-安全架构》 image.png

    • TokenStoreDelegationTokenSecretManager 返回 Token,并且使用自己的 createPassword 方法为这个Token生成密码。除了照搬hadoop-common里面的记录Token的生命周期外,还额外的调用了tokenStore.addToken将我们的token信息保存进了DelegationTokenStore中。

      《HiveServer2-HA-安全架构》 image.png

  • Token认证

    • 服务端认证调用 SaslDigestCallbackHandler回调方法,从nc中拿到客户端传递过来的DelegationTokenIdentifier,在getPassword一步,服务端将做两部验证,第一,这个Token是否存在;第二,这个Token是否过期。如果验证合格,则处理业务。

      《HiveServer2-HA-安全架构》 image.png 《HiveServer2-HA-安全架构》 image.png

  • Token清理

    • 因为引入了额外的存储方式 DelegationTokenStore, 为了防止存储数据无限膨胀,我们需要定时对服务端过期的Token进行remove。

      《HiveServer2-HA-安全架构》 image.png
      《HiveServer2-HA-安全架构》 image.png

Token认证-DelegationTokenStore

Metastore提供三种存储方式:

  • MemoryTokenStore
  • DBTokenStore
  • ZooKeeperTokenStore

第一种是内存,这里不做解读,对于后两者,为什么 Metastore 要把这部分数据统一持久化呢?我们持久化的是什么信息?我们持久化的大部分是可以使用的Token,当验证Token认证的客户端的时候将时候到这部分信息。

如果我们部署了多台Metastore, HiveServer2 随机选择一台进行连接操作,如果我们打开了doAs,那么我们业务线程连接Metastore将使用Token认证。这个时候我们已经连接的Metastore突然挂掉,客户端重连到了另外一台Metastore上去,因为我们知道Metastore是无状态的,所以重连到新的机器上不影响业务数据。但是新的Metastore如果认证这个Token? 是的!! 因为它们的所有Metastore 所有的Token信息都是共享的,新的Metastore 轻而易举的就通过了重连的客户端认证。

总结

读完全文之后,希望读者重新查看本文的HiveServer2-HA-架构图,其实想表达的逻辑都在图中。这里需要重点注意的是,我们在部署 Metastore HA后,如果开启了Token认证,请务必使用DBTokenStore或者ZooKeeperTokenStore,否则HiveServer2Metastore 的断开重连对用户不透明。但是如果只会使用KERBEROS认证,则不会存在Token共享问题。


推荐阅读
  • ZeroMQ在云计算环境下的高效消息传递库第四章学习心得
    本章节深入探讨了ZeroMQ在云计算环境中的高效消息传递机制,涵盖客户端请求-响应模式、最近最少使用(LRU)队列、心跳检测、面向服务的队列、基于磁盘的离线队列以及主从备份服务等关键技术。此外,还介绍了无中间件的请求-响应架构,强调了这些技术在提升系统性能和可靠性方面的应用价值。个人理解方面,ZeroMQ通过这些机制有效解决了分布式系统中常见的通信延迟和数据一致性问题。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 在前一篇文章《Hadoop》系列之“踽踽独行”(二)中,我们详细探讨了云计算的核心概念。本章将重点转向物联网技术,全面解析其基本原理、应用场景及未来发展前景。通过深入分析物联网的架构和技术栈,我们将揭示其在智能城市、工业自动化和智能家居等领域的广泛应用潜力。此外,还将讨论物联网面临的挑战,如数据安全和隐私保护等问题,并展望其在未来技术融合中的重要角色。 ... [详细]
  • 字节跳动深圳研发中心安全业务团队正在火热招募人才! ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 本文通过思维导图的形式,深入解析了大型网站技术架构的核心原理与实际案例。首先,探讨了大型网站架构的演化过程,从单体应用到分布式系统的转变,以及各阶段的关键技术和挑战。接着,详细分析了常见的大型网站架构模式,包括负载均衡、缓存机制、数据库设计等,并结合具体案例进行说明。这些内容不仅有助于理解大型网站的技术实现,还能为实际项目提供宝贵的参考。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有