EMR权限管控最佳实践

  • 收获赞:
  • 擅长领域:

本文通过EMR自带的框架,在非kerberos的环境下,通过OpenLDAP建立起用户/用户组体系,并使用Hive+Ranger+Hue的链路,完成数仓中数据访问权限的管控。

概述

方案介绍

企业级别的数仓,通常需要提供数据给业务方/分析师查询,随之而来的权限管控问题,常常困扰了许多用户,本文将基于EMR中提供的组件帮助客户快速建立数仓的权限体系,完成Hive中数据访问权限的管控。

目标读者

使用开源Hadoop生态体系的用户,对于Hive,Hue,Ranger,OpenLDAP,Knox有一定了解。

适用场景

希望通过用户组/角色来快速建立权限体系的企业用户。

方案架构

方案架构图

我们将企业的用户分为三种身份角色,不同身份角色又有各自不同的组。

角色

身份

运维管理员

管理员(manager_group)

分析师/运营

分析师组(analyst_group)

访客组(guest_group)

研发/BI

数仓1组(bigdata1_group)

数仓2组(bigdata2_group)

算法组(ai_group)

image.png

方案优势

大多数场景中,我们不会单独为每个账户配置权限,而是通过赋予组/角色权限,再将账户绑定到组/角色上,完成对单个账号权限的配置。

在本案例中,无需引入其他框架,通过EMR自带的框架实现权限的管理,帮助客户在非kerberos的场景下,建立权限体系,保障数据安全。

相关框架介绍

OpenLDAP介绍

OpenLDAP(后文统一缩写为LDAP)是轻量级目录访问协议的开源实现。

可以简单的理解为是EMR中用来存放用户认证信息的框架,许多开源框架也支持从LDAP中同步用户信息,做账密认证,例如Hive,Hue,Ranger等。

本案例会在LDAP中创建用户/用户组,并集成到Hadoop、Ranger、Hive、Hue中。

所有成员:丁一 、胡二、 张三、 李四、 王五、 赵六、 孙七、 周八。

LDAP中组织关系如下:

组别类型

运维/管理员

研发/BI

分析师/运营

组别中文

管理员

数仓1组

数仓2组

算法组

分析师组

访客组

组别英文

manager_group

bigdata1_group

bigdata2_group

ai_group

analyst_group

guest_group

组员

丁一

张三

李四

王五

王五

周八

胡二

孙七

赵六

Hive介绍

Hive是一个基于Hadoop的数据仓库框架,在大数据业务场景中,主要用来进行数据提取、转化和加载(ETL)以及元数据管理(官网介绍)。

它包含两个常驻服务:

  • Hive Metastore:管理库/表/字段分区等元数据。

  • Hive Server2:Hive提交任务的JDBC入口。

本案例中,使用HiveServer2作为提交sql,鉴定权限的入口。

Hue介绍

Hue是数据库和数据仓库的开源SQL助手,无需额外开发,即可在浏览器端与Hadoop集群进行交互来分析处理数据(官网介绍)。

许多使用开源框架的企业,都会选择将Hue提供给内部的数据分析师,甚至外部的访客查询数仓的数据,Hue提交任务到Hive是通过JDBC接口(HiveServer2服务),因此本案例中,引入Hue来作为sql查询的入口。

Ranger介绍

Ranger提供集中式的权限管理框架,可以对Hadoop生态中的HDFS、Hive和YARN等组件进行细粒度的权限访问控制,并且提供了Web UI方便管理员操作(官网介绍)。

它包含两个较为重要的组件:

  • Ranger Admin:提供了Web UI界面,让用户可以方便的配置,管理权限。

  • Ranger UserSync:定时更新用户信息,默认同步Linux上的用户信息,本案例中会配置从LDAP中同步用户/用户组信息。

Knox介绍

各种开源框架都提供了Web访问入口,端口不一而足,这对于安全组端口的放行造成不小的麻烦,Knox将HDFS、YARN、Spark和Ganglia等Web UI页面,统一接入到8443端口,并且绑定了LDAP做登录认证,帮助客户可以在公网的条件下更加安全、便捷的访问集群不同服务的Web UI(官网介绍)。

