首页 > 解决方案 > Hadoop 集群交互式用户的永久 Kerberos 票证

问题描述

我有一个 Hadoop 集群,它使用公司的 Active Directory 作为 Kerberos 领域。节点和最终用户 Linux 工作站都是 Ubuntu 16.04。它们使用 PowerBroker PBIS 加入同一个域,因此工作站和网格节点之间的 SSH 登录是单点登录。最终用户从他们的工作站运行长时间运行的脚本,这些脚本反复使用 SSH 首先在集群上启动 Spark/Yarn 作业,然后跟踪他们的进度,这些工作必须在晚上和周末持续运行,远远超过 10 小时Kerberos 票证的生命周期。

我正在寻找一种方法来为用户安装永久的、服务式的 Kerberos 密钥表,从而减轻他们处理kinit的需要。我知道这意味着任何对网格具有 shell 访问权限的人都可以作为特定用户进行身份验证。

我还注意到,使用密码执行非 SSO SSH 登录会自动创建从登录时有效的网络票证。如果可以为 SSO 登录启用此行为,那将解决我的问题。

标签: hadoopsshactive-directoryubuntu-16.04kerberos

解决方案


如果您正在访问 Hive/Hbase 或任何其他需要 kerberos 票证的组件,请让您的 spark 代码在票证过期时重新登录。您必须更新票证才能使用 keytab,而不是依赖 TGT 已经存在于缓存中。这是通过使用 Hadoop 安全包中的 UserGroupInformation 类来完成的。在您的火花作业中添加以下代码段以进行长时间运行-

val configuration = new Configuration
configuration.addResource("/etc/hadoop/conf/hdfs-site.xml")
UserGroupInformation.setConfiguration(configuration)

UserGroupInformation.getCurrentUser.setAuthenticationMethod(AuthenticationMethod.KERBEROS)
UserGroupInformation.loginUserFromKeytabAndReturnUGI(
  "hadoop.kerberos.principal", " path of hadoop.kerberos.keytab file")
  .doAs(new PrivilegedExceptionAction[Unit]() {
    @Override
    def run(): Unit = {
       //hbase/hive connection
      // logic

    }
  })

上面我们指定了我们的服务主体的名称和我们生成的 keytab 文件的路径。只要该 keytab 有效,我们的程序就会对所有操作使用所需的服务主体,而不管运行程序的用户是否已经通过身份验证并收到了 TGT。

如果除了 spark 没有其他组件访问,那么您不需要编写上述代码。只需在 spark submit 命令中提供 keytab 和 principal。

spark-submit --master yarn-cluster --keytab "xxxxxx.keytab" --principal "svc-xxxx@xxxx.COM"  xxxx.jar

推荐阅读