分享

Hadoop用户权限管控实现之Zeppelin与Ranger集成应用

本帖最后由 levycui 于 2020-12-1 19:51 编辑
问题导读:
1、LDAP如何安装配置?
2、Zeppelin如何集成LDAP?
3、如何安装Ranger并且与集成LDAP?
4、如何测试hdfs plugin有效?


前言

在Hadoop生态中,典型的鉴权方案:

1、LDAP+Kerberos+Sentry

主要应用在CDH平台,支持 Hive、Impala、HDFS 等主流组件,不支持 Hbase、Yarn、Kafka、Storm等常见组件。

2、LDAP+Kerberos+Ranger

主要应用在Apache Hadoop或HDP平台,支持组件丰富,如 HDFS、HBase、Hive、Yarn、Kafka、Storm 等,Ranger提供丰富Rest Api,集成其他组件相对容易。

实际运行过程中,Kerberos解决的场景:
  •     服务认证过程有效地防止 broker datanode regionserver 等组件冒充加入集群。
  •     解决了服务端到服务端的认证的同时也解决了客户端到服务端的认证。

但它同时也存在短板,服务认证过程中为了安全性使用临时 ticket,认证信息会失效,用户多的情况下重新认证比较繁琐,对于服务而言太重了,也给运维过程带来比较多工作量。数据沙盒安全管控项目使用场景上更侧重于用户空间使用隔离,服务认证方面不是非常必须,`Ranger`自带的用户体系及权限管理控制服务能满足全部鉴权要求,理论上可以舍弃LDAP+Kerberos。

那么Ranger是怎么在HDFS上工作的呢?
2020-12-01_191254.jpg

对于 HDFS/YARN 这两者服务,默认打开Ranger鉴权模型后,先走Ranger策略,如果Ranger策略中没有相应策略,那么默认走底层 HDFS/YARN 自身的权限控制,即HDFS ACL和YARN自带的<用户-属组>提交队列鉴权。

方案设计说明

当前数据沙盒项目主要以Zeppelin作为服务入口,数据同步到HDFS后,无需维护表schema信息,用户直接使用sparksql读写文件,极为方便,且Zeppelin自身支持各种各样Interpreter使用,远比Hue使用场景更广。因此方案设计之初确定调研方向为Zeppelin+Ranger:

权限控制链路:
  •     Zeppelin --> Ranger认证 --> HDFS文件
  •     Zeppelin --> LDAP --> Ranger认证 --> HDFS文件


方案1:经咨询Apache Zeppelin PMC,目前Zeppelin社区没有直接集成Ranger案例,需开发实现用shrio适配ranger,对于笔者而言集成难度大,暂时不予考虑。

方案2:因Zeepelin shiro配置支持LDAP作为用户/组管理,Ranger也支持LDAP作为用户/组管理,所以将LDAP作为Zeepelin <--> Ranger之间的桥梁,实现用户/组集中管理,可行性高。

基于此,以下为方案2的实现过程:

  •     LDAP安装配置
  •     Zeppelin集成LDAP
  •     Ranger安装与集成LDAP

    注:本文中的所有操作实现均在AWS EMR上。


一、LDAP安装配置

    AWS EMR 操作系统镜像为Amazon Linux AMI release 2018.03,此系统镜像基于Centos6.x封装,安装不了FreeIPA,若能安装FreeIPA,能极大地提高OpenLDAP与LDAPadmin安装与运维过程效率。

安装配置过程参考笔者其他博文:



二、Zeppelin集成LDAP

1、修改zeppelin-site.xml
  1. <property>
  2.   <name>zeppelin.anonymous.allowed</name>
  3.   <value>false</value>
  4.   <description>Anonymous user allowed by default</description>
  5. </property>
复制代码