​案例中,会使用Knox访问Ranger UI配置权限,当然在需要查看HDFS的WEB,或者需要通过YARN查看任务状态等时候,也会大量使用到Knox。

方案实施

前提条件

  1. 已有一个空闲,集群所有服务正常,header机器绑定弹性公网IP,并且没有开启过高安全(Kerberos)的EMR-Hadoop集群。

说明

  • 建议版本在3.34.0及后续版本或EMR-4.8.0及后续版本,因为在步骤二、三、六中,均使用到了“一键启用LDAP”功能,实现一键添加配置,如果使用低于建议版本的集群,则需要手动添加不同框架集成LDAP的配置,较为繁琐。

  • 绑定公网是为了能直接使用Knox访问各组件的Web服务,如果不想绑定公网,请自行通过其他方式访问各组件的Web服务。

  • 本案例使用EMR-3.38.3版本进行验证。

  1. 上述的EMR集群中添加过Ranger服务,安装成功并且服务正常。

  2. 用户使用的阿里云账号拥有EMR的AliyunEMRFullAccess权限。

说明

后续的许多操作需要在EMR控制台添加/部署配置,并重启服务。

  1. ssh登录EMR集群任一ECS的权限。

说明

部分操作需要登录到ECS上执行,例如使用脚本方式创建LDAP用户/用户组,如果通过公网访问,那么安全组需要放行指定IP访问集群的22端口,也可以通过ECS控制台内网访问。

  1. 访问Knox的8443端口和Hue的8888端口权限。

说明

安全组需要放行指定IP访问集群的8443端口和8888端口,通过Konx访问Ranger,YARN等UI,访问Hue UI。

操作步骤

