本文主要讲述LDAP用户组信息异常导致Sentry授权失效问题分析及解决办法。
问题起因:“80040151”用户反映在Hue上通过Hive查询表数据出现异常,异常信息为权限拒绝,需要通过Sentry授权。然而通过beeline直连HiveServer2,访问同一张表,能够正常查询数据。
生产环境:
组件关系说明:
编号 | HiveServer2对应节点 | 相关组件 | 说明 |
---|---|---|---|
1 | bj1161 | Zookeeper | 这个三个节点通过Zookeeper实施负载均衡,供开发人员使用 |
bj1162 | |||
bj1163 | |||
2 | bj1164 | Hue | 该节点与Hue集成,供分析人员使用 |
将上述4个HiveServer2分为两组,分别编号1和2,所有的HiveServer2访问的是同一个Hive MetaStore
文章目录结构:
1. 文档编写目的
2. 问题分析思路
2.1 排查Hue的问题
2.2 排查权限的问题
2.3 排查Sentry的问题
2.4 排查用户组的问题
3. 问题解决
3.1 核对LDAP Server信息
3.2 清除用户缓存
4. 总结
用户反映在Hue上无法通过Hive查询表数据,而通过beeline直连HiveServer2,能够正常查询数据。由于HiveServer2分为了2组,需要确认用户直连HiveServer2为组1还是组2,经过验证,组2的beeline直连HiveServer2,同样无法正常查询数据,而组1的beeline直连HiveServer2都能够正常的查询数据。
查看Hive日志,异常信息如下:
通过2.1,基本能够排除该问题不是由Hue引起的,需要进一步排查权限问题,使用问题用户“80040151”分别登录组1的bj1163节点和组2的bj1164节点,查看用户权限,命令如下:
SHOW CURRENT ROLES;
找到授予问题用户权限的角色后,切换到admin用户,查看角色权限,命令如下:
SHOW GRANT ROLE role_name;
对比两边的结果,发现权限一致,并不是由于权限问题导致的。
通过2.2,可以判断对于HiveServer2来说,用户“80040151”权限是一致的,但是实际权限不一致,就得从Sentry入手分析了。关于Sentry如何对CDH集群做统一授权和认证的,还是花了不少时间了解,以后有时间我会专门写一篇文章讲这个。
通过问题用户“80040151”多次执行SQL,同时,实时监控Sentry详细日志,终于定位到问题原因:
整理出的主要异常信息如下:
Some group names for ‘80040151’ are not resolvable. id: cannot find name for group ID 715365288……Caused by: PartialGroupNameException Number of group names and ids do not match.……Unable to obtain groups for 80040151java.io.IOException:No groups found for user 80040151 |
---|
可以看到,主要是组ID和组名不匹配导致Sentry权限映射异常。
在bj1163节点上,使用“id 80040151”命令,将用户组信息输出到data.txt中,经过sed命令对文本内容简单处理后,正常的用户组信息如下:
在bj1164节点上,使用“id 80040151”命令,将用户组信息输出到a.txt中,经过sed命令对文本内容简单处理后,异常的用户组信息如下:
通过对比,可以发现,715365288这个用户组ID对应的组名缺失了。Sentry是基于用户组授权,用户组组名缺失导致组ID和组名不匹配,从而导致权限异常。
LDAP/ADServer通过sssd服务对Client进行用户同步,需要确认只是Client端用户信息异常还是Server端信息异常,经过核对,Server端信息正常。
1、在bj1164上执行“sss_cache -u 80040151”命令,清除本地缓存中保存的问题用户信息,再次查看用户组信息,715365288对应组名仍然缺失。
2、在bj1164上执行“sss_cache E”命令,清除本地缓存中保存的所有用户信息,再次查看用户组信息,715365288对应组名仍然缺失。
3、备份bj1164上sssd的数据目录,将bj1163上sssd的数据目录打包拷贝到bj1164上,执行“sss_cache E”命令,清除本地缓存中保存的所有用户信息,再次查看用户组信息,715365288对应组名仍然缺失。
4、怀疑是进程僵死,Client端没有从Server端拉取信息。重启sssd进程,执行“sss_cache E”命令,清除本地缓存中保存的所有用户信息,再次查看用户组信息,715365288对应组名恢复正常。
5、LDAP用户组信息正常后,再次通过问题用户“80040151”访问组2(bj1164)的HiveServer2,查询表数据,结果正常。
1、Sentry基于用户组授权,LDAP用户组信息缺失会导致Sentry授权异常。
2、如果sssd进程僵死,清除用户缓存后,Client端无法正常从Server端同步用户信息。