Hadoop鉴权实战之Zeppelin+Ranger

  Seves

前言


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

  1. LDAP+Kerberos+Sentry

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

  1. 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上工作的呢?

对于 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的实现过程:

  1. LDAP安装配置
  2. Zeppelin集成LDAP
  3. 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

<property>  <name>zeppelin.anonymous.allowed</name>  <value>false</value>  <description>Anonymous user allowed by default</description></property>

2、配置shiro.ini

[users][main]ldapRealm = org.apache.zeppelin.realm.LdapRealmldapRealm.contextFactory.url = ldap://ip-172-16-15-101:389# 搜索人匹配: uid={0} 也可以是 cn={0},具体看 ldap 中怎么配置userldapRealm.userDnTemplate = uid={0},ou=People,dc=pupu,dc=comldapRealm.contextFactory.authenticationMechanism = simple# ldap管理账号ldapRealm.contextFactory.systemUsername= cn=Manager,dc=pupu,dc=com# ldap管理账户密码ldapRealm.contextFactory.systemPassword= Aojf+pupuni123ldapRealm.pagingSize = 200ldapRealm.authorizationEnabled=trueldapRealm.searchBase = dc=pupu,dc=com# 在 ou=People 域下面查找ldapRealm.userSearchBase = ou=People,dc=pupu,dc=com# dc=pupu,dc=com 是根目录,ou=group 是一个分支,意思在 Group 组下面查找ldapRealm.groupSearchBase = ou=Group,dc=pupu,dc=com# 创建 ldap 组的类名ldapRealm.groupObjectClass= posixGroupldapRealm.userLowerCase = trueldapRealm.userSearchScope = subtree;ldapRealm.groupSearchScope = subtree;# 如果为true的话 ,不使用 groupSearchFilte r配置的匹配条件 ldapRealm.groupSearchEnableMatchingRuleInChain = true# 第一个 admin 是 ldap 上的组的名字,第二个 admin 是 zeppelin 中role的名字(即管理员角色),若是有多个组映射以逗号隔开ldapRealm.rolesByGroup = admin: adminsessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManagercookie = org.apache.shiro.web.servlet.SimpleCookiecookie.name = JSESSIONIDcookie.httpOnly = true# cookie.secure = truesessionManager.sessionIdCookie = $cookiesecurityManager.sessionManager = $sessionManagersecurityManager.sessionManager.globalSessionTimeout = 86400000shiro.loginUrl = /api/login[roles]role1 = *admin = *[urls]/api/interpreter/setting/restart/** = authc/api/interpreter/** = authc, roles[admin]/api/configurations/** = authc, roles[admin]/api/credential/** = authc, roles[admin]/** = authc

这里特别注意一个参数:

ldapRealm.rolesByGroup = admin: admin

意思是admin组中的所有ldap用户都是zeppelin 管理员role,admin的ldif如下:

dn: cn=admin,ou=Group,dc=pupu,dc=comobjectClass: posixGroupobjectClass: topcn: admingidNumber: 510

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

# admin, People, pupu.comdn: uid=admin,ou=People,dc=pupu,dc=comuid: admincn: adminobjectClass: accountobjectClass: posixAccountobjectClass: topobjectClass: shadowAccountuserPassword: {SSHA}cDf+JEg19iFsOlf4B1BSpE0FWbHMo5cUshadowMin: 0shadowMax: 99999shadowWarning: 0loginShell: /bin/bashuidNumber: 510gidNumber: 510homeDirectory: /home/admin

3、验证

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

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中拉取组信息时使用的检索表达式为:

(&(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、解决方法

修改源码

org.apache.zeppelin.realm.LdapRealm

# 第一处修改private static final String MATCHING_RULE_IN_CHAIN_FORMAT =        "(&(objectClass=%s)(%s))";        # 第二处修改searchResultEnum = ldapCtx.search(        getGroupSearchBase(),        String.format(                MATCHING_RULE_IN_CHAIN_FORMAT,                groupObjectClass,                userDn.replace("uid","memberUid")),        searchControls);

**
**

重新编译打包

 # nohup mvn clean package -pl zeppelin-server -Denforcer.skip  -Dcheckstyle.skip -DskipRat -DskipTests > maven.log &;

编译时带上参数:-Denforcer.skip -Dcheckstyle.skip -DskipRat,不然mvn build过程会出错,编译完成后拷贝zeppelin-server jar包到zeppelin_home,并重启

# cp zeppelin-server/target/zeppelin-server-0.8.2.jar  $ZEPPELIN_HOME/lib/
## 重启zeppelin服务# initctl stop zeppelin# initctl start zeppelin

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

三、Ranger安装与集成LDAP


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

1、Ranger编译

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

1.1 下载Maven包

# wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.tar.gz

解压,并添加环境变量,同时修改maven的Java堆内存最大值,避免编译内存溢出

# tar -zxvf apache-maven-3.6.2-bin.tar.gz
# vim /etc/bashrcexport MAVEN_HOME=/opt/app/apache-maven-3.6.2export PATH=$PATH:$MAVEN_HOME/binMAVEN_OPTS=-Xmx2048mexport JAVA_HOME MAVEN_HOME MAVEN_OPTS JAVA_BIN PATH CLASSPATH

修改maven源为阿里源或其他源

# vim settings.xml<mirrors>   <mirror>     <id>nexus-aliyun</id>     <mirrorOf>central</mirrorOf>     <name>Nexus aliyun</name>     <url>http://maven.aliyun.com/nexus/content/groups/public</url>   </mirror>
   <mirror>     <id>CN</id>     <name>OSChina Central</name>     <url>http://maven.oschina.net/content/groups/public/</url>     <mirrorOf>central</mirrorOf>   </mirror>
   <mirror>     <id>alimaven</id>     <mirrorOf>central</mirrorOf>     <name>aliyun maven</name>     <url>https://maven.aliyun.com/nexus/content/repositories/central/</url>   </mirror>
   <mirror>     <id>jboss-public-repository-group</id>     <mirrorOf>central</mirrorOf>     <name>JBoss Public Repository Group</name>     <url>https://repository.jboss.org/nexus/content/groups/public</url>   </mirror></mirrors>

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

1.3 下载Ranger源码包及编译

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

# wget http://mirrors.tuna.tsinghua.edu.cn/apache/ranger/1.2.0/apache-ranger-1.2.0.tar.gz # tar -vxf apache-ranger-1.2.0.tar.gz # cd apache-ranger-1.2.0# nohup mvn clean compile package assembly:assembly install -DskipTests=true -Drat.skip=true -Dmaven.test.skip=true > maven.log &

编译成功如图:

编译时间比较久,可挂在后台执行,完成后,在当前目录下的target会生成相应的tar包文件,如下:

1.4 编译问题

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

2、Ranger-admin安装

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

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

character_set_server=utf8mb4collation-server=utf8mb4_unicode_ciinit_connect='SET NAMES utf8mb4'skip-character-set-client-handshake=true

2.1 mysql 增加用户及数据库

> create database ranger;> alter database ranger character set latin1; > create user 'rangeradmin'@'%' identified by '123456';> GRANT ALL PRIVILEGES ON ranger.* TO 'rangeradmin'@'%' IDENTIFIED BY '123456' with grant option;> flush privileges;

2.2 解压ranger-admin软件包

# cp ranger-1.2.0-admin.tar.gz /mnt/# cd /mnt/# tar -zxvf ranger-2.0.0-admin.tar.gz

2.3 修改install.properties文件

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

2.4 初始化ranger-admin

[root@ip-172-16-15-101 ranger-1.2.0-admin]# ./setup.sh

初始化结果如下则成功:

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

2.5 启动ranger-admin

# ranger-admin start 或者# ./ews/ranger-admin-services.sh start

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

[root@ip-172-16-15-101 ews]# ranger-admin startStarting Apache Ranger Admin ServiceApache Ranger Admin Service with pid 7326 has started.[root@ip-172-16-15-101 ews]# netstat -anpl|grep 6080tcp        0      0 :::6080                     :::*                        LISTEN      7326/java

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

3、Ranger userSync对接LDAP

3.1 解压

[root@ip-172-16-15-101 target]# cp ranger-1.2.0-usersync.tar.gz /mnt/[root@ip-172-16-15-101 mnt]# tar xvzf ranger-1.2.0-usersync.tar.gz

3.2 配置

编辑install.properties文件

基本配置

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

LDAP用户同步配置

SYNC_SOURCE = ldapSYNC_LDAP_URL = ldap://ip-172-16-15-101:389SYNC_LDAP_BIND_DN = cn=Manager,dc=pupu,dc=comSYNC_LDAP_BIND_PASSWORD = Aojf+pupuni123SYNC_LDAP_DELTASYNC = trueSYNC_LDAP_SEARCH_BASE = dc=pupu,dc=comSYNC_LDAP_USER_SEARCH_BASE = ou=People,dc=pupu,dc=comSYNC_LDAP_USER_SEARCH_SCOPE = subSYNC_LDAP_USER_OBJECT_CLASS = personSYNC_LDAP_USER_SEARCH_FILTER =SYNC_LDAP_USER_NAME_ATTRIBUTE = uidSYNC_LDAP_USER_GROUP_NAME_ATTRIBUTE = gidNumberSYNC_LDAP_USERNAME_CASE_CONVERSION=lower

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

用同步过来的用户登录

LDAP用户组同步配置

经过如上配置之后,Ranger已经将LDAP中的用户同步过来了,但是这些用户只同步了用户名信息,并没有同步LDAP中的用户组信息。如果希望在Ranger中设置Policy对组件进行授权的时候,也能对LDAP中的用户组进行权限统一设置,则需要同步LDAP中用户组中的信息。主要修改的配置如下所示。

SYNC_LDAP_GROUPNAME_CASE_CONVERSION=lowerSYNC_GROUP_SEARCH_ENABLED=trueSYNC_GROUP_USER_MAP_SYNC_ENABLED=trueSYNC_GROUP_SEARCH_BASE=ou=Group,dc=pupu,dc=comSYNC_GROUP_SEARCH_SCOPE=subSYNC_GROUP_OBJECT_CLASS=posixGroupSYNC_LDAP_GROUP_SEARCH_FILTER=SYNC_GROUP_NAME_ATTRIBUTE=cnSYNC_GROUP_MEMBER_ATTRIBUTE_NAME=memberUid

3.3 生效配置

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

# cd /mnt/ranger-1.2.0-usersync# sh setup.sh

安装成功后会提示

ranger.usersync.policymgr.password has been successfully created.org.apache.hadoop.security.alias.JavaKeyStoreProvider has been updated.

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

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

Caused by: java.io.FileNotFoundException: /etc/hadoop/conf.empty/core-site.xml (Permission denied)        at java.io.FileInputStream.open0(Native Method)        at java.io.FileInputStream.open(FileInputStream.java:195)

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

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

chmod 674 /etc/hadoop/conf/*chmod 674 /etc/hadoop/conf.empty/*

或者执行前下载文件替换

https://github.com/apache/ranger/blob/master/unixauthservice/scripts/setup.py

3.4 启动usersync服务

# ranger-usersync start或# cd /mnt/ranger-1.2.0-usersync/# ./ranger-usersync-services.sh start# ranger-usersync startStarting Apache Ranger Usersync ServiceApache Ranger Usersync Service with pid 19461 has started.

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

注意:userSync是以如下三个属性作为同步依据的,在phpLDAPadmin中创建用户时必须指定好

SYNC_LDAP_USER_NAME_ATTRIBUTE = uidSYNC_LDAP_USER_GROUP_NAME_ATTRIBUTE = gidNumberSYNC_GROUP_MEMBER_ATTRIBUTE_NAME=memberUid

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

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

执行

# ranger-usersync restart

userSync日志显示

29 七月 2020 16:07:40  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - LdapDeltaUserGroupBuilder updateSink started29 七月 2020 16:07:40  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - Performing user search first29 七月 2020 16:07:40  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - extendedUserSearchFilter = (&(objectclass=person)(|(uSNChanged>=0)(modifyTimestamp>=19700101080000Z)))29 七月 2020 16:07:40  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200722025220Zand currentDeltaSyncTime = 159535754000029 七月 2020 16:07:41  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - Updating user count: 1, userName: spark29 七月 2020 16:07:41  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200729071528Zand currentDeltaSyncTime = 159597812800029 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - Updating user count: 2, userName: hive29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200729073345Zand currentDeltaSyncTime = 159597922500029 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - Updating user count: 3, userName: wujy29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200729075855Zand currentDeltaSyncTime = 159598073500029 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - Updating user count: 4, userName: zhangsan29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - LdapDeltaUserGroupBuilder.getUsers() completed with user count: 429 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - extendedAllGroupsSearchFilter = (&(objectclass=posixGroup)(|(uSNChanged>=0)(modifyTimestamp>=19700101080000Z)))29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200721102445Zand currentDeltaSyncTime = 159529828500029 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - longUserName: admin, userName: admin29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - No. of members in the group admin = 129 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200729073432Zand currentDeltaSyncTime = 159597927200029 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - longUserName: wujy, userName: wujy29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - No. of members in the group role1 = 129 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - timeStampVal = 20200729080247Zand currentDeltaSyncTime = 159598096700029 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - longUserName: zhangsan, userName: zhangsan29 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - No. of members in the group role2 = 129 七月 2020 16:07:42  INFO LdapDeltaUserGroupBuilder [UnixUserSyncThread] - LdapDeltaUserGroupBuilder.getGroups() completed with group count: 329 七月 2020 16:07:43  INFO UserGroupSync [UnixUserSyncThread] - End: initial load of user/group from source==>sink29 七月 2020 16:07:43  INFO UserGroupSync [UnixUserSyncThread] - Done initializing user/group source and sink

注意:做ldap userSync的过程中,笔者发现新增的user/group通过userSync进程,貌似无法自动同步,每次同步时需要手动重启userSync进程,查阅资料时有发现以下这段话:

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节点并解压

# cp /mnt/apache-ranger-1.2.0/target/ranger-1.2.0-hdfs-plugin.tar.gz /mnt/# tar xvzf ranger-1.2.0-hdfs-plugin.tar.gz

4.1 修改install.properties

POLICY_MGR_URL=http://ip-172-16-15-101:6080# 配置hdfs的仓库名REPOSITORY_NAME=emr-hdfs    //指向ranger-admin中ServiceManager中创建的service name,不能随意配置# 配置hadoop组件的HADOOP_HOMECOMPONENT_INSTALL_DIR_NAME=/usr/lib/hadoop# 配置ranger-hdfs-plugin的所属用户、用户组CUSTOM_USER=hdfsCUSTOM_GROUP=hadoop

4.2 使ranger-hdfs-plugin生效

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

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

1> 修改/etc/hadoop/hdfs-site.xml,添加内容如下

    <property>        <name>dfs.permissions.enabled</name>        <value>true</value>    </property>    <property>        <name>dfs.permissions</name>        <value>true</value>    </property>    <property>        <name>dfs.namenode.inode.attributes.provider.class</name>        <value>org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer</value>    </property>

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

# ll /etc/hadoop/conf/|grep ranger-rw-rwxr--  1 hdfs hadoop  9550 7月  17 13:46 ranger-hdfs-audit.xml-rw-rwxr--  1 hdfs hadoop  3717 7月  17 13:46 ranger-hdfs-security.xml-rw-rwxr--  1 hdfs hadoop  1909 7月  17 13:46 ranger-policymgr-ssl.xml-rw-r--r--  1 hdfs hadoop    83 7月  17 13:46 ranger-security.xml

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

# ll /usr/lib/hadoop/share/hadoop/hdfs/lib/总用量 8lrwxrwxrwx 1 root root 57 7月  17 13:46 ranger-hdfs-plugin-impl -> /mnt/ranger-1.2.0-hdfs-plugin/lib/ranger-hdfs-plugin-impllrwxrwxrwx 1 root root 67 7月  17 13:46 ranger-hdfs-plugin-shim-1.2.0.jar -> /mnt/ranger-1.2.0-hdfs-plugin/lib/ranger-hdfs-plugin-shim-1.2.0.jarlrwxrwxrwx 1 root root 69 7月  17 13:46 ranger-plugin-classloader-1.2.0.jar -> /mnt/ranger-1.2.0-hdfs-plugin/lib/ranger-plugin-classloader-1.2.0.jar

4.3 重启HDFS-NameNode服务

EMR环境:

# initctl stop hadoop-hdfs-namenode# initctl start hadoop-hdfs-namenode

4.4 ranger-admin新建HDFS组件服务

标准集群填写

高安全集群---启用Kerberos,红框中内容需填写

填写完毕后点击“Test Connection”,测试HDFS插件是否正常

4.5 权限配置示例

已经将 Ranger 集成到 HDFS,现在可以进行相关的权限设置。例如给用户 root 授予 /user/spark 路径的写/执行权限:

单击上图中的 emr-hdfs 进入配置页面,配置相关权限

4.6 验证plugin部署是否成功

登录Ranger Admin ->Audit -> Plugins

查看策略拉取日志

除了页面上有记录,ranger-admin本地也会生成一份拉取文件,如下:

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

4.7 测试hdfs plugin

  • HDFS命令行操作验证

ranger未做权限授予前操作

## 访问# hadoop fs -ls /user/Found 8 itemsdrwxrwxrwx   - hadoop   hadoop          0 2020-07-14 11:16 /user/hadoopdrwxr-xr-x   - mapred   mapred          0 2020-07-14 11:16 /user/historydrwxrwxrwx   - hdfs     hadoop          0 2020-07-14 11:16 /user/hivedrwxrwxrwx   - livy     livy            0 2020-07-14 17:39 /user/livydrwxrwxrwx   - root     hadoop          0 2020-07-14 11:16 /user/rootdrwxrwxrwx   - spark    spark           0 2020-07-16 17:34 /user/sparkdrwxr-xr-x   - test     hadoop          0 2020-07-17 14:19 /user/test
## 写入# hadoop fs -put root.ldif /user/test/put: Permission denied: user=root, access=WRITE, inode="/user/test":test:hadoop:drwxr-xr-x# hadoop fs -mkdir -p /user/test/test1mkdir: Permission denied: user=root, access=WRITE, inode="/user/test":test:hadoop:drwxr-xr-x
## 删除# hadoop fs -rm -r /user/test/user.ldifrm: Permission denied: user=root, access=WRITE, inode="/user/test":test:hadoop:drwxr-xr-x

ranger做完权限授予后操作

## 写入# hadoop fs -put root.ldif /user/test/# hadoop fs -ls /user/test/Found 3 items-rw-r--r--   2 root hadoop        140 2020-07-17 14:32 /user/test/root.ldifdrwxr-xr-x   - root hadoop          0 2020-07-17 14:44 /user/test/test1-rw-r--r--   2 root hadoop        350 2020-07-17 14:19 /user/test/user.ldif
## 删除# hadoop fs -rm -r /user/test/root.ldifDeleted /user/test/root.ldif# hadoop fs -rm -r /user/test/test1Deleted /user/test/test1
## 查看# hadoop fs -ls /user/test/Found 1 items-rw-r--r--   2 root hadoop        350 2020-07-17 14:19 /user/test/user.ldif
  • zeppelin操作验证

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

创建temporary view语句

%sqlcreate 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未授予权限前操作

ranger授予权限后操作

权限校验通过。

四、小结


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

原文:

Zeppelin集成Ranger实现用户权限管控

本文链接:https://www.tech-field.org/articles/2020/09/15/1600155451400.html