步骤一:LDAP中创建用户/用户组

  1. LDAP创建用户。

    • 通过EMR管控台创建LDAP用户(推荐)

      1. 登录阿里云E-MapReduce控制台。​

      2. 在顶部菜单栏处,根据实际情况选择地域和资源组。

      3. 进入上方的集群管理页签,单击相应集群所在行的详情

      4. 在左侧导航栏,进入用户管理,单击添加用户。​

      5. 添加用户对话框的用户名下拉列表中,选择已有的RAM用户作为EMR用户的名称,输入密码确认密码,单击确定

    • 通过LDAP脚本创建LDAP用户。

      1. 通过ssh或者“ECS控制台”远程登录EMR集群对应的ECS机器。

      2. 请参考附件一“添加用户”脚本,在任意一台ECS机器中执行。

        #请将<admin_passwd>替换成LDAP中admin的密码
        #请将<user_password>替换成每个用户的密码
        sh adduser.sh <admin_password> dingyi <user_password>
        sh adduser.sh <admin_password> huer <user_password>
        sh adduser.sh <admin_password> zhangsan <user_password>
        sh adduser.sh <admin_password> lisi <user_password>
        sh adduser.sh <admin_password> wangwu <user_password>
        sh adduser.sh <admin_password> zhaoliu <user_password>
        sh adduser.sh <admin_password> sunqi <user_password>
        sh adduser.sh <admin_password> zhouba <user_password>
  2. LDAP创建用户组。

    1. 通过ssh或者“ECS控制台”远程登录EMR集群对应的ECS机器。

    2. 请参考附件一“添加用户组”脚本,在任意一台ECS机器中执行。

      #请将<admin_passwd>替换成LDAP中admin的密码
      sh addgroup.sh <admin_password> manager_group dingyi
      sh addgroup.sh <admin_password> bigdata1_group zhangsan
      sh addgroup.sh <admin_password> bigdata2_group lisi
      sh addgroup.sh <admin_password> ai_group wangwu
      sh addgroup.sh <admin_password> analyst_group wangwu
      sh addgroup.sh <admin_password> guest_group zhouba
  3. 将LDAP用户添加到用户组中。

    1. 通过ssh或者“ECS控制台”远程登录EMR集群对应的ECS机器。

    2. 请参考附件一“添加用户到用户组”脚本,在任意一台ECS机器中执行。

      #请将<admin_passwd>替换成LDAP中admin的密码
      sh adduser2group.sh <admin_password> bigdata2_group huer
      sh adduser2group.sh <admin_password> ai_group sunqi
      sh adduser2group.sh <admin_password> analyst_group zhaoliu
  4. 步骤验证。

    • 执行LDAP查询组别命令,查询用户组信息。

    • 通过回显信息,可以查看用户/用户组添加是否成功,用户组中是否添加了对应的用户。

      #请将<admin_passwd>替换成LDAP中admin的密码
      [root@emr-header-1 ~]# ldapsearch -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w <admin_passwd> -b "ou=groups,o=emr"
      # extended LDIF
      #
      # LDAPv3
      # base <ou=groups,o=emr> with scope subtree
      # filter: (objectclass=*)
      # requesting: ALL
      #
      
      # groups, emr
      dn: ou=groups,o=emr
      objectClass: organizationalUnit
      objectClass: top
      ou: groups
      
      # manger_group, groups, emr
      dn: cn=manger_group,ou=groups,o=emr
      objectClass: groupOfNames
      cn: manger_group
      member: uid=dingyi,ou=people,o=emr
      description: manger_group group
      
      # bigdata1_group, groups, emr
      dn: cn=bigdata1_group,ou=groups,o=emr
      objectClass: groupOfNames
      cn: bigdata1_group
      member: uid=zhangsan,ou=people,o=emr
      description: bigdata1_group group
      
      # bigdata2_group, groups, emr
      dn: cn=bigdata2_group,ou=groups,o=emr
      objectClass: groupOfNames
      cn: bigdata2_group
      member: uid=lisi,ou=people,o=emr
      member: uid=huer,ou=people,o=emr
      description: bigdata2_group group
      
      # ai_group, groups, emr
      dn: cn=ai_group,ou=groups,o=emr
      objectClass: groupOfNames
      cn: ai_group
      member: uid=wangwu,ou=people,o=emr
      member: uid=sunqi,ou=people,o=emr
      description: ai_group group
      
      # analyst_group, groups, emr
      dn: cn=analyst_group,ou=groups,o=emr
      objectClass: groupOfNames
      cn: analyst_group
      member: uid=wangwu,ou=people,o=emr
      member: uid=zhaoliu,ou=people,o=emr
      description: analyst_group group
      
      # guest_group, groups, emr
      dn: cn=guest_group,ou=groups,o=emr
      objectClass: groupOfNames
      cn: guest_group
      member: uid=zhouba,ou=people,o=emr
      description: guest_group group
      
      # search result
      search: 2
      result: 0 Success
      
      # numResponses: 8
      # numEntries: 7

说明

通过管控台添加LDAP用户的方式,只能添加与RAM账号同名的用户,账密信息会同步到LDAP中,并在EMR集群所属的ECS机器中创建同名用户(但由于创建的Linux账号默认不设置密码,所以无法使用该用户登录ECS) 管理用户

步骤二:HiveServer2开启LDAP认证

HiveServer2默认没有做认证(客户可以伪装不同用户访问数据)。

通常情况下,会使用LDAP/Kerberos来做认证(本文着重介绍LDAP),开启了LDAP权限认证之后,用户连接HiveServer2的时候,就需要提供LDAP中的账密信息。

  1. 进入Hive页面。

    1. 登录阿里云E-MapReduce控制台

    2. 在顶部菜单栏处,根据实际情况选择地域和资源组。

    3. 进入上方的集群管理页签,单击相应集群所在行的详情。​

    4. 在左侧导航栏,选择集群服务 > Hive

  2. 开启LDAP认证。

    1. 在Hive服务页面,选择右上角的操作 > 开启LDAP认证。​

    2. 执行集群操作对话中,单击确认。​

  3. 单击上方的查看操作历史直至操作状态显示成功

  4. 重启HiveServer2。

    1. 在Hive服务页面,选择右上角的操作 > 重启HiveServer2。​

    2. 执行集群操作对话中,输入执行原因,单击确定。​

    3. 确认对话中,单击确定