2、配置shiro.ini
  1. [users]
  2. [main]
  3. ldapRealm = org.apache.zeppelin.realm.LdapRealm
  4. ldapRealm.contextFactory.url = ldap://ip-172-16-15-101:389
  5. # 搜索人匹配: uid={0} 也可以是 cn={0},具体看 ldap 中怎么配置user
  6. ldapRealm.userDnTemplate = uid={0},ou=People,dc=pupu,dc=com
  7. ldapRealm.contextFactory.authenticationMechanism = simple
  8. # ldap管理账号
  9. ldapRealm.contextFactory.systemUsername= cn=Manager,dc=pupu,dc=com
  10. # ldap管理账户密码
  11. ldapRealm.contextFactory.systemPassword= Aojf+pupuni123
  12. ldapRealm.pagingSize = 200
  13. ldapRealm.authorizationEnabled=true
  14. ldapRealm.searchBase = dc=pupu,dc=com
  15. # 在 ou=People 域下面查找
  16. ldapRealm.userSearchBase = ou=People,dc=pupu,dc=com
  17. # dc=pupu,dc=com 是根目录,ou=group 是一个分支,意思在 Group 组下面查找
  18. ldapRealm.groupSearchBase = ou=Group,dc=pupu,dc=com
  19. # 创建 ldap 组的类名
  20. ldapRealm.groupObjectClass= posixGroup
  21. ldapRealm.userLowerCase = true
  22. ldapRealm.userSearchScope = subtree;
  23. ldapRealm.groupSearchScope = subtree;
  24. # 如果为true的话 ,不使用 groupSearchFilte r配置的匹配条件
  25. ldapRealm.groupSearchEnableMatchingRuleInChain = true
  26. # 第一个 admin 是 ldap 上的组的名字,第二个 admin 是 zeppelin 中role的名字(即管理员角色),若是有多个组映射以逗号隔开
  27. ldapRealm.rolesByGroup = admin: admin
  28. sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
  29. cookie = org.apache.shiro.web.servlet.SimpleCookie
  30. cookie.name = JSESSIONID
  31. cookie.httpOnly = true
  32. # cookie.secure = true
  33. sessionManager.sessionIdCookie = $cookie
  34. securityManager.sessionManager = $sessionManager
  35. securityManager.sessionManager.globalSessionTimeout = 86400000
  36. shiro.loginUrl = /api/login
  37. [roles]
  38. role1 = *
  39. admin = *
  40. [urls]
  41. /api/interpreter/setting/restart/** = authc
  42. /api/interpreter/** = authc, roles[admin]
  43. /api/configurations/** = authc, roles[admin]
  44. /api/credential/** = authc, roles[admin]
  45. /** = authc
复制代码

这里特别注意一个参数:

  1. ldapRealm.rolesByGroup = admin: admin
复制代码

意思是admin组中的所有ldap用户都是zeppelin 管理员role,admin的ldif如下:
  1. dn: cn=admin,ou=Group,dc=pupu,dc=com
  2. objectClass: posixGroup
  3. objectClass: top
  4. cn: admin
  5. gidNumber: 510
复制代码

可以通过ldapsearch看到这个组中包含admin用户,即zeppelin管理员,admin用户的ldif:

  1. # admin, People, pupu.com
  2. dn: uid=admin,ou=People,dc=pupu,dc=com
  3. uid: admin
  4. cn: admin
  5. objectClass: account
  6. objectClass: posixAccount
  7. objectClass: top
  8. objectClass: shadowAccount
  9. userPassword: {SSHA}cDf+JEg19iFsOlf4B1BSpE0FWbHMo5cU
  10. shadowMin: 0
  11. shadowMax: 99999
  12. shadowWarning: 0
  13. loginShell: /bin/bash
  14. uidNumber: 510
  15. gidNumber: 510
  16. homeDirectory: /home/admin
复制代码


3、验证

使用phpLDAPadmin将admin用户memberOf加到admin组,按照前面<1~2>步骤配置完,启动后使用admin用户登录,发现无法进入创建Interpreter页面,即没有admin权限,查看日志

  1. LoginRestApi.java[postLogin]:206) - {"status":"OK","message":"","body":{"principal":"admin","ticket":"227fb9e2-2833-48a5-92c2-9fb94d50db6d","roles":"[]"}}
复制代码

从日志可以看出roles为空,说明ldap group和zeppelin role没有映射成功,查看zeppelin LdapRealm这部分代码,发现zeppelin到ldap中拉取组信息时使用的检索表达式为:

  1. (objectClass=posixGroup)(member:1.2.840.113556.1.4.1941:=uid=admin)
复制代码

因为ldap组中使用memberUid保存用户的uid,所以这个表达式是无法检索到组信息,也就无法完成ldap group和zeppelin role的绑定。尝试过在shiro中将ldapRealm.groupSearchEnableMatchingRuleInChain参数项改成false,添加:ldapRealm.groupSearchFilter = (&(objectclass=posixGroup)(memberUid=uid={0},ou=People,dc=pupu,dc=com))以实现自定义搜索组信息,依旧无法检索到组信息,最后只能以如下修改zeppelin LdapRealm代码解决此问题。


4、解决方法

修改源码

  1. org.apache.zeppelin.realm.LdapRealm
  2. # 第一处修改
  3. private static final String MATCHING_RULE_IN_CHAIN_FORMAT =
  4.         "(&amp;(objectClass=%s)(%s))";
  5.         
  6. # 第二处修改
  7. searchResultEnum = ldapCtx.search(
  8.         getGroupSearchBase(),
  9.         String.format(
  10.                 MATCHING_RULE_IN_CHAIN_FORMAT,
  11.                 groupObjectClass,
  12.                 userDn.replace("uid","memberUid")),
  13.         searchControls);
复制代码

重新编译打包
  1. # nohup mvn clean package -pl zeppelin-server -Denforcer.skip  -Dcheckstyle.skip -DskipRat -DskipTests > maven.log &;
  2. 编译时带上参数:-Denforcer.skip  -Dcheckstyle.skip -DskipRat,不然mvn build过程会出错,编译完成后拷贝zeppelin-server jar包到zeppelin_home,并重启
  3. # cp zeppelin-server/target/zeppelin-server-0.8.2.jar  $ZEPPELIN_HOME/lib/
  4. ## 重启zeppelin服务
  5. # initctl stop zeppelin
  6. # initctl start zeppelin
复制代码

经过如上的操作,就可以快乐地在LDAP上做用户/用户组管理,不用每次苦逼地修改shiro.ini配置,然后重启zeppelin使配置生效。


三、Ranger安装与集成LDAP

Apache Ranger是大数据领域的一个集中式安全管理框架,目的是通过制定策略(policies)实现对Hadoop组件的集中式安全管理。用户可以通过Ranger实现对集群中数据的安全访问。Ranger架构流程图:
2020-12-01_191333.jpg

1、Ranger编译

Ranger官网源码包版本,不提供二进制安装包,故需要maven编译。


1.1 下载Maven包

  1. # wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.tar.gz
  2. 解压,并添加环境变量,同时修改maven的Java堆内存最大值,避免编译内存溢出
  3. # tar -zxvf apache-maven-3.6.2-bin.tar.gz
  4. # vim /etc/bashrc
  5. export MAVEN_HOME=/opt/app/apache-maven-3.6.2
  6. export PATH=$PATH:$MAVEN_HOME/bin
  7. MAVEN_OPTS=-Xmx2048m
  8. export JAVA_HOME MAVEN_HOME MAVEN_OPTS JAVA_BIN PATH CLASSPATH
复制代码
修改maven源为阿里源或其他源

  1. # vim settings.xml
  2. <mirrors>
  3.    <mirror>
  4.      <id>nexus-aliyun</id>
  5.      <mirrorOf>central</mirrorOf>
  6.      <name>Nexus aliyun</name>
  7.      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
  8.    </mirror>
  9.    <mirror>
  10.      <id>CN</id>
  11.      <name>OSChina Central</name>
  12.      <url>http://maven.oschina.net/content/groups/public/</url>
  13.      <mirrorOf>central</mirrorOf>
  14.    </mirror>
  15.    <mirror>
  16.      <id>alimaven</id>
  17.      <mirrorOf>central</mirrorOf>
  18.      <name>aliyun maven</name>
  19.      <url>https://maven.aliyun.com/nexus/content/repositories/central/</url>
  20.    </mirror>
  21.    <mirror>
  22.      <id>jboss-public-repository-group</id>
  23.      <mirrorOf>central</mirrorOf>
  24.      <name>JBoss Public Repository Group</name>
  25.      <url>https://repository.jboss.org/nexus/content/groups/public</url>
  26.    </mirror>
  27. </mirrors>
复制代码

1.2  确保系统环境有安装git和python2


1.3  下载Ranger源码包及编译


下载 range-1.2.0 源码进行编译,初次编译耗时可能较长,可以放在后台执行,相应包会生成在 target 目录下。

  1. # wget http://mirrors.tuna.tsinghua.edu.cn/apache/ranger/1.2.0/apache-ranger-1.2.0.tar.gz
  2. # tar -vxf apache-ranger-1.2.0.tar.gz
  3. # cd apache-ranger-1.2.0
  4. # nohup mvn clean compile package assembly:assembly install -DskipTests=true -Drat.skip=true -Dmaven.test.skip=true > maven.log &
复制代码
编译成功如图:
64011.jpg
编译时间比较久,可挂在后台执行,完成后,在当前目录下的target会生成相应的tar包文件,如下:
64011.jpg

1.4  编译问题
2020-12-01_191728.jpg

解决办法:这里需要检查是否编译的机器是否安装了git,安装的是否是python2,不能安装python3。

2、Ranger-admin安装

安装ranger-admin的机器可以不在Hadoop集群内部,可以是随便一台。

数据库字符集设置:/etc/my.cnf --> [mysqld]增加如下内容

  1. character_set_server=utf8mb4
  2. collation-server=utf8mb4_unicode_ci
  3. init_connect='SET NAMES utf8mb4'
  4. skip-character-set-client-handshake=true
复制代码

2.1  mysql 增加用户及数据库

  1. > create database ranger;
  2. > alter database ranger character set latin1;
  3. > create user 'rangeradmin'@'%' identified by '123456';
  4. > GRANT ALL PRIVILEGES ON ranger.* TO 'rangeradmin'@'%' IDENTIFIED BY '123456' with grant option;
  5. > flush privileges;
复制代码

2.2  解压ranger-admin软件包

  1. # cp ranger-1.2.0-admin.tar.gz /mnt/
  2. # cd /mnt/
  3. # tar -zxvf ranger-2.0.0-admin.tar.gz
复制代码

2.3  修改install.properties文件

  1. # vim install.properties
  2. 1)数据库配置
  3. DB_FLAVOR=MYSQL #指明使用数据库类型
  4. SQL_CONNECTOR_JAR=/usr/share/java/mariadb-connector-java.jar #数据库连接驱动
  5. db_root_user=root                  #数据库root用户名
  6. db_root_password=UoJOaqenjua129+   #数据库密码
  7. db_host=ip-172-16-15-101           #数据库主机
  8. # 以下三个属性是用于设置ranger数据库的
  9. db_name=ranger                     #数据库名
  10. db_user=rangeradmin                #管理该数据库用户
  11. db_password=123456                 #密码
  12. # 不需要保存,为空,否则生成的数据库密码为'_'
  13. cred_keystore_filename=
  14. 2) 审计日志, 如果没有安装solr,对应的属性值为空即可
  15. audit_store=
  16. audit_solr_urls=
  17. audit_solr_user=
  18. audit_solr_password=
  19. audit_solr_zookeepers=
  20. 3)策略管理配置,配置ip和端口,默认即可
  21. policymgr_external_url=http://ip-172-16-15-101:6080
  22. 4) 配置hadoop集群的core-site.xml文件,把core-site.xml文件拷贝到该目录
  23. hadoop_conf=/etc/hadoop/conf
  24. 5) rangerAdmin、rangerTagSync、rangerUsersync、keyadmin密码配置。默认为空,可以不配,对应的内部组件该属性也要为空
  25. rangerAdmin_password=
  26. rangerTagsync_password=
  27. rangerUsersync_password=
  28. keyadmin_password=
复制代码

2.4  初始化ranger-admin

  1. [root@ip-172-16-15-101 ranger-1.2.0-admin]# ./setup.sh
复制代码

初始化结果如下则成功:
2020-12-01_191800.jpg

接着,运行 set_globals.sh 设置环境变量。

2.5  启动ranger-admin
  1. # ranger-admin start
  2. 或者
  3. # ./ews/ranger-admin-services.sh start
复制代码

Ranger的默认端口是6080,如下则表明程序正常启动

  1. [root@ip-172-16-15-101 ews]# ranger-admin start
  2. Starting Apache Ranger Admin Service
  3. Apache Ranger Admin Service with pid 7326 has started.
  4. [root@ip-172-16-15-101 ews]# netstat -anpl|grep 6080
  5. tcp        0      0 :::6080                     :::*                        LISTEN      7326/java
复制代码

查看Ranger Admin Server运行的日志情况,日志路径默认为 ews/log , 软链接到 /var/log/ranger/admin,启动后浏览器连接:http://ip:6080 ,默认登录界面用户名和密码为:admin/admin,登录进去界面如下:
2020-12-01_191931.jpg

3、Ranger userSync对接LDAP

3.1 解压

  1. [root@ip-172-16-15-101 target]# cp ranger-1.2.0-usersync.tar.gz /mnt/
  2. [root@ip-172-16-15-101 mnt]# tar xvzf ranger-1.2.0-usersync.tar.gz
复制代码

3.2  配置

编辑install.properties文件

基本配置

  1. # 配置ranger admin的地址
  2. POLICY_MGR_URL = http://ip-172-16-15-101:6080
  3. # 同步间隔时间(min/单位)
  4. SYNC_INTERVAL = 1
  5. # 配置hadoop的core-site.xml路径
  6. hadoop_conf=/etc/hadoop/conf
  7. # 配置usersync的log路径
  8. logdir=/var/log/ranger/usersync/
复制代码

LDAP用户同步配置
  1. SYNC_SOURCE = ldap
  2. SYNC_LDAP_URL = ldap://ip-172-16-15-101:389
  3. SYNC_LDAP_BIND_DN = cn=Manager,dc=pupu,dc=com
  4. SYNC_LDAP_BIND_PASSWORD = Aojf+pupuni123
  5. SYNC_LDAP_DELTASYNC = true
  6. SYNC_LDAP_SEARCH_BASE = dc=pupu,dc=com
  7. SYNC_LDAP_USER_SEARCH_BASE = ou=People,dc=pupu,dc=com
  8. SYNC_LDAP_USER_SEARCH_SCOPE = sub
  9. SYNC_LDAP_USER_OBJECT_CLASS = person
  10. SYNC_LDAP_USER_SEARCH_FILTER =
  11. SYNC_LDAP_USER_NAME_ATTRIBUTE = uid
  12. SYNC_LDAP_USER_GROUP_NAME_ATTRIBUTE = gidNumber
  13. SYNC_LDAP_USERNAME_CASE_CONVERSION=lower
复制代码

将上述配置生效后,LDAP中的用户即可同步到Ranger上,并且能登录Ranger-admin WEB平台,带"External"标识的就是从外部LDAP同步过来。
2020-12-01_192001.jpg

用同步过来的用户登录
2020-12-01_192030.jpg

LDAP用户组同步配置

经过如上配置之后,Ranger已经将LDAP中的用户同步过来了,但是这些用户只同步了用户名信息,并没有同步LDAP中的用户组信息。如果希望在Ranger中设置Policy对组件进行授权的时候,也能对LDAP中的用户组进行权限统一设置,则需要同步LDAP中用户组中的信息。主要修改的配置如下所示。
  1. SYNC_LDAP_GROUPNAME_CASE_CONVERSION=lower
  2. SYNC_GROUP_SEARCH_ENABLED=true
  3. SYNC_GROUP_USER_MAP_SYNC_ENABLED=true
  4. SYNC_GROUP_SEARCH_BASE=ou=Group,dc=pupu,dc=com
  5. SYNC_GROUP_SEARCH_SCOPE=sub
  6. SYNC_GROUP_OBJECT_CLASS=posixGroup
  7. SYNC_LDAP_GROUP_SEARCH_FILTER=
  8. SYNC_GROUP_NAME_ATTRIBUTE=cn
  9. SYNC_GROUP_MEMBER_ATTRIBUTE_NAME=memberUid
复制代码

3.3  生效配置

配置好以上内容之后,需要在ranger-admin安装节点的/mnt/ranger-1.2.0-usersync路径下执行setup.sh:

  1. # cd /mnt/ranger-1.2.0-usersync
  2. # sh setup.sh
复制代码

安装成功后会提示

  1. ranger.usersync.policymgr.password has been successfully created.
  2. org.apache.hadoop.security.alias.JavaKeyStoreProvider has been updated.
复制代码

修改的配置在/etc/ranger/usersync/conf/ranger-ugsync-site.xml中生效。

注意:这一步操作可能会修改hadoop_conf文件权限,导致下步操作namenode启动异常:

  1. Caused by: java.io.FileNotFoundException: /etc/hadoop/conf.empty/core-site.xml (Permission denied)
  2.         at java.io.FileInputStream.open0(Native Method)
  3.         at java.io.FileInputStream.open(FileInputStream.java:195)
复制代码

原因:https://issues.apache.org/jira/browse/RANGER-2671

若是出现异常,可手动修改/etc/hadoop/conf和/etc/hadoop/conf.empty权限

  1. chmod 674 /etc/hadoop/conf/*
  2. chmod 674 /etc/hadoop/conf.empty/*
复制代码

或者执行前下载文件替换
  1. https://github.com/apache/ranger/blob/master/unixauthservice/scripts/setup.py
复制代码

3.4  启动usersync服务

  1. # ranger-usersync start
  2. # cd /mnt/ranger-1.2.0-usersync/
  3. # ./ranger-usersync-services.sh start
  4. # ranger-usersync start
  5. Starting Apache Ranger Usersync Service
  6. Apache Ranger Usersync Service with pid 19461 has started.
复制代码

在phpLDAPadmin中,创建user/group,并做用户归属配置后,再进行usersync(ranger-usersync 重启),可以看到LDAP中用户/用户组已同步过来
2020-12-01_192125.jpg

注意:userSync是以如下三个属性作为同步依据的,在phpLDAPadmin中创建用户时必须指定好
  1. SYNC_LDAP_USER_NAME_ATTRIBUTE = uid
  2. SYNC_LDAP_USER_GROUP_NAME_ATTRIBUTE = gidNumber
  3. SYNC_GROUP_MEMBER_ATTRIBUTE_NAME=memberUid
复制代码

3.5  新增用户/用户组并同步示例

如新增一个用户:zhangsan,一个组:role2,并把zhangsan归属到role2

2020-12-01_192224.jpg

2020-12-01_192249.jpg
2020-12-01_192315.jpg
执行
  1. # ranger-usersync restart
  2. userSync日志显示
  3. 29 七月 2020 16:07:40  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - LdapDeltaUserGroupBuilder updateSink started
  4. 29 七月 2020 16:07:40  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - Performing user search first
  5. 29 七月 2020 16:07:40  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - extendedUserSearchFilter = (&amp;(objectclass=person)(|(uSNChanged&gt;=0)(modifyTimestamp&gt;=19700101080000Z)))
  6. 29 七月 2020 16:07:40  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200722025220Zand currentDeltaSyncTime = 1595357540000
  7. 29 七月 2020 16:07:41  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - Updating user count: 1, userName: spark
  8. 29 七月 2020 16:07:41  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200729071528Zand currentDeltaSyncTime = 1595978128000
  9. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - Updating user count: 2, userName: hive
  10. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200729073345Zand currentDeltaSyncTime = 1595979225000
  11. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - Updating user count: 3, userName: wujy
  12. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200729075855Zand currentDeltaSyncTime = 1595980735000
  13. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - Updating user count: 4, userName: zhangsan
  14. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - LdapDeltaUserGroupBuilder.getUsers() completed with user count: 4
  15. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - extendedAllGroupsSearchFilter = (&amp;(objectclass=posixGroup)(|(uSNChanged&gt;=0)(modifyTimestamp&gt;=19700101080000Z)))
  16. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200721102445Zand currentDeltaSyncTime = 1595298285000
  17. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - longUserName: admin, userName: admin
  18. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - No. of members in the group admin = 1
  19. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200729073432Zand currentDeltaSyncTime = 1595979272000
  20. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - longUserName: wujy, userName: wujy
  21. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - No. of members in the group role1 = 1
  22. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200729080247Zand currentDeltaSyncTime = 1595980967000
  23. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - longUserName: zhangsan, userName: zhangsan
  24. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - No. of members in the group role2 = 1
  25. 29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - LdapDeltaUserGroupBuilder.getGroups() completed with group count: 3
  26. 29 七月 2020 16:07:43  INFO UserGroupSync [UnixUserSyncThread] - End: initial load of user/group from source==&gt;sink
  27. 29 七月 2020 16:07:43  INFO UserGroupSync [UnixUserSyncThread] - Done initializing user/group source and sink
复制代码


2020-12-01_192424.jpg

注意:做ldap userSync的过程中,笔者发现新增的user/group通过userSync进程,貌似无法自动同步,每次同步时需要手动重启userSync进程,查阅资料时有发现以下这段话:
  1.     Ranger-Usersync process syncs the added users in particular time interval which is in minutes; By default it is set to 5 minutes.The property name is “SYNC_INTERVAL”. So it will sync newly added user after that interval or you have restart ranger-usersync.
复制代码

因此LDAP方式userSync自动同步方案还有待考证。


4、安装ranger hdfs plugin

将ranger-1.2.0-hdfs-plugin软件包拷贝到namenode节点并解压
  1. # cp /mnt/apache-ranger-1.2.0/target/ranger-1.2.0-hdfs-plugin.tar.gz /mnt/
  2. # tar xvzf ranger-1.2.0-hdfs-plugin.tar.gz
复制代码

4.1 修改install.properties
  1. POLICY_MGR_URL=http://ip-172-16-15-101:6080
  2. # 配置hdfs的仓库名
  3. REPOSITORY_NAME=emr-hdfs    //指向ranger-admin中ServiceManager中创建的service name,不能随意配置
  4. # 配置hadoop组件的HADOOP_HOME
  5. COMPONENT_INSTALL_DIR_NAME=/usr/lib/hadoop
  6. # 配置ranger-hdfs-plugin的所属用户、用户组
  7. CUSTOM_USER=hdfs
  8. CUSTOM_GROUP=hadoop
复制代码

4.2 使ranger-hdfs-plugin生效

  1. # ./enable-hdfs-plugin.sh
  2. Custom user and group is available, using custom user and group.
  3. + 2020年 07月 16日 星期四 17:56:50 CST : hadoop: lib
  4. ……
  5. ……
  6. + 2020年 07月 16日 星期四 17:56:51 CST : Saving current JCE file: /etc/ranger/hadoopdev/cred.jceks to /etc/ranger/hadoopdev/.cred.jceks.20200716175651 ...
  7. Ranger Plugin for hadoop has been enabled. Please restart hadoop to ensure that changes are effective.
复制代码

这一步enable-hdfs-plugin.sh操作,本质上是执行以下几步操作:

  1. 1> 修改/etc/hadoop/hdfs-site.xml,添加内容如下
  2.     <property>
  3.         <name>dfs.permissions.enabled</name>
  4.         <value>true</value>
  5.     </property>
  6.     <property>
  7.         <name>dfs.permissions</name>
  8.         <value>true</value>
  9.     </property>
  10.     <property>
  11.         <name>dfs.namenode.inode.attributes.provider.class</name>
  12.         <value>org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer</value>
  13.     </property>
复制代码

2> 在/etc/hadoop/conf下增加ranger配置文件

  1. # ll /etc/hadoop/conf/|grep ranger
  2. -rw-rwxr--  1 hdfs hadoop  9550 7月  17 13:46 ranger-hdfs-audit.xml
  3. -rw-rwxr--  1 hdfs hadoop  3717 7月  17 13:46 ranger-hdfs-security.xml
  4. -rw-rwxr--  1 hdfs hadoop  1909 7月  17 13:46 ranger-policymgr-ssl.xml
  5. -rw-r--r--  1 hdfs hadoop    83 7月  17 13:46 ranger-security.xml
复制代码

3> 将对应jar包软连接到hadoop_home下

  1. # ll /usr/lib/hadoop/share/hadoop/hdfs/lib/
  2. 总用量 8
  3. lrwxrwxrwx 1 root root 57 7月  17 13:46 ranger-hdfs-plugin-impl -&gt; /mnt/ranger-1.2.0-hdfs-plugin/lib/ranger-hdfs-plugin-impl
  4. lrwxrwxrwx 1 root root 67 7月  17 13:46 ranger-hdfs-plugin-shim-1.2.0.jar -&gt; /mnt/ranger-1.2.0-hdfs-plugin/lib/ranger-hdfs-plugin-shim-1.2.0.jar
  5. lrwxrwxrwx 1 root root 69 7月  17 13:46 ranger-plugin-classloader-1.2.0.jar -&gt; /mnt/ranger-1.2.0-hdfs-plugin/lib/ranger-plugin-classloader-1.2.0.jar
复制代码

4.3 重启HDFS-NameNode服务

  1. EMR环境:
  2. # initctl stop hadoop-hdfs-namenode
  3. # initctl start hadoop-hdfs-namenode
复制代码

4.4 ranger-admin新建HDFS组件服务
2020-12-01_192459.jpg

标准集群填写
2020-12-01_192525.jpg
高安全集群---启用Kerberos,红框中内容需填写
2020-12-01_192551.jpg
填写完毕后点击“Test Connection”,测试HDFS插件是否正常
2020-12-01_192617.jpg

4.5 权限配置示例

已经将 Ranger 集成到 HDFS,现在可以进行相关的权限设置。例如给用户 root 授予 /user/spark 路径的写/执行权限:
2020-12-01_192649.jpg
单击上图中的 emr-hdfs 进入配置页面,配置相关权限
2020-12-01_192717.jpg
2020-12-01_192737.jpg

4.6 验证plugin部署是否成功

登录Ranger Admin ->Audit -> Plugins

查看策略拉取日志
2020-12-01_192806.jpg
除了页面上有记录,ranger-admin本地也会生成一份拉取文件,如下:

  1. # ll /etc/ranger/emr-hdfs/policycache/
  2. 总用量 12
  3. -rw-r--r-- 1 hdfs hdfs 8677 7月  17 13:49 hdfs_emr-hdfs.json
  4. 内容:
  5. {
  6.   "serviceName": "emr-hdfs",
  7.   "serviceId": 1,
  8.   "policyVersion": 15,
  9.   "policyUpdateTime": "20200724-09:17:32.000-+0800",
  10.   "policies": [  
  11.    中间略……
  12.     "id": 1,
  13.     "guid": "0d047247-bafe-4cf8-8e9b-d5d377284b2d",
  14.     "isEnabled": true,
  15.     "createTime": "20200715-11:51:52.000-+0800",
  16.     "updateTime": "20200715-11:51:52.000-+0800",
  17.     "version": 1
  18.   },
  19.   "auditMode": "audit-default"
  20. }
复制代码

4.7 测试hdfs plugin

    HDFS命令行操作验证

ranger未做权限授予前操作

  1. ## 访问
  2. # hadoop fs -ls /user/
  3. Found 8 items
  4. drwxrwxrwx   - hadoop   hadoop          0 2020-07-14 11:16 /user/hadoop
  5. drwxr-xr-x   - mapred   mapred          0 2020-07-14 11:16 /user/history
  6. drwxrwxrwx   - hdfs     hadoop          0 2020-07-14 11:16 /user/hive
  7. drwxrwxrwx   - livy     livy            0 2020-07-14 17:39 /user/livy
  8. drwxrwxrwx   - root     hadoop          0 2020-07-14 11:16 /user/root
  9. drwxrwxrwx   - spark    spark           0 2020-07-16 17:34 /user/spark
  10. drwxr-xr-x   - test     hadoop          0 2020-07-17 14:19 /user/test
  11. ## 写入
  12. # hadoop fs -put root.ldif /user/test/
  13. put: Permission denied: user=root, access=WRITE, inode="/user/test":test:hadoop:drwxr-xr-x
  14. # hadoop fs -mkdir -p /user/test/test1
  15. mkdir: Permission denied: user=root, access=WRITE, inode="/user/test":test:hadoop:drwxr-xr-x
  16. ## 删除
  17. # hadoop fs -rm -r /user/test/user.ldif
  18. rm: Permission denied: user=root, access=WRITE, inode="/user/test":test:hadoop:drwxr-xr-x
复制代码

ranger做完权限授予后操作

  1. ## 写入
  2. # hadoop fs -put root.ldif /user/test/
  3. # hadoop fs -ls /user/test/
  4. Found 3 items
  5. -rw-r--r--   2 root hadoop        140 2020-07-17 14:32 /user/test/root.ldif
  6. drwxr-xr-x   - root hadoop          0 2020-07-17 14:44 /user/test/test1
  7. -rw-r--r--   2 root hadoop        350 2020-07-17 14:19 /user/test/user.ldif
  8. ## 删除
  9. # hadoop fs -rm -r /user/test/root.ldif
  10. Deleted /user/test/root.ldif
  11. # hadoop fs -rm -r /user/test/test1
  12. Deleted /user/test/test1
  13. ## 查看
  14. # hadoop fs -ls /user/test/
  15. Found 1 items
  16. -rw-r--r--   2 root hadoop        350 2020-07-17 14:19 /user/test/user.ldif
复制代码

    zeppelin操作验证

    通过HDFS创建目录或文件时,不注意的话是 `644` 权限,那么非目录/文件所属用户是可读的,为彻底隔离,对目录/文件应授予 `600` 权限。

创建temporary view语句

  1. %sql
  2. create or replace temporary view table1 USING parquet options (path "hdfs://ip-172-16-15-101.cn-north-1.compute.internal:8020/user/test/f3a4b0ca-5d84-441c-975c-5c9361c9a009-0_0-62-881_20200721232550.parquet")
复制代码

ranger未授予权限前操作
2020-12-01_192852.jpg

权限校验通过。


四、小结

自此 Zeppelin --> LDAP --> Ranger 用户权限管控链路打通,只需在LDAP上创建用户/用户组,即可同步到Zeepelin和Ranger组件。以上就是整个Zeppelin集成Ranger实现用户权限管控实现的具体过程,文章篇幅较长,操作记录也相对较多,其中每一步操作都是笔者亲自验证过,可确保整套方案的落地可行性。稍有遗憾的是Ranger userSync自动同步用户/组尚待验证,之后若是验证通过了,再做补充。

作者:吴建阳
来源:https://mp.weixin.qq.com/s/9Qaz8BH5M-fM0QgINTh3DA

最新经典文章,欢迎关注公众号

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条