levycui 发表于 2020-12-1 19:28:22

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


对于 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安装与运维过程效率。

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


[*]    OpenLDAP安装与配置使用
[*]    https://blog.csdn.net/u010543388/article/details/107673685
[*]    phpLDAPadmin安装及配置使用
[*]    https://blog.csdn.net/u010543388/article/details/107682769


二、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


ldapRealm = org.apache.zeppelin.realm.LdapRealm
ldapRealm.contextFactory.url = ldap://ip-172-16-15-101:389
# 搜索人匹配: uid={0} 也可以是 cn={0},具体看 ldap 中怎么配置user
ldapRealm.userDnTemplate = uid={0},ou=People,dc=pupu,dc=com
ldapRealm.contextFactory.authenticationMechanism = simple
# ldap管理账号
ldapRealm.contextFactory.systemUsername= cn=Manager,dc=pupu,dc=com
# ldap管理账户密码
ldapRealm.contextFactory.systemPassword= Aojf+pupuni123
ldapRealm.pagingSize = 200
ldapRealm.authorizationEnabled=true
ldapRealm.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= posixGroup
ldapRealm.userLowerCase = true
ldapRealm.userSearchScope = subtree;
ldapRealm.groupSearchScope = subtree;
# 如果为true的话 ,不使用 groupSearchFilte r配置的匹配条件
ldapRealm.groupSearchEnableMatchingRuleInChain = true
# 第一个 admin 是 ldap 上的组的名字,第二个 admin 是 zeppelin 中role的名字(即管理员角色),若是有多个组映射以逗号隔开
ldapRealm.rolesByGroup = admin: admin
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
cookie = org.apache.shiro.web.servlet.SimpleCookie
cookie.name = JSESSIONID
cookie.httpOnly = true
# cookie.secure = true
sessionManager.sessionIdCookie = $cookie
securityManager.sessionManager = $sessionManager
securityManager.sessionManager.globalSessionTimeout = 86400000
shiro.loginUrl = /api/login

role1 = *
admin = *