说明

Hive开启LDAP认证后,Hue访问Hive需要进行额外的配置,本文会在步骤五中进行详细介绍,管理LDAP认证

  1. 步骤验证。

    • 通过beeline连接hiveserver2,需要输入正确的LDAP账密信息,才能通过beeline -u jdbc:hive2://emr-header-1:10000 -n <user_name> -p <user_password>

    • 通过jdbc连接hiveserver2,需要输入正确的LDAP账密信息,才能通过jdbc:hive2://emr-header-1:10000/default;user=<user_name>;password=<user_password>

步骤三:RangerUserSync开启LDAP认证

Ranger默认只会读取UserSync服务所在的Linux用户信息,所以需要做额外的配置,将LDAP中的用户/用户组的关系提供给Ranger,这样Ranger UI中才能选到对应的用户/用户组,才能实现权限的配置。

  1. 进入Ranger页面。

    1. 登录阿里云E-MapReduce控制台。​

    2. 在顶部菜单栏处,根据实际情况选择地域和资源组。

    3. 单击上方的集群管理页签。

    4. 集群管理页面,单击相应集群所在行的详情。​

    5. 在左侧导航栏,选择集群服务 > Ranger

  2. ​开启LDAP认证。

    1. 在Ranger服务页面,选择右上角的操作 > UserSync开启LDAP认证。​

    2. 执行集群操作对话中,单击确认。​

  3. 单击上方的查看操作历史直至Configure操作状态显示成功。​

  4. 服务配置区域,单击ranger-ugsync-site页签。

    1. 配置如下参数,同步LDAP用户组至Ranger。

      ranger.usersync.group.memberattributename = member
      ranger.usersync.group.nameattribute = cn
      ranger.usersync.group.objectclass = groupofnames
      ranger.usersync.group.searchbase = ou=groups,o=emr
      ranger.usersync.group.searchenabled = true
      ranger.usersync.group.usermapsyncenabled = true
    2. 单击保存,在确认修改对话框中,点选自动更新配置,填写执行原因,最后单击确认

  5. 单击上方的查看操作历史直至操作Configure状态显示成功。​

  6. 重启RangerUserSync。

    1. 在Ranger服务页面,选择右上角的操作 > 重启RangerUserSync。​

    2. 执行集群操作对话中,输入执行原因,单击确定。​

    3. 确认对话中,单击确定。​

  7. 步骤验证。

    1. 通过Knox访问Ranger UI(官网链接),请先使用LDAP中的账密进行knox认证,跳转到Ranger UI之后,再通过Ranger UI的默认账密admin/admin,登录Ranger。

    2. 击Ranger UI中的Settings,查看Users和Groups的信息是否准确无误。image.pngimage.png

说明

UserSync同步LDAP中用户信息是add模式,也就是说,如果从LDAP中删除了一个用户/用户组,但是在Ranger中还是可以看到这个用户/用户组,除非手动在Ranger UI上,将这个用户/用户组删除。

步骤四:HDFS配置LDAP用户组映射

