HBase Kerberos 连接更新策略

HBase Kerberos connection renewal strategy

最近我在集群中启用了 kerberos,一切正常,直到我的 kerberos 登录过期,例如 12 小时。那时我创建的任何连接,使用这些连接创建的任何 tables 等都会在我使用它们时抛出。这可能会导致我的应用程序崩溃,具体取决于我的处理方式。

我不介意严重崩溃,因为我的应用程序由滑块管理,当它出现故障时它会复活应用程序,但是这只会在 HBase 为 "used" 时发生(即我调用一个方法在 table 上,现在连接已失效),这可能是由用户交互引起的,这会导致糟糕的用户体验。

我不希望身份验证实现细节渗透到我的应用程序中,也不希望创建连接对象的次数超过必要的次数,因为它是一项成本高昂的操作,会产生大量 RPC 调用(zookeeper 元数据位置开始。

是否有一种通用策略(最好内置在 HBase 客户端中)来管理 kerberos 身份验证到期并在发生这种情况时更新 HBase connections/tables?

Kerberos TGT 具有 生命周期(例如 12 小时)和 可更新生命周期(例如 7 天)。只要机票仍然有效并且仍然可以续订,您就可以请求 "free" 续订——不需要密码——并且生命周期计数器会被重置(例如,还有 12 小时,再次)。

Hadoop 身份验证库为当前 TGT 的自动续订生成一个特定的Java线程。它有点丑陋,使用 kinit -R 命令行而不是 JAAS 库调用,但它有效 - 请参阅 HADOOP-6656

因此,如果您让 Slider 在启动时创建可更新票证,并且您可以贿赂您的系统管理员以提高默认值(参见客户端配置)和最大值(参见 KDC 配置)可再生生命周期 到,比方说,30 天,那么您的应用程序可以 运行 直接使用初始 TGT 30 天。一个不错的改进。

~~~~~~~~~~

如果你真的渴望永恒......对不起,但你实际上需要做一些编程。这意味着 专门的 thread/process 负责或 重新创建 自动创建 TGT。

  • Java 方式:启动时,在连接到 HBase/HDFS/whatever 之前, 使用 loginUserFromKeytab() 然后 运行 显式创建 UGI checkTGTAndReloginFromKeytab()时不时
  • Shell 方式:启动一个 shell ,(a) 创建一个 TGT 与 kinit (b) 生成一个定期再次触发 kinit 的子进程 (c) 启动您的 Java 应用程序然后终止子进程 when/if 您的应用程序永远终止

警告:如果在重新创建 TGT 时某些其他线程碰巧打开或重新打开连接,则该连接可能会失败,因为缓存在访问它的确切时间是空的("race condition").下一次尝试会成功,但预计您的日志中会出现一些恶意警告。

~~~~~~~~~~

最终建议:您可以为您的应用程序使用 私人票证缓存(即,您可以 运行 同一节点上的多个应用程序具有相同的 Linux 帐户但不同的 Kerberos 主体)通过设置 KRB5CCNAME 环境变量,只要它是 "FILE:" 缓存。

由于这是一个较旧的问题,很高兴知道 HBase、Hadoop 等的版本

如今,Kerberos 票据更新应该只在 HBase 中工作

查看配置步骤-

https://docs.cloudera.com/documentation/enterprise/5-14-x/topics/cdh_sg_hbase_authentication.html#concept_zyz_vg5_nt

查看配置为使用 TGT 续订的 HBase 客户端示例 -

https://github.com/apache/hbase/blob/064f5f1394faa8e84ad64488345e3bf46629ce59/hbase-examples/src/main/java/org/apache/hadoop/hbase/util/ClientUtils.java#L66

(顺便说一句,renewTGT=true 是默认值,这实际上是 Hadoop Commons 代码库的一部分,请参见此处 - https://github.com/naver/hadoop/blob/master/hadoop-common-project/hadoop-auth/src/main/java/org/apache/hadoop/security/authentication/client/KerberosAuthenticator.java#L132

)