Delegation Token

Hadoop DelegationTokens详解:原理、应用与NameNode实现

Hadoop最初的实现中并没有认证机制,这意味着存储在Hadoop中的数据很容易泄露。在2010年,安全特性被加入Hadoop(HADOOP-4487),主要实现下面两个目标:

  1. 拒绝未授权的操作访问HDFS中的数据。
  2. 在实现1的基础上,避免太大的性能损耗。
    为了实现第一个目标,我们需要保证:
  3. 任何一个客户端要访问集群必须要经过认证,以确保它就是自己声称的身份。
  4. 集群中任何服务器,需要被认证为集群中的一部分。其它的机制,如:Delegation Token, Block Access Token, Trust等被加入当做Kerberos的补充。特别是Delegation Token机制被引入。下图简要描述了Kerberos and Delegation Tokens在HDFS中应用
    在这里插入图片描述
    在上面的样例中,会涉及到下面几条认证流程
  5. 用户(joe)利用Kerberos来访问NameNode。
  6. 用户(joe)提交的分布式任务用joe的Delegation Tokens来访问NameNode。这是本文接下来的重点。
  7. HDFS中的DataNode通过Kerberos和NameNode进行交互。
  8. 用户及其提交的任务通过Block Access Tokens来访问DataNodes。

为什么要用delegation token

理论上,虽然可以只使用Kerberos实现认证机制,但这会有一定问题,尤其是应用在像Hadoop这样的分布式系统中。想像一下,对于每个MapReduce任务,如果所有的任务都需要使用TGT (Ticket Granting Ticket)通过Kerberos来进行认证,KDC(Kerberos Key Distribution Center)将很快成为系统瓶颈。下图中的红线说明该问题:一个任务中可能涉及到成千个节点之间的通信,从而导致KDC网络拥堵。事实上,如果集群规模较大,这无意间就对KDC执行了一次DDos(distributed denial of service attack)攻击。
在这里插入图片描述
因此,Delegation Tokens作为Kerberos的一个补充,实现了一种轻量级的认证机制。Kerberos是三方认证协议,而Delegation Tokens只涉及到两方。
Delegation Tokens的认证过程如下:

  1. client通过Kerberos与Server完成认证,并从server获取相应的Delegation Tokens;
  2. client与server之间后续的认证都是通过Delegation Tokens,而不进过Kerberos。
    client可以把Delegation Tokens传递给其它的服务(如:YARN),如此一来,这些服务(如:MapReduce任务)以client身份进行认证。换句话说,client可以将身份凭证"委托"给这些服务。Delegation Tokens有一个过期时间的概念,需要周期性的更新以保证其有效性。但是,它也不能无限制的更新,这由最大生命周期控制。此外,在Delegation Token过期前也被取消。
    Delegation Tokens可以避免分发Kerberos TGT 或 keytab,而这些信息一旦泄露,将获得所有服务的访问权限。另一方面,每个Delegation Token与其关联服务严格的绑定在一起,且最终会过期。所以,即使Delegation Token泄露,也不会造成太大损失。此外,Delegation Token使身份凭证的更新更加轻量化。这是因为Token更新过程只涉及到"更新者"和相关服务。token本身并不会改变,所以已经使用token的各个组件并不需要更新。
    考虑到高可用性,Delegation Tokens会被server进行持久化。HDFS NameNode将Delegation Tokens持久化到元数据中(又称为:fsimage and edit logs),KMS会将其以ZNodes形式持久化到ZooKeeper中。即使服务重启或故障切换,Delegation Tokens也会一直可用。
    server和client在处理Delegation Tokens时会有不同的职责

server端的Delegation Tokens
server端主要负责:

  1. 发布Delegation Tokens,并保存用以验证。
  2. 响应更新Delegation Tokens请求。
  3. 当client端执行删除操作或token过期时,移除Token。
  4. 通过验证client提供的Tokens和server端存储的token是否一致,来对client进行认证。
    只有Delegation Token的renewer可以在token过期前进行更新操作。每次更新过后,token的过期时间会延长一个更新周期(renew-interval),直到token达到最大生命周期(默认7天)。
    client端的Delegation tokens
    client主要负责:
  5. 从server端请求一个新的Delegation Tokens,请求同时可以指定token的更新者(renewer)。
  6. 更新Delegation Tokens(如果client将自己指定为renewer),亦或请求别的组件更新token(指定的renewer)
  7. 向server发送取消Delegation Tokens的请求。
  8. 提供Delegation Tokens供server进行认证。

Delegation Token 生命周期