HDFS默认会从active的Namenode所在的Linux上,读取Linux用户/用户组信息,因此我们需要做额外的配置,将LDAP中的用户/用户组的关系提供给HDFS。

  1. 进入HDFS页面。

    1. ·登录阿里云E-MapReduce控制台。​

    2. 在顶部菜单栏处,根据实际情况选择地域和资源组​。

    3. 单击上方的集群管理页签。

    4. 集群管理页面,单击相应集群所在行的详情。​

    5. 在左侧导航栏,选择集群服务 > HDFS。​

  2. 配置LDAP用户组映射。

    1. 服务配置区域,单击core-site页签。

    2. 单击自定义配置,配置如下参数。

      hadoop.security.group.mapping = org.apache.hadoop.security.CompositeGroupsMapping
      hadoop.security.group.mapping.providers.combined = true
      hadoop.security.group.mapping.providers = unix4services,ldap4users
      hadoop.security.group.mapping.provider.unix4services = org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback
      hadoop.security.group.mapping.provider.ldap4users = org.apache.hadoop.security.LdapGroupsMapping
      hadoop.security.group.mapping.provider.ldap4users.ldap.url = ldap://emr-header-1:10389
      hadoop.security.group.mapping.provider.ldap4users.ldap.bind.user = uid=admin,o=emr
      hadoop.security.group.mapping.provider.ldap4users.ldap.bind.password = <填写该集群OpenLDAP配置中manager_password的值>
      hadoop.security.group.mapping.provider.ldap4users.ldap.base = o=emr
      hadoop.security.group.mapping.provider.ldap4users.ldap.search.filter.user = (&(objectClass=person)(uid={0}))
      hadoop.security.group.mapping.provider.ldap4users.ldap.search.filter.group = (objectClass=groupOfNames)
    3. 单击保存,在确认修改对话框中,点选自动更新配置,填写执行原因,最后单击确认

  3. 单击上方的查看操作历史直至Configure操作状态显示成功

  4. 重启Namenode。

    1. 在HDFS服务页面,选择右上角的操作 > 重启namenode。​

    2. 执行集群操作对话中,输入执行原因,单击确定。​

    3. 确认对话中,单击确定。​

  5. 步骤验证。

    • 登录到EMR集群对应的任意ECS中使用如下命令测试,如果能正确返回用户组信息,即为配置成功。

      #hdfs groups <idapuser>
      [root@emr-header-1 ~]# hdfs groups dingyi
      dingyi : manager_group
      [root@emr-header-1 ~]# hdfs groups zhouba
      zhouba : guest_group

步骤五:Hue配置连接开启LDAP认证引擎

需要生成一个Hue的代理用户,让Hue可以通过HiveServer2的LDAP认证。

  1. 通过LDAP脚本创建Hue代理用户。

    1. 通过ssh或者“ECS控制台”远程登录EMR集群对应的ECS机器。

    2. 请参考附件一“添加用户”脚本,在任意一台ECS机器中执行。

      #请将<admin_passwd>替换成LDAP中admin的密码
      #请将<user_password>替换成每个用户的密码
      sh adduser.sh <admin_password> hue <user_password>
  2. 配置Hue代理用户。

    1. 服务配置区域,单击hue页签。

    2. 单击自定义配置,配置如下参数。

      #请将<user_password>替换成每个用户的密码
      beeswax.auth_username = hue
      beeswax.auth_password = <user_password>
  3. 重启Hue。

    1. 在Hue服务页面,选择右上角的操作 > 重启Hue。​

    2. 执行集群操作对话中,输入执行原因,单击确定。​

    3. 确认对话中,单击确定。​

  4. 步骤验证。

    1. 通过“访问链接与端口”跳转到Hue UI。

    2. 创建/登录账号。

    3. 执行任意sql,如果不成功,请看常见问题中的“Hue执行sql异常”。

  5. 更多信息请参考(官网链接)。

步骤六:Hue开启LDAP认证

Hue默认有自己的一套用户体系(存储在Hue绑定的MySQL中)。

假设通过admin账号登录到Hue UI,在页面提交sql,那么下发到引擎层面,也是使用admin账号,也就是说,如果在Hue中创建了一个不存在于LDAP中的用户,会因为Ranger上看不到这个用户,而无法给这个用户配置权限,除非在Hue中创建与LDAP同名的用户。