/api/interpreter/setting/restart/** = authc
/api/interpreter/** = authc, roles
/api/configurations/** = authc, roles
/api/credential/** = authc, roles
/** = authc
这里特别注意一个参数:

ldapRealm.rolesByGroup = admin: admin
意思是admin组中的所有ldap用户都是zeppelin 管理员role,admin的ldif如下:
dn: cn=admin,ou=Group,dc=pupu,dc=com
objectClass: posixGroup
objectClass: top
cn: admin
gidNumber: 510
可以通过ldapsearch看到这个组中包含admin用户,即zeppelin管理员,admin用户的ldif:

# admin, People, pupu.com
dn: uid=admin,ou=People,dc=pupu,dc=com
uid: admin
cn: admin
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {SSHA}cDf+JEg19iFsOlf4B1BSpE0FWbHMo5cU
shadowMin: 0
shadowMax: 99999
shadowWarning: 0
loginShell: /bin/bash
uidNumber: 510
gidNumber: 510
homeDirectory: /home/admin

3、验证

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

LoginRestApi.java: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 =
      "(&amp;(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/bashrc
export MAVEN_HOME=/opt/app/apache-maven-3.6.2
export PATH=$PATH:$MAVEN_HOME/bin
MAVEN_OPTS=-Xmx2048m
export 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 --> 增加如下内容

character_set_server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake=true
2.1mysql 增加用户及数据库

> 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.properties
1)数据库配置
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

# ./setup.sh
初始化结果如下则成功:


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

2.5启动ranger-admin

# ranger-admin start
或者
# ./ews/ranger-admin-services.sh start
Ranger的默认端口是6080,如下则表明程序正常启动

# ranger-admin start
Starting Apache Ranger Admin Service
Apache Ranger Admin Service with pid 7326 has started.
# netstat -anpl|grep 6080
tcp      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 解压

# cp ranger-1.2.0-usersync.tar.gz /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 = ldap
SYNC_LDAP_URL = ldap://ip-172-16-15-101:389
SYNC_LDAP_BIND_DN = cn=Manager,dc=pupu,dc=com
SYNC_LDAP_BIND_PASSWORD = Aojf+pupuni123
SYNC_LDAP_DELTASYNC = true
SYNC_LDAP_SEARCH_BASE = dc=pupu,dc=com
SYNC_LDAP_USER_SEARCH_BASE = ou=People,dc=pupu,dc=com
SYNC_LDAP_USER_SEARCH_SCOPE = sub
SYNC_LDAP_USER_OBJECT_CLASS = person
SYNC_LDAP_USER_SEARCH_FILTER =
SYNC_LDAP_USER_NAME_ATTRIBUTE = uid
SYNC_LDAP_USER_GROUP_NAME_ATTRIBUTE = gidNumber
SYNC_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=lower
SYNC_GROUP_SEARCH_ENABLED=true
SYNC_GROUP_USER_MAP_SYNC_ENABLED=true
SYNC_GROUP_SEARCH_BASE=ou=Group,dc=pupu,dc=com
SYNC_GROUP_SEARCH_SCOPE=sub
SYNC_GROUP_OBJECT_CLASS=posixGroup
SYNC_LDAP_GROUP_SEARCH_FILTER=
SYNC_GROUP_NAME_ATTRIBUTE=cn
SYNC_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 start
Starting Apache Ranger Usersync Service
Apache Ranger Usersync Service with pid 19461 has started.
在phpLDAPadmin中,创建user/group,并做用户归属配置后,再进行usersync(ranger-usersync 重启),可以看到LDAP中用户/用户组已同步过来


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

SYNC_LDAP_USER_NAME_ATTRIBUTE = uid
SYNC_LDAP_USER_GROUP_NAME_ATTRIBUTE = gidNumber
SYNC_GROUP_MEMBER_ATTRIBUTE_NAME=memberUid

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

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





执行
# ranger-usersync restart

userSync日志显示

29 七月 2020 16:07:40INFO LdapDeltaUserGroupBuilder - LdapDeltaUserGroupBuilder updateSink started
29 七月 2020 16:07:40INFO LdapDeltaUserGroupBuilder - Performing user search first
29 七月 2020 16:07:40INFO LdapDeltaUserGroupBuilder - extendedUserSearchFilter = (&amp;(objectclass=person)(|(uSNChanged&gt;=0)(modifyTimestamp&gt;=19700101080000Z)))
29 七月 2020 16:07:40INFO LdapDeltaUserGroupBuilder - timeStampVal = 20200722025220Zand currentDeltaSyncTime = 1595357540000
29 七月 2020 16:07:41INFO LdapDeltaUserGroupBuilder - Updating user count: 1, userName: spark
29 七月 2020 16:07:41INFO LdapDeltaUserGroupBuilder - timeStampVal = 20200729071528Zand currentDeltaSyncTime = 1595978128000
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - Updating user count: 2, userName: hive
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - timeStampVal = 20200729073345Zand currentDeltaSyncTime = 1595979225000
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - Updating user count: 3, userName: wujy
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - timeStampVal = 20200729075855Zand currentDeltaSyncTime = 1595980735000
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - Updating user count: 4, userName: zhangsan
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - LdapDeltaUserGroupBuilder.getUsers() completed with user count: 4
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - extendedAllGroupsSearchFilter = (&amp;(objectclass=posixGroup)(|(uSNChanged&gt;=0)(modifyTimestamp&gt;=19700101080000Z)))
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - timeStampVal = 20200721102445Zand currentDeltaSyncTime = 1595298285000
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - longUserName: admin, userName: admin
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - No. of members in the group admin = 1
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - timeStampVal = 20200729073432Zand currentDeltaSyncTime = 1595979272000
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - longUserName: wujy, userName: wujy
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - No. of members in the group role1 = 1
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - timeStampVal = 20200729080247Zand currentDeltaSyncTime = 1595980967000
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - longUserName: zhangsan, userName: zhangsan
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - No. of members in the group role2 = 1
29 七月 2020 16:07:42INFO LdapDeltaUserGroupBuilder - LdapDeltaUserGroupBuilder.getGroups() completed with group count: 3
29 七月 2020 16:07:43INFO UserGroupSync - End: initial load of user/group from source==&gt;sink
29 七月 2020 16:07:43INFO UserGroupSync - 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_HOME
COMPONENT_INSTALL_DIR_NAME=/usr/lib/hadoop
# 配置ranger-hdfs-plugin的所属用户、用户组
CUSTOM_USER=hdfs
CUSTOM_GROUP=hadoop
4.2 使ranger-hdfs-plugin生效

# ./enable-hdfs-plugin.sh
Custom 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 hadoop9550 7月17 13:46 ranger-hdfs-audit.xml
-rw-rwxr--1 hdfs hadoop3717 7月17 13:46 ranger-hdfs-security.xml
-rw-rwxr--1 hdfs hadoop1909 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/
总用量 8
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
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
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服务

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 items
drwxrwxrwx   - hadoop   hadoop          0 2020-07-14 11:16 /user/hadoop
drwxr-xr-x   - mapred   mapred          0 2020-07-14 11:16 /user/history
drwxrwxrwx   - hdfs   hadoop          0 2020-07-14 11:16 /user/hive
drwxrwxrwx   - livy   livy            0 2020-07-14 17:39 /user/livy
drwxrwxrwx   - root   hadoop          0 2020-07-14 11:16 /user/root
drwxrwxrwx   - spark    spark         0 2020-07-16 17:34 /user/spark
drwxr-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/test1
mkdir: Permission denied: user=root, access=WRITE, inode="/user/test":test:hadoop:drwxr-xr-x

## 删除
# hadoop fs -rm -r /user/test/user.ldif
rm: 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.ldif
drwxr-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.ldif
Deleted /user/test/root.ldif
# hadoop fs -rm -r /user/test/test1
Deleted /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语句

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


权限校验通过。


四、小结

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

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

最新经典文章,欢迎关注公众号http://www.aboutyun.com/data/attachment/forum/201903/18/215536lzpn7n3u7m7u90vm.jpg
页: [1]
查看完整版本: Hadoop用户权限管控实现之Zeppelin与Ranger集成应用