下面来探究下其在实际场景中如何使用。下图展示的是一个运行一个典型应用的认证流程,先通过YARN提交作业,然后将任务分发到各个worker节点执行。
在这里插入图片描述
简单起见,此处将忽略Kerberos认证和Task分发流程。图中通常有5个步骤:

  1. client希望在集群中运行一个job,它分别从NameNode和KMS获取HDFS Delegation Token和KMS Delegation Token。
  2. client将作业提交到YARN资源管理器(RM),同时提交的还有step1中获取的Delegation Token以及ApplicationSubmissionContext。
  3. YARN RM通过更新操作来核实接收的Token,随后,YARN启动job,并将其和Delegation Tokens一同分发到各个worker节点上。
  4. 每个工作节点中的Task利用这些Token来进行认证,比如:需要访问HDFS上数据时,使用HDFS Delegation Token进行认证。需要解密HDFS加密区的文件时,使用KMS Delegation Token。
  5. job结束后,RM则取消该job的Delegation Tokens。

NameNode中Delegation Token的实现

在这里插入图片描述

<think>嗯,用户问的是Hive的参数hive.cluster.delegation.token.store.class,我需要先理解这个参数的作用。Hive的安全机制涉及Delegation Token,这个参数应该和Token的存储方式有关。 首先,Hive在处理分布式任务时,比如提交到YARN,需要确保任务之间的安全通信。Delegation Token在这里起到认证的作用,避免频繁输入密码。而存储这些Token的方式由这个参数指定。 接下来,这个参数的默认值是什么?我记得Hive中有两种存储方式,一种是基于内存的,另一种是基于数据库或者ZooKeeper的。默认情况下,可能使用内存存储,比如org.apache.hadoop.hive.thrift.MemoryTokenStore。但如果在高可用或者需要持久化的环境中,可能会用ZooKeeper的实现类,比如ZKDelegationTokenStore。 然后,需要解释不同存储方式的适用场景。内存存储简单,但不适合集群环境,重启后Token会丢失。而ZK或者数据库存储则支持持久化和集群共享,适合生产环境。 用户可能是在配置Hive时遇到问题,或者想优化安全配置。需要说明如何根据集群环境选择合适的存储类,并给出配置示例,比如在hive-site.xml中设置参数。还要注意版本兼容性,不同Hive版本可能支持的类不同,提醒用户查阅对应文档。 最后,确认回答是否覆盖了参数的作用、默认值、可选值、配置方法和使用场景,确保用户能理解如何应用这个参数到实际配置中。</think>Hive 的 `hive.cluster.delegation.token.store.class` 参数是用于控制 **Hive Delegation Token(委托令牌)存储方式** 的核心配置项。以下是详细解释: --- ### **作用背景** - **Delegation Token 的作用** 在 Hadoop 生态中,Delegation Token 是 Kerberos 认证的轻量级替代机制,用于短期身份验证。Hive 在执行分布式任务(如提交到 YARN)时,需确保任务间通信的安全性。 - 例如:HiveServer2 向 YARN 提交任务时,需要 Delegation Token 证明身份,而无需反复输入密码。 - **为什么需要存储 Token** Token 需要持久化存储以支持: 1. Token 续订(Renewal) 2. 高可用场景下多 HiveServer2 实例共享 Token 3. 服务重启后 Token 恢复 --- ### **参数详解** - **功能定义** `hive.cluster.delegation.token.store.class` 指定 Delegation Token 的存储实现类。Hive 通过该配置决定如何持久化和管理 Token。 - **默认值** - **Hive 1.x/2.x**:默认使用基于内存的存储 `org.apache.hadoop.hive.thrift.MemoryTokenStore` (Token 存储在内存中,服务重启后丢失,仅适合测试环境)。 - **Hive 3.x+**:推荐使用 ZooKeeper 或数据库存储(如 `org.apache.hadoop.hive.thrift.ZooKeeperTokenStore`)。 - **常用可选值** | 实现类 | 存储方式 | 适用场景 | |-------------------------------------------|------------------|----------------------------| | `MemoryTokenStore` | 内存 | 开发/测试环境(无持久化) | | `ZooKeeperTokenStore` | ZooKeeper | 生产环境(高可用、持久化) | | `JdbcTokenStore` | 数据库(如 MySQL)| 生产环境(需外部数据库支持) | --- ### **配置方法** 在 `hive-site.xml` 中配置(以 ZooKeeper 为例): ```xml <property> <name>hive.cluster.delegation.token.store.class</name> <value>org.apache.hadoop.hive.thrift.ZooKeeperTokenStore</value> </property> <property> <name>hive.cluster.delegation.token.store.zookeeper.connectString</name> <value>zk_host1:2181,zk_host2:2181</value> <!-- ZooKeeper 地址 --> </property> ``` --- ### **注意事项** 1. **高可用场景** 若部署多 HiveServer2 实例,必须使用 ZooKeeper 或数据库存储,否则 Token 无法共享,导致任务失败。 2. **安全性** - ZooKeeper 需启用 ACL 和加密通信(如 SASL)。 - 数据库存储需配置连接池和权限控制。 3. **版本兼容性** Hive 3.x 默认推荐 ZooKeeper 存储,而 Hive 4.x 可能引入新实现类,需参考对应版本文档。 --- ### **总结** 通过 `hive.cluster.delegation.token.store.class`,Hive 实现了 Delegation Token 的灵活存储。生产环境中建议使用 ZooKeeper 或数据库存储,以确保 Token 持久化和高可用性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值