因此在这种场景下,Hue开启LDAP认证,可以更好的将用户体系统一,用户登录Hue界面的时候,只需要提供LDAP中账密信息即可。

  1. 进入Hue页面。

    1. 登录阿里云E-MapReduce控制台。​

    2. 在顶部菜单栏处,根据实际情况选择地域和资源组​。

    3. 单击上方的集群管理页签。

    4. 集群管理页面,单击相应集群所在行的详情。​

    5. 在左侧导航栏,选择集群服务 > Hue。​

  2. 开启LDAP认证。

    1. 在Hue服务页面,选择右上角的操作 > 开启LDAP认证。​

    2. 执行集群操作对话中,单击确认。​

  3. 单击上方的查看操作历史​直至操作状态显示成功。​

  4. 重启Hue。

    1. 在Hue服务页面,选择右上角的操作 > 重启Hue。​

    2. 执行集群操作对话中,输入执行原因,单击确定。​

    3. 确认对话中,单击确定。​

说明

开启LDAP后,第一次登录Hue UI的用户将成为管理员用户,并且之前创建的用户都无法登录管理LDAP认证

步骤七:初始化测试hive库表数据

--创建bigdata1
create database bigdata1;
create table bigdata1.bigdata1_table1(id int,name string);
insert into bigdata1.bigdata1_table1 select 1,'bigdata1_table1_value1' 
union all select 2,'bigdata1_table1_value2' 
union all select 3,'bigdata1_table1_value3' 
union all select 4,'bigdata1_table1_value4' 
union all select 5,'bigdata1_table1_value5';
create table bigdata1.bigdata1_table2(id int,name string);
insert into bigdata1.bigdata1_table2 select 1,'bigdata1_table2_value1' 
union all select 2,'bigdata1_table2_value2' 
union all select 3,'bigdata1_table2_value3';
--创建bigdata2
create database bigdata2;
create table bigdata2.bigdata2_table1(id int,name string);
insert into bigdata2.bigdata2_table1 select 1,'bigdata2_table1_value1' 
union all select 2,'bigdata2_table1_value2' 
union all select 3,'bigdata2_table1_value3' 
union all select 4,'bigdata2_table1_value4';
--创建ai
create database ai;
create table ai.ai_table1(id int,name string);
insert into ai.ai_table1 select 1,'ai_table1_value1' 
union all select 2,'ai_table1_value2';
--创建analyst
create database analyst;
create table analyst.analyst_table1(id int,name string);
insert into analyst.analyst_table1 select 1,'analyst_table1_value1' 
union all select 2,'analyst_table1_value2'  
union all select 3,'analyst_table1_value3' 
union all select 4,'analyst_table1_value4' 
union all select 5,'analyst_table1_value5' 
union all select 6,'analyst_table1_value6' 
union all select 7,'analyst_table1_value7' 
union all select 8,'analyst_table1_value8' 
union all select 9,'analyst_table1_value9' 
union all select 10,'analyst_table1_value10';

--查询测试
select * from analyst.analyst_table1;

步骤八:Hive集成Ranger

