我有一个Hadoop集群,它使用公司的Active Directory作为Kerberos领域 . 节点和最终用户Linux工作站都是Ubuntu 16.04 . 它们使用PowerBroker PBIS加入同一域,因此工作站和网格节点之间的SSH登录是单点登录 . 最终用户从他们的工作站运行长时间运行的脚本,这些脚本重复使用SSH首先在集群上启动Spark / Yarn作业,然后跟踪他们的进度,这些进程必须在夜间运行并且在周末远远超过10小时Kerberos票证的生命周期 .
我正在寻找一种方法为用户安装永久的,服务式的Kerberos键盘,从而减轻他们处理kinit的需要 . 我理解这意味着任何人都可以通过shell访问网格,因为特定用户可以作为该用户进行身份验证 .
我还注意到,使用密码执行非SSO SSH登录会自动创建从登录时起有效的网络票证 . 如果可以为SSO登录启用此行为,那将解决我的问题 .
3 回答
您只需要求用户将
--principal
和--keytab
参数添加到他们的Spark作业中 . 然后Spark(实际上是YARN)代码会自动为您更新门票 . 我们有使用这种方法运行数周的工作 .参见例如https://spark.apache.org/docs/latest/security.html#yarn-mode
当Yarn更新Kerberos票证时,您可以在Spark驱动程序日志中看到 .
如果您正在访问Hive / Hbase或需要kerberos票证的任何其他组件,那么在票证过期的情况下使您的spark代码重新登录 . 您必须更新票证才能使用keytab,而不是依赖于TGT已经存在于缓存中 . 这是通过使用Hadoop Security包中的UserGroupInformation类完成的 . 在火花作业中添加以下片段以便长时间运行 -
上面我们指定服务主体的名称和我们生成的keytab文件的路径 . 只要该密钥表有效,我们的程序将对所有操作使用所需的服务主体,无论运行该程序的用户是否已经过身份验证并接收到TGT .
如果除了spark之外没有其他组件访问,那么您不需要编写上面的代码 . 只需在spark spark命令中提供keytab和principal .
我采用上面的建议使用--keytab参数在我提交给Spark的网格节点上指定一个自定义keytab . 我使用下面的脚本创建自己的每用户密钥表 . 它一直保持到用户更改密码 .
请注意,该脚本简化了假设,即Kerberos领域与DNS域和定义用户的LDAP目录相同 . 这适用于我的设置,小心使用你的设置 . 它还希望用户成为该网格节点上的sudoers . 更精细的脚本可能会分离keytab的生成和安装 .