HiveServer2-HA-安全架构

赴海獨漂櫓,白首度餘生。 -- 木心
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

image.png

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

ThrfitSasl

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

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

    让我们对其中的细节再深入思考一下。
KERBEROS认证
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:
image.png
image.png

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

Token认证-服务端

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

  • Token生成

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

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

      image.png
  • Token认证

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

      image.png
      image.png
  • Token清理

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

      image.png

      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共享问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容