Ranger没有启用Hive插件之前,查询任何的数据都不做权限校验,用户只要通过了LDAP的认证,就可以查询任意数据,启用了Hive插件之后,所有数据都无法被访问,需要在Ranger中自行配置放行权限。

  1. Ranger启用Hive。

    1. 登录阿里云E-MapReduce控制台。​

    2. 在顶部菜单栏处,根据实际情况选择地域和资源组​。

    3. 单击上方的集群管理页签。

    4. 集群管理页面,单击相应集群所在行的详情。​

    5. 在左侧导航栏单击集群服务 > RANGER。​

    6. 单击右侧的操作下拉菜单,选择启用Hive。​

    7. 执行集群操作单击右上角查看操作历史查看任务进度,等待任务完成。

      说明

      Ranger启用Hive后,HiveServer2场景下,您需要使用Ranger进行权限配置。HiveClient场景下,您需要借助HDFS权限进行控制开启HDFS的权限请参见HDFS配置。

  2. Ranger UI添加Hive Service。

    1. 进入Ranger UI页面,详情请参见概述

    2. 在Ranger UI页面,添加Hive Service。当您的Ranger版本为2.1.0版本时,截图如下。

    3. 配置参数。

      参数

      说明

      备注

      Service Name

      ​emr-hive

      固定值,不可修改。

      Username

      固定值hadoop​

      用户名与密码,会影响到Test Connection按钮(就算测试连接失败,也不影响后续权限配置的生效)和添加policy时候的库/表/字段名联想功能,所以密码可以随意填写。

      Password

      自定义

      jdbc.driverClassName

      org.apache.hive.jdbc.HiveDriver​

      默认值,无需修改。

      jdbc.url

      jdbc:hive2://emr-header-1:10000/

      jdbc的地址,端口号默认为10000。

      Add New Configurations

      Name:policy.download.auth.users​

      Value:hadoop

      Name为固定值

      如果没有开启kerberos,该值设置为hadoop。

    4. 单击Add

  3. 重启Hive上述任务完成后,需要重启Hive才生效。

    1. 左侧导航栏单击集群服务 > Hive。​

    2. 单击右上角操作下拉菜单,选择重启 All Components。​

    3. 执行集群操作。

      1. 执行集群操作对话框中,输入执行原因,单击确定。​

      2. 确认对话框,单击确定。​

      3. 单击右上角查看操作历史查看任务进度,等待任务完成。

  4. 验证步骤。

    1. Hive集成Ranger成功后,除了上述配置的hadoop用户之外,其他用户均没有任何权限访问库表。

    2. 执行查询测试:select * from analyst.analyst_table1;

    3. 看到如下异常,证明配置成功:Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [dingyi] does not have [USE] privilege on [default]

    4. 更多配置信息,请参考(官方文档)。

步骤九:配置用户/用户组权限

通过Ranger UI配置权限相对不复杂,如下介绍2个案例,更多案例请参考(官方文档),或者Ranger开源文档。

  1. 配置manager_group拥有所有权限。

    1. 单击步骤八创建出来的名为emr-hive的Hive Service。

    2. 默认自带3条policy,点击编辑按钮,将manager_group添加进去。image.pngimage.png

    3. 页面下拉,单击Save按钮,查看是否添加成功。image.png

    4. 在Hue中通过dingyi查询数据。hue结果展示1

  2. 配置bigdata1_group组和zhouba用户,拥有bigdata1库所有权限。

    1. 单击步骤八创建出来的名为emr-hive的Hive Service。

    2. 点击右上角Add New Policy,如下图完成配置。image.png

    3. 页面下拉,单击Save按钮,查看是否添加成功。image.png

    4. 在Hue中通过zhouba查询bigdata1库中的数据。hue展示数据2

    5. 在Hue中通过zhouba查询bigdata2库中的数据。hue展示数据3

常见问题

Ranger同步LDAP用户/用户组信息异常

由于用户同步是通过User Sync开启LDAP认证实现的,所以正常情况下,用户同步不会有问题,大多数问题可能是,ranger上完全看不到LDAP中创建的用户组,或者个别用户没有用户组信息,可以到/mnt/disk1/log/ranger/usersync/下查看相应日志,前者可能属于配置参数有异常,后者可能属于用户组中添加的用户实际不存在,请仔细检查。

Ranger配置用户权限生效,配置用户组权限不生效

请检查步骤四,HDFS的配置是否有异常,可以查看active的namenode的日志,确认配置成功后,需要重启服务,并且通过命令验证是否生效hdfs groups <idapuser>

Hue执行sql异常

类似如下报错:

Bad status: 3 (Error validating the login) (code THRIFTTRANSPORT): TTransportException('Bad status: 3 (Error validating the login)',)。

请仔细检查步骤五,配置的代理用户账密信息无误,可以通过beeline验证。

beeline -u jdbc:hive2://emr-header-1:10000 -n hue -p <user_password>

如果认证不通过,请确认LDAP中hue账号是否被添加,或者密码是否正确,可以使用附件一“删除用户”脚本,删除hue账户,并重新添加。

附件一:LDAP脚本

