1     文档编写目的

本文主要讲述LDAP用户组信息异常导致Sentry授权失效问题分析及解决办法。

问题起因:“80040151”用户反映在Hue上通过Hive查询表数据出现异常,异常信息为权限拒绝,需要通过Sentry授权。然而通过beeline直连HiveServer2,访问同一张表,能够正常查询数据。

 

生产环境:

  • 操作系统版本为Redhat6.8
  • CM和CDH版本为5.11.2
  • 集群已实施多租户

 

组件关系说明:

编号

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.  总结


2     问题分析思路

2.1  排查Hue的问题

用户反映在Hue上无法通过Hive查询表数据,而通过beeline直连HiveServer2,能够正常查询数据。由于HiveServer2分为了2组,需要确认用户直连HiveServer2为组1还是组2,经过验证,组2的beeline直连HiveServer2,同样无法正常查询数据,而组1的beeline直连HiveServer2都能够正常的查询数据。

查看Hive日志,异常信息如下:

LDAP用户组信息异常导致Sentry授权失效问题分析_用户信息


                           

2.2  排查权限的问题

通过2.1,基本能够排除该问题不是由Hue引起的,需要进一步排查权限问题,使用问题用户“80040151”分别登录组1的bj1163节点和组2的bj1164节点,查看用户权限,命令如下:

SHOW CURRENT ROLES;


找到授予问题用户权限的角色后,切换到admin用户,查看角色权限,命令如下:

SHOW GRANT ROLE role_name;


对比两边的结果,发现权限一致,并不是由于权限问题导致的。


2.3  排查Sentry的问题

通过2.2,可以判断对于HiveServer2来说,用户“80040151”权限是一致的,但是实际权限不一致,就得从Sentry入手分析了。关于Sentry如何对CDH集群做统一授权和认证的,还是花了不少时间了解,以后有时间我会专门写一篇文章讲这个。

通过问题用户“80040151”多次执行SQL,同时,实时监控Sentry详细日志,终于定位到问题原因:

LDAP用户组信息异常导致Sentry授权失效问题分析_用户组_02

LDAP用户组信息异常导致Sentry授权失效问题分析_用户信息_03



整理出的主要异常信息如下:

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 80040151

java.io.IOException:No groups found for user 80040151

可以看到,主要是组ID和组名不匹配导致Sentry权限映射异常。


2.4  排查用户组的问题

在bj1163节点上,使用“id 80040151”命令,将用户组信息输出到data.txt中,经过sed命令对文本内容简单处理后,正常的用户组信息如下:

LDAP用户组信息异常导致Sentry授权失效问题分析_用户信息_04

在bj1164节点上,使用“id 80040151”命令,将用户组信息输出到a.txt中,经过sed命令对文本内容简单处理后,异常的用户组信息如下:

LDAP用户组信息异常导致Sentry授权失效问题分析_用户信息_05

通过对比,可以发现,715365288这个用户组ID对应的组名缺失了。Sentry是基于用户组授权,用户组组名缺失导致组ID和组名不匹配,从而导致权限异常。

 

3     问题解决

3.1  核对LDAP Server信息

LDAP/ADServer通过sssd服务对Client进行用户同步,需要确认只是Client端用户信息异常还是Server端信息异常,经过核对,Server端信息正常。


3.2  清除用户缓存

1、在bj1164上执行“sss_cache -u 80040151”命令,清除本地缓存中保存的问题用户信息,再次查看用户组信息,715365288对应组名仍然缺失。

2、在bj1164上执行“sss_cache E”命令,清除本地缓存中保存的所有用户信息,再次查看用户组信息,715365288对应组名仍然缺失。

3、备份bj1164上sssd的数据目录,将bj1163上sssd的数据目录打包拷贝到bj1164上,执行“sss_cache E”命令,清除本地缓存中保存的所有用户信息,再次查看用户组信息,715365288对应组名仍然缺失。

LDAP用户组信息异常导致Sentry授权失效问题分析_用户组_06

4、怀疑是进程僵死,Client端没有从Server端拉取信息。重启sssd进程,执行“sss_cache E”命令,清除本地缓存中保存的所有用户信息,再次查看用户组信息,715365288对应组名恢复正常。

5、LDAP用户组信息正常后,再次通过问题用户“80040151”访问组2(bj1164)的HiveServer2,查询表数据,结果正常。

 

4     总结

1、Sentry基于用户组授权,LDAP用户组信息缺失会导致Sentry授权异常。

2、如果sssd进程僵死,清除用户缓存后,Client端无法正常从Server端同步用户信息。



 



LDAP用户组信息异常导致Sentry授权失效问题分析_用户组_07

When your talent can’t support your ambition,

You should calm down and learn.
When your ability cannot realize you dreams,
You should practice with all your heart.
Ask yourself,
What kind of life you pursue.

LDAP用户组信息异常导致Sentry授权失效问题分析_用户组_07