LDAP的管理方法采用ldif文件的方式,下述脚本将ldif文件封装在了Shell脚本中,原理是通过admin账号对LDAP中的信息进行增删改查,因此在脚本中都需要输入admin_passwd(admin的密码,可在LDAP的配置中查看manager_password对应的值),建议可以先学习下LDAP的ldif相关内容(参考文章),后续运维能更熟悉方便。

添加用户

建议直接在控制台添加用户,会同步创建同名ldap用户和Linux用户。

若要使用命令行添加,使用如下脚本。

adduser.sh使用方法:sh adduser.sh admin_passwd user_name user_passwd

if [[ $# -ne 3 ]]
then
  echo "input error"
  echo "usage: sh adduser.sh admin_passwd user_name user_passwd"
  exit 1
fi
admin_passwd=$1
user_name=$2
user_passwd=$3

read -r -d '' VAR << EOM
dn: uid=$user_name,ou=people,o=emr
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
sn: $user_name
cn: $user_name
uid: $user_name
userPassword: $user_passwd
EOM

ldapadd -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"

删除用户

deluser.sh使用方法:sh deluser.sh admin_passwd user_name

if [[ $# -ne 2 ]]
then
  echo "input error"
  echo "usage: sh deluser.sh admin_passwd user_name"
  exit 1
fi
admin_passwd=$1
user_name=$2
read -r -d '' VAR << EOM
dn: uid=$user_name,ou=people,o=emr
changetype: delete
EOM

ldapmodify -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"

添加用户组

由于添加用户组的时候需要至少包含一个用户,所以输入参数包含一个用户名,后续再增加其他用户。

addgroup.sh使用方法:sh addgroup.sh admin_passwd group_name user_name​。

if [[ $# -ne 3 ]]
then
  echo "input error!"
  echo "usage: sh addgroup.sh admin_passwd group_name user_name"
  exit 1
fi
admin_passwd=$1
group_name=$2
group_user=$3

read -r -d '' VAR << EOM
dn: cn=$group_name,ou=groups,o=emr
objectclass: groupofnames
cn: $group_name
member: uid=$group_user,ou=people,o=emr
description: $group_name group
EOM

ldapadd -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"

删除用户组

delgroup.sh使用方法:sh delgroup.sh admin_passwd group_name

if [[ $# -ne 2 ]]
then
  echo "input error!"
  echo "usage: sh delgroup.sh admin_passwd group_name"
  exit 1
fi
admin_passwd=$1
group_name=$2

read -r -d '' VAR << EOM
dn: cn=$group_name,ou=groups,o=emr
changetype: delete
EOM

ldapmodify -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"

添加用户到用户组

adduser2group.sh使用方法:sh adduser2group.sh admin_passwd group_name user_name

if [[ $# -ne 3 ]]
then
  echo "input error!"
  echo "usage: sh adduser2group.sh admin_passwd group_name user_name"
  exit 1
fi

admin_passwd=$1
group_name=$2
user_name=$3

read -r -d '' VAR << EOM
dn: cn=$group_name,ou=groups,o=emr
changetype: modify
add: member
member: uid=$user_name,ou=people,o=emr
EOM

ldapmodify -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"

从用户组删除用户

deluseringroup.sh使用方法:sh deluseringroup.sh admin_passwd group_name user_name

if [[ $# -ne 3 ]]
then
  echo "input error!"
  echo "usage: sh deluseringroup.sh admin_passwd group_name user_name"
  exit 1
fi

admin_passwd=$1
group_name=$2
user_name=$3

read -r -d '' VAR << EOM
dn: cn=$group_name,ou=groups,o=emr
changetype: modify
delete: member
member: uid=$user_name,ou=people,o=emr
EOM

ldapmodify -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"

查看信息

user/group添加之后可以直接使用命令slapcat列出所有内容,若需要查看指定内容,可以使用ldapsearch,其使用命令类似上文脚本中的ldapaddldapmodify,例如:

  • 查看所有groups信息:ldapsearch -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w <admin_passwd> -b "ou=groups,o=emr"

  • 查看group=itpeople信息:ldapsearch -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w <admin_passwd> -b "cn=itpeople,ou=groups,o=emr"