ranger是hadoop生态中的权限管理和用户审计插件,ranger丰富的插件数量让它的使用非常广泛,但是苦于官方文档非常少,学习起来就非常麻烦。本篇博客是取各文档之精华所做的,相信你完成的看完后对于ranger会有更多的理解
ranger没有二进制包提供,需要自己手动编译下,请先确保拥有以下环境后再进行操作:
# 下载源码包并且解压
git clone https://github.com/weaksloth/ranger.git
cd ranger
# 编译
export MAVEN_OPTS="-Xms2g -Xmx2g"
mvn clean package -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true -Drat.skip=true -Dmaven.test.skip=true -Denforcer.skip -Dcheckstyle.skip -Djacoco.skip=true -Dfindbugs.skip=true -DskipTests=true
编译好后,文件如下:
-rw-r--r-- 1 xcchen xcchen 518816503 4月 2日 14:00 ranger-2.3.0-admin.tar.gz
-rw-r--r-- 1 xcchen xcchen 41570190 4月 2日 14:00 ranger-2.3.0-atlas-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 36507652 4月 2日 14:00 ranger-2.3.0-elasticsearch-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 36983615 4月 2日 13:59 ranger-2.3.0-hbase-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 35543107 4月 2日 13:57 ranger-2.3.0-hdfs-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 35343029 4月 2日 13:59 ranger-2.3.0-hive-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 54595030 4月 2日 13:59 ranger-2.3.0-kafka-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 195215223 4月 2日 14:00 ranger-2.3.0-kms.tar.gz
-rw-r--r-- 1 xcchen xcchen 49246894 4月 2日 13:59 ranger-2.3.0-knox-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 34481516 4月 2日 14:00 ranger-2.3.0-kylin-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 34231 4月 2日 14:00 ranger-2.3.0-migration-util.tar.gz
-rw-r--r-- 1 xcchen xcchen 41242239 4月 2日 13:59 ranger-2.3.0-ozone-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 55216696 4月 2日 14:00 ranger-2.3.0-presto-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 16255133 4月 2日 14:00 ranger-2.3.0-ranger-tools.tar.gz
-rw-r--r-- 1 xcchen xcchen 905882 4月 2日 14:00 ranger-2.3.0-schema-registry-plugin.jar
-rw-r--r-- 1 xcchen xcchen 37582 4月 2日 14:00 ranger-2.3.0-solr_audit_conf.tar.gz
-rw-r--r-- 1 xcchen xcchen 40595 4月 2日 14:00 ranger-2.3.0-solr_audit_conf.zip
-rw-r--r-- 1 xcchen xcchen 36092312 4月 2日 13:59 ranger-2.3.0-solr-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 34720198 4月 2日 14:00 ranger-2.3.0-sqoop-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 6335050 4月 2日 14:00 ranger-2.3.0-src.tar.gz
-rw-r--r-- 1 xcchen xcchen 49582963 4月 2日 13:59 ranger-2.3.0-storm-plugin.tar.gz
-rw-r--r-- 1 xcchen xcchen 30120534 4月 2日 14:00 ranger-2.3.0-tagsync.tar.gz
-rw-r--r-- 1 xcchen xcchen 19652753 4月 2日 14:00 ranger-2.3.0-usersync.tar.gz
-rw-r--r-- 1 xcchen xcchen 33384473 4月 2日 13:59 ranger-2.3.0-yarn-plugin.tar.gz
PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed: NotAfter: Mon Nov 14 01:05:56 CST 2022 -> [Help 1]
原因以及解决方法:stack overflow,这里我已经将相应的配置加入到了编译命令中去了
Failed to run task: 'karma start ../../src/test/javascript/karma-dev.conf.js' failed.
这里原因是会执行前端的test相关的东西,但是仅仅设置-Dmaven.test.skip=true
还是会执行,我们还需要添加-DskipTests=true
才会跳过编译时的测试
ranger将审计日志存放在elasticsearch或者solr中进行检索操作,用户可以根据需要选择安装elasticsearch或者solr
我们安装7.7.3版本,
wget https://archive.apache.org/dist/lucene/solr/7.7.3/solr-7.7.3.tgz
tar -zxvf solr-7.7.3.tar.gz -C ~/software/
cd ~/software
mv solr-7.7.3 solr
配置:
修改bin/solr.in.sh
ZK_HOST="localhost:2181"
启动与停止
bin/solr start
bin/solr stop
访问 http://localhost:8983 验证安装是否成功
推荐在自己的电脑上使用docker安装elasticsearch
docker network create esnetwork
# 安装es,此处要限制es的jvm内存大小不然会太大了
docker run -d --name elasticsearch --net esnetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx2048m" elasticsearch:7.14.2
# 安装kibana(optional)
访问 http://localhost:9200 验证安装是否成功
解压缩文件
tar -zxvf ranger-2.3.0-admin.tar.gz -C ~/software/ranger
以下所有操作,都是在ranger-2.3.0-admin目录下进行的,请注意命令所在的上下文
配置ranger-admin模块
cd ranger-2.3.0-admin
vim install.properties
# 这里配置文件只展示了修改了的部分,未修改的部分未展示
SQL_CONNECTOR_JAR=/home/xcchen/software/ranger/ranger-2.3.0-admin/mysql-connector-java-8.0.22.jar
db_root_user=root
db_root_password=root
db_host=localhost:3306
db_name=ranger
db_user=root
db_password=root
# 审计日志存储位置配置,如果配置为solr,那么solr的配置就会生效,如果配置为elasticsearch,那么es的配置就会生效
audit_store=elasticsearch
# * audit_solr_url Elasticsearch Host(s). E.g. 127.0.0.1
audit_elasticsearch_urls=localhost
audit_elasticsearch_port=9200
audit_elasticsearch_protocol=http
audit_elasticsearch_user=
audit_elasticsearch_password=
audit_elasticsearch_index=ranger-index
audit_elasticsearch_bootstrap_enabled=true
audit_solr_urls=http://localhost:8983/solr/ranger_audits
audit_solr_user=solr
audit_solr_password=solr
audit_solr_zookeepers=
unix_user=chen
unix_user_pwd=...
unix_group=chen
解释下:unix_user是需要调整的,默认是ranger。如果配置为ranger,那么会创建ranger用户和ranger组,并且将ranger-admin目录chown给ranger,如果你不想创建,可以调整为自己正在使用的用户
创建并初始化ranger数据库
建议使用mysql5.6~mysql5.7版本
create database ranger default character set utf8;
su root
sh setup.sh
2023-03-07 15:25:56,832 --------- Running Ranger PolicyManager Web Application Install Script ---------
2023-03-07 15:25:56,834 [I] uname=Linux
2023-03-07 15:25:56,835 [I] hostname=xcchen-man
2023-03-07 15:25:56,839 [I] DB_FLAVOR=MYSQL
2023-03-07 15:25:56,841 [I] Audit source=solr
2023-03-07 15:25:56,844 [I] Checking distribution name..
2023-03-07 15:25:56,855 [I] Found distribution : ManjaroLinux
2023-03-07 15:25:56,856 [I] check if command /home/xcchen/software/java/bin/java exists
2023-03-07 15:25:56,857 [I] '/home/xcchen/software/java/bin/java' command found
2023-03-07 15:25:56,909 [I] Checking MYSQL CONNECTOR FILE : /home/xcchen/software/ranger/mysql-connector-java-8.0.22.jar
2023-03-07 15:25:56,910 [I] MYSQL CONNECTOR FILE : /home/xcchen/software/ranger/mysql-connector-java-8.0.22.jar file found
2023-03-07 15:25:56,911 [I] Setting up UNIX user : ranger and group: ranger
groupadd: Permission denied.
groupadd:无法锁定 /etc/group,请稍后再试。2023-03-07 15:25:56,919 [E] Creating group ranger failed
如果出现上述错误,请确保正确配置了unix_user选项, 建议和当前用户保持一致
创建数据库编码要设置为utf8,如果不设置为utf8默认为utf8mb4。但是sql初始化脚本中,有字段类型为varchar(4000),在执行初始化数据库命令的时候就会抛出异常(此bug在ranger-2.4版本已经修复了)
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
启动ranger-admin进程
sudo ranger-admin start
启动成功后,访问http://localhost:6080,用户名和密码均为admin
ranger-usersync可以选择性的使用
定期将Unix系统或LDAP或Active Directory中的用户/组同步到RangerAdmin中。也可用作RangerAdmin的身份验证服务器,以使用linux用户/密码登陆到RangerAdmin。
# 解压缩编译后的安装包
tar -zxvf ranger-2.3.0-usersync.tar.gz -C ~/software/ranger
cd ~/software/ranger/ranger-2.3.0-usersync
修改配置文件,vim install.properties
:
POLICY_MGR_URL=http://localhost:6080
unix_user=chen
unix_group=chen
# 同步的user最小id是500,group最小id是500,使用shell命令“id username”可查看相关id
MIN_UNIX_USER_ID_TO_SYNC=500
MIN_UNIX_GROUP_ID_TO_SYNC=500
切换到root用户,执行初始化操作:
su root
./setup.sh
执行完初始化,还需要修改/etc/ranger/usersync/conf/ranger-ugsync-site.xml
配置文件,将ranger.usersync.enabled
设置为true
<property>
<name>ranger.usersync.enabledname>
<value>truevalue>
property>
启动服务:
sudo bash ranger-usersync-services.sh start
启动后,同步会立刻触发一次,可以打开web ui查看已经同步的用户,同步的用户来源为External
默认是5分钟同步一次,也可以通过install.properties
配置SYNC_INTERVAL
ranger另一个核心的功能就是审计,通过查看审计日志我们可以看到用户操作了哪些资源,在ranger的web界面中,点击Audit
即可查看审计日志如下图所示:
ranger支持多种类型的插件,来控制这些组件的权限
假设你已经配置好了hadoop和hive metastore
官方的hive插件作用域在HiveCli和HiveServer2端,无法直接控制Hive Metastore的权限。
事实上,对于hive metastore来说,很多都是将其作为一个元数据服务,并不想使用hive服务。例如flink,spark使用hive metastore进行元数据的存储,真正的计算操作跟hive是无关的,所以此时官方插件是不好用的。
针对我们自己的需求,我们需要去使用能单独控制hive metastore的插件,如果你有使用hive的需求,可以寻找下其他的资料,很多
hive官方没有提供hive meatstore的ranger插件,但是有第三方实现:
注意:上述插件版本都比较旧,所以我进行了改进适配了新版本,已经将插件的集成到了hive-agent中,所以读者无需进行其他操作
安装
wget https://repo1.maven.org/maven2/org/apache/hive/hive-standalone-metastore/3.1.2/hive-standalone-metastore-3.1.2-bin.tar.gz
tar -zxvf hive-standalone-metastore-3.1.2-bin.tar.gz -C ~/software/
mv apache-hive-metastore-3.1.2-bin hive-metastore
# 进入lib目录下
cd hive-metastore/lib
cp mysql-connector-java-8.0.22.jar ./
# 删除就版本的guava包,使用新版本,不然会冲突
rm -rf guava-19.0.jar
cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar ./
wget https://repo1.maven.org/maven2/org/apache/hive/hive-exec/3.1.2/hive-exec-3.1.2.jar
在mysql中创建hive metastore需要的数据库:
create database metastore_standalone;
create user 'hms'@'%' identified by 'Hms@123';
grant all privileges on metastore_standalone.* to 'hms'@'%' with grant option;
flush privileges;
我已经将ranger metastore插件集成到了hive插件中,所以我们可以直接解压缩hive插件即可
tar -zxvf ranger-2.3.0-hive-plugin.tar.gz -c ~/software/ranger/
# 进入ranger插件主文件夹
cd ~/software/ranger/ranger-2.3.0-hive-plugin
修改install.properties
,找到以下配置进行修改:
# ranger admin地址
POLICY_MGR_URL=http://localhost:6080
# ranger repository,这里填入的和后面要在ranger admin中配置的名称要保持一致
REPOSITORY_NAME=hms
# hive metastore地址,插件初始化时,会使用到该路径
COMPONENT_INSTALL_DIR_NAME=/home/xcchen/software/hive-metastore
# 配置该插件的审计日志写入位置,不配置则无法开启审计功能
XAAUDIT.ELASTICSEARCH.ENABLE=true
XAAUDIT.ELASTICSEARCH.URL=localhost
XAAUDIT.ELASTICSEARCH.USER=NONE
XAAUDIT.ELASTICSEARCH.PASSWORD=NONE
XAAUDIT.ELASTICSEARCH.INDEX=ranger-index
XAAUDIT.ELASTICSEARCH.PORT=9200
XAAUDIT.ELASTICSEARCH.PROTOCOL=http
# 建议配置为当前正在使用的用户
CUSTOM_USER=xcchen
CUSTOM_GROUP=xcchen
su root
./enable-metastore-plugin.sh
执行脚本后,程序会拷贝jar包到hive-metastore的lib目录下,并且在hive-metastore的conf目录下会生成下面几个文件(日期为3月10日的都是插件生成的):
总计 100K
-rw-r--r-- 1 xcchen xcchen 1.6K 2019年 8月23日 metastore-site.xml
-rw-r--r-- 1 xcchen xcchen 2.7K 2019年 8月23日 metastore-log4j2.properties
-rw-r--r-- 1 xcchen xcchen 56K 2019年 8月23日 metastore-site.xml.template
-rw-r--r-- 1 xcchen xcchen 83 3月10日 15:17 ranger-security.xml
-rwxr--r-- 1 xcchen xcchen 1.8K 3月10日 15:17 hiveserver2-site.xml
-rwxr--r-- 1 xcchen xcchen 1.5K 3月10日 15:17 hiveserver-site.xml
-rwxr--r-- 1 xcchen xcchen 9.4K 3月10日 15:17 ranger-hive-audit.xml
-rwxr--r-- 1 xcchen xcchen 2.9K 3月10日 15:17 ranger-hive-security.xml
-rwxr--r-- 1 xcchen xcchen 1.9K 3月10日 15:17 ranger-policymgr-ssl.xml
-rwxr--r-- 1 xcchen xcchen 2.7K 3月10日 15:23 hive-site.xml
为什么将hive-metastore的初始化放到现在才做呢?因为ranger插件会生成配置文件,只需要基于这些配置文件进行修改即可,编辑hive-site.xml
<configuration>
<property>
<name>hive.security.authorization.enabledname>
<value>truevalue>
property>
<property>
<name>hive.security.authorization.managername>
<value>org.apache.ranger.authorization.hive.authorizer.RangerHiveAuthorizerFactoryvalue>
property>
<property>
<name>hive.metastore.pre.event.listenersname>
<value>org.apache.ranger.authorization.hive.authorizer.RangerHiveMetastoreAuthorizervalue>
property>
<property>
<name>hive.metastore.event.listenersname>
<value>org.apache.ranger.authorization.hive.authorizer.RangerHiveMetastorePrivilegeHandlervalue>
property>
<property>
<name>hive.conf.restricted.listname>
<value>hive.security.authorization.enabled,hive.security.authorization.manager,hive.security.authenticator.managervalue>
property>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://localhost:3306/metastore_standalonevalue>
<description>jdbc urldescription>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
<description>jdbc driverdescription>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>hmsvalue>
<description>jdbc usernamedescription>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>Hms@123value>
<description>jdbc passworddescription>
property>
<property>
<name>hive.metastore.warehouse.dirname>
<value>/user/hive/warehousevalue>
<description>Hive在HDFS的工作目录,如果想要在本地,就加上file:前缀description>
property>
<property>
<name>hive.metastore.urisname>
<value>thrift://localhost:9083value>
property>
configuration>
初始化数据库:
bin/schematool -initSchema -dbType mysql -verbose
进入ranger admin界面,选择HADOOP SQL,创建服务,填写信息如下图所示:
username
和password
不是linux系统,而是默认权限生效的用户,如果这个用户不存在,ranger会自动创建并且来源设置为External
创建完成后,我们可以看到默认创建了下面这些权限策略:
随后启动我们的hive metastore服务:
bin/start-metastore
工程pom文件:
<project xmlns=""
xmlns:xsi=""
xsi:schemaLocation=" " >
<parent>
<artifactId>baseartifactId>
<groupId>com.github.weakslothgroupId>
<version>1.0-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>hms-use-testartifactId>
<dependencies>
<dependency>
<groupId>org.apache.hivegroupId>
<artifactId>hive-standalone-metastoreartifactId>
<version>3.1.2version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13.2version>
<scope>testscope>
dependency>
dependencies>
project>
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.metastore.IMetaStoreClient;
import org.apache.hadoop.hive.metastore.RetryingMetaStoreClient;
import org.junit.Before;
import org.junit.Test;
public class HmsRangerITCase {
private IMetaStoreClient hmsClient;
@Before
public void init() throws Exception {
Configuration conf = new Configuration();
conf.set("hive.metastore.uris", "thrift://localhost:9083");
hmsClient = RetryingMetaStoreClient.getProxy(conf,false);
}
@Test
public void testListCatalogs() throws Exception {
hmsClient.getCatalogs().forEach(System.out::println);
}
@Test
public void testGetCatalog() throws Exception {
System.out.println(hmsClient.getCatalog("hive").toString());
}
@Test
public void testListDatabases() throws Exception {
hmsClient.getAllDatabases("hive").forEach(System.out::println);
}
@Test
public void testListTables() throws Exception {
hmsClient.getAllTables("flink").forEach(System.out::println);
}
}
目前还没有研究出来,HiveMetaStoreClient是使用的什么用户,所以目前还是只能通过当前系统用户进行测试
这里我们使用flink sql client,使用hive catalog来进行测试,flink使用hive catalog的方法略过不是本文的重点,不清楚的可以参考flink官方文档
首先记住,当前操作系统用户是xcchen
cd $FLINK_HOME
bin/start-cluster.sh
bin/sql-client.sh embedded
进入flink交互式命令行之后,我们尝试访问创建hive catalog
-- 将hive-conf-dir该为metastore conf目录
create catalog myHive with (
'type'='hive',
'hive-conf-dir'='...'
);
use catalog myHive;
create database flink;
CREATE TABLE orders (
order_number BIGINT,
price DECIMAL(32,2),
buyer ROW<first_name STRING, last_name STRING>,
order_time TIMESTAMP(3)
) WITH (
'connector' = 'datagen'
);
因为我们xcchen这个用户是有权限的,在ranger-admin中可以看到,所以能够成功创建。
此时,我们随意切换一个用户,例如我们切换到root用户,重新执行上述命令和SQL脚本:
su root
创建catalog时会抛出以下错误,因为root这个用户,没有权限访问hms
[ERROR] Could not execute SQL statement. Reason:
org.apache.hadoop.hive.metastore.api.MetaException: Permission denied: user [root] does not have [SELECT] privilege on [default]
总结:由此可见,flink hive catalog连接hive metastore的时候,默认会使用当前的操作系统用户,由该用户结合ranger进行权限的校验。后续可以考虑改进hive连接器,实现参数传入用户
kyuubi的安装使用以及对接hms可以参考我的其他文档,本文不做详细描述
这里的kyuubi我们只做了ranger的授权部分,认证部分暂时不在这里进行测试
# 启动spark standalone集群进行测试
$SPARK_HOME/sbin/start-all.sh
# 启动kyuubi
$KYUUBI_HOME/bin/kyuubi start
使用用户test
进行连接测试:
bin/beeline -u 'jdbc:hive2://localhost:10009/;#hive.metastore.uris=thrift://localhost:9083' -n test
# 控制台结果如下:
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:Permission denied: user [test] does not have [SELECT] privilege on [default])
at org.apache.hadoop.hive.ql.metadata.Hive.getDatabase(Hive.java:1560)...
使用用户xcchen
进行连接测试:
bin/beeline -u 'jdbc:hive2://localhost:10009/;#hive.metastore.uris=thrift://localhost:9083' -n xcchen
结果能正常访问hive metastore中的元数据
可以看到kyuubi对于用户的传递更为方便,只需要-n
参数指定,就可以使用该用户去连接hms
从hive-site.xml
中的配置可以看到,ranger metastore插件的原理是基于hive metastore提供的EventListener接口,感知请求metastore的sql信息,然后和ranger进行交互,进行权限的控制(hive、spark应该都是这个逻辑,基于其框架提供的EventListener)。核心代码可以查看:
org.apache.ranger.authorization.hive.authorizer.RangerHiveMetastoreAuthorizer
org.apache.ranger.authorization.hive.authorizer.RangerHiveMetastorePrivilegeHandler
官方文档地址:https://cwiki.apache.org/confluence/display/RANGER/Elasticsearch+Plugin
es插件可以作用在index上,控制用户对于index的操作权限
这里我们不使用docker容器安装elasticsearch,而是在物理机上安装elasticsearch.具体的安装过程不是本文的重点,读者可以自行查找资料
elasticsearch版本:7.6.0(注意:低版本不适用于ranger-2.3.0-elasticsearch插件)
安装完成后,将ranger插件解压缩,配置install.properties
如下:
tar -zxvf ranger-2.3.0-elasticsearch-plugin.tar.gz
cd ranger-2.3.0-elasticsearch-plugin
vim install.properties
# 以下配置只展示修改的部分,未修改的配置不罗列出来,且读者应按照自己的环境调整相应配置
# ranger admin地址
POLICY_MGR_URL=http://192.168.58.1:6080
# ranger repository,这里填入的和后面要在ranger admin中配置的名称要保持一致
REPOSITORY_NAME=EsPluginTest
# elasticsearch安装根目录
COMPONENT_INSTALL_DIR_NAME=/opt/elasticsearch-6.2.2
# 配置该插件的审计日志写入位置,不配置则无法开启审计功能
XAAUDIT.ELASTICSEARCH.ENABLE=true
XAAUDIT.ELASTICSEARCH.URL=192.168.58.1
XAAUDIT.ELASTICSEARCH.USER=NONE
XAAUDIT.ELASTICSEARCH.PASSWORD=NONE
XAAUDIT.ELASTICSEARCH.INDEX=ranger-index
XAAUDIT.ELASTICSEARCH.PORT=9200
XAAUDIT.ELASTICSEARCH.PROTOCOL=http
# 建议配置为当前正在使用的用户
CUSTOM_USER=esuser
CUSTOM_GROUP=esgroup
开启elasticsearch插件
su root
./enable-elasticsearch-plugin.sh
Custom user and group is available, using custom user and group.
INFO: Creating /opt/elasticsearch-6.2.2/config/ranger-elasticsearch-plugin
INFO: Changing ownership of /opt/elasticsearch-6.2.2/config/ranger-elasticsearch-plugin to esuser:esgroup
+ Fri Jun 30 00:15:29 CST 2023 : elasticsearch: lib folder=/opt/elasticsearch-6.2.2/plugins conf folder=/opt/elasticsearch-6.2.2/config/ranger-elasticsearch-plugin
+ Fri Jun 30 00:15:29 CST 2023 : Saving current config file: /opt/elasticsearch-6.2.2/config/ranger-elasticsearch-plugin/ranger-elasticsearch-audit.xml to /opt/elasticsearch-6.2.2/config/ranger-elasticsearch-plugin/.ranger-elasticsearch-audit.xml.20230630-001529 ...
+ Fri Jun 30 00:15:30 CST 2023 : Saving current config file: /opt/elasticsearch-6.2.2/config/ranger-elasticsearch-plugin/ranger-elasticsearch-security.xml to /opt/elasticsearch-6.2.2/config/ranger-elasticsearch-plugin/.ranger-elasticsearch-security.xml.20230630-001529 ...
+ Fri Jun 30 00:15:30 CST 2023 : Saving current config file: /opt/elasticsearch-6.2.2/config/ranger-elasticsearch-plugin/ranger-policymgr-ssl.xml to /opt/elasticsearch-6.2.2/config/ranger-elasticsearch-plugin/.ranger-policymgr-ssl.xml.20230630-001529 ...
+ Fri Jun 30 00:15:31 CST 2023 : Saving current JCE file: /etc/ranger/EsPluginTest/cred.jceks to /etc/ranger/EsPluginTest/.cred.jceks.20230630001531 ...
Ranger Plugin for elasticsearch has been enabled. Please restart elasticsearch to ensure that changes are effective.
重启elasticsearch
serviceName:EsPluginTest
es地址:http://localhost:19200
填写索引后,选择相应的操作权限,在图中可以看到关于es的操作权限
在使用hdfs插件前,请确保你已经安装好了hdfs
tar -zxvf ranger-2.3.0-hdfs-plugin.tar.gz -C ~/Softwares/ranger
# 进入ranger hdfs插件目录
cd ~/software/ranger/ranger-2.3.0-hdfs-plugin
编辑install.properties
,对以下配置进行修改:
POLICY_MGR_URL=http://localhost:6080
REPOSITORY_NAME=hdfs
COMPONENT_INSTALL_DIR_NAME=/home/chen/Softwares/hadoop
XAAUDIT.ELASTICSEARCH.ENABLE=true
XAAUDIT.ELASTICSEARCH.URL=localhost
XAAUDIT.ELASTICSEARCH.USER=NONE
XAAUDIT.ELASTICSEARCH.PASSWORD=NONE
XAAUDIT.ELASTICSEARCH.INDEX=ranger-index
XAAUDIT.ELASTICSEARCH.PORT=9200
XAAUDIT.ELASTICSEARCH.PROTOCOL=http
CUSTOM_USER=xcchen
CUSTOM_GROUP=xcchen
执行脚本开启插件
su root
./enable-hdfs-plugin.sh
Custom user and group is available, using custom user and group.
+ 2023年 04月 02日 星期日 23:32:24 CST : hadoop: lib folder=/home/chen/Softwares/hadoop/share/hadoop/hdfs/lib conf folder=/home/chen/Softwares/hadoop/etc/hadoop
+ 2023年 04月 02日 星期日 23:32:24 CST : Saving current config file: /home/chen/Softwares/hadoop/etc/hadoop/hdfs-site.xml to /home/chen/Softwares/hadoop/etc/hadoop/.hdfs-site.xml.20230402-233224 ...
+ 2023年 04月 02日 星期日 23:32:24 CST : Saving current config file: /home/chen/Softwares/hadoop/etc/hadoop/ranger-hdfs-audit.xml to /home/chen/Softwares/hadoop/etc/hadoop/.ranger-hdfs-audit.xml.20230402-233224 ...
+ 2023年 04月 02日 星期日 23:32:24 CST : Saving current config file: /home/chen/Softwares/hadoop/etc/hadoop/ranger-hdfs-security.xml to /home/chen/Softwares/hadoop/etc/hadoop/.ranger-hdfs-security.xml.20230402-233224 ...
+ 2023年 04月 02日 星期日 23:32:24 CST : Saving current config file: /home/chen/Softwares/hadoop/etc/hadoop/ranger-policymgr-ssl.xml to /home/chen/Softwares/hadoop/etc/hadoop/.ranger-policymgr-ssl.xml.20230402-233224 ...
+ 2023年 04月 02日 星期日 23:32:25 CST : Saving current JCE file: /etc/ranger/hdfs/cred.jceks to /etc/ranger/hdfs/.cred.jceks.20230402233225 ...
Ranger Plugin for hadoop has been enabled. Please restart hadoop to ensure that changes are effective.
重新启动hdfs:
stop-dfs.sh
start-dfs.sh
创建ranger service,如下图所示:
创建测试目录进行测试:
cd /tmp
echo "hello ranger" > a.txt
echo "hello ranger" > b.txt
hadoop fs -mkdir -p /ranger-test/dir-a
hadoop fs -put a.txt /ranger-test/dir-a
创建policy,期望的权限策略为:
用户hadoop
有操作/ranger-test
下的所有文件权限,而用户xcchen
只有读权限
# 以hadoop用户进行文件查看
su hadoop
hadoop fs -cat /ranger-test/dir-a/a.txt
# output
hello ranger
# 以xcchen用户进行文件的读写操作
su xcchen
hadoop fs -cat /ranger-test/dir-a/a.txt # 成功打印输出
# 尝试写入文件
hadoop fs -put b.txt /ranger-test/dir-a
# 控制台输出如下,说明权限策略生效
put: Permission denied: user=xcchen, access=WRITE, inode="/ranger-test/dir-a":hadoop:supergroup:drwxr-xr-x
:TODO 测试下来我有一个疑惑就是为什么不在策略下的用户仍然能够读文件,但是不能写。所以ranger的权限控制和hdfs本身的ACL有什么区别没有?
spark sql集成ranger实现权限控制,本文基于kyuubi的spark authz插件实现,讲述kyuubi spark authz插件的使用,官方文档
用户可以在编译时指定spark版本和ranger版本,建议和使用保持一致
build/mvn clean package -pl :kyuubi-spark-authz_2.12 -DskipTests -Dspark.version=3.1.1 -Dranger.version=2.3.0 -Dmaven.test.skip=true
编译kyuubi后,在下面两个目录可以看到相应的jar包:(个人认为kyuubi使用shaded插件将依赖全部打到一个包里会更方便,但是kyuubi没有这么做)
extensions/spark/kyuubi-spark-authz/target
目录下可以看到kyuubi-spark-authz_*.jar
,这是核心程序jar包./extensions/spark/kyuubi-spark-authz/target/scala-${scala.binary.version}/jars
拷贝上述所有jar包到$SPARK_HOME/jars
目录下
在$SPARK_HOME/conf
目录下新建ranger-spark-security.xml
和ranger-spark-audit.xml
ranger-spark-security.xml:
<configuration>
<property>
<name>ranger.plugin.spark.policy.rest.urlname>
<value>http://localhost:6080value>
property>
<property>
<name>ranger.plugin.spark.service.namename>
<value>sparkAuthTestvalue>
property>
<property>
<name>ranger.plugin.spark.policy.cache.dirname>
<value>/home/xcchen/software/spark/spark-3.1.1/ranger-policy-cachevalue>
property>
<property>
<name>ranger.plugin.spark.policy.pollIntervalMsname>
<value>5000value>
property>
<property>
<name>ranger.plugin.spark.policy.source.implname>
<value>org.apache.ranger.admin.client.RangerAdminRESTClientvalue>
property>
configuration>
ranger-spark-audit.xml(这里我将审计日志关闭了,如需开启请自行配置)
<configuration>
<property>
<name>xasecure.audit.is.enabledname>
<value>falsevalue>
property>
<property>
<name>xasecure.audit.destination.dbname>
<value>falsevalue>
property>
<property>
<name>xasecure.audit.destination.db.jdbc.drivername>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>xasecure.audit.destination.db.jdbc.urlname>
<value>jdbc:mysql://10.171.161.78/rangervalue>
property>
<property>
<name>xasecure.audit.destination.db.passwordname>
<value>rangeradminvalue>
property>
<property>
<name>xasecure.audit.destination.db.username>
<value>rangeradminvalue>
property>
configuration>
我们配置权限,让用户zhangsan只能访问spark.source这张表的id字段,其他表和字段无法访问;而用户xcchen则所有表都可以访问
记得要给用户zhangsan配置一个default库的访问权限,因为kyuubi默认会进入
测试权限时确保kyuubi配置正确,具体配置可参考官方文档
使用xcchen用户去访问:
bin/beeline -u 'jdbc:hive2://localhost:10009/;#hive.metastore.uris=thrift://localhost:9083' -n xcchen
use spark;
show tables;
+-----------+------------+--------------+
| database | tableName | isTemporary |
+-----------+------------+--------------+
| spark | source | false |
| spark | target | false |
+-----------+------------+--------------+
使用zhangsan用户去访问:
use spark;
show tables;
+-----------+------------+--------------+
| database | tableName | isTemporary |
+-----------+------------+--------------+
| spark | source | false |
+-----------+------------+--------------+
zhangsan用户看不到未授权的表,接下来测试查询source表的所有字段:select * from source:
Error: org.apache.kyuubi.KyuubiSQLException: org.apache.kyuubi.KyuubiSQLException: Error operating ExecuteStatement: org.apache.kyuubi.plugin.spark.authz.AccessControlException: Permission denied: user [zhangsan] does not have [select] privilege on [spark/source/name]
只查询id字段可以正常显示,如果要查询所有字段则会报错,说明列级别的权限控制已经实现
TODO
TODO
如果你使用mysql8作为数据库,会发现各种各样的问题,原因就是ranger的配置文件不能手动去修改jdbc的url,导致allowPublicKeyRetrieval
无法设置为true,因为不管是ranger-admin的初始化程序还是web应用程序,都是无法在配置文件中进行设置的。当然都是可以解决的,不过会很麻烦就是了
使用mysql8数据库,在执行ranger-admin初始化的时候,会抛出以下异常
SQLException : SQL state: 08001 java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed ErrorCode: 0
使用mysql8以上的数据库会出现这种问题,很坑的是在install.properties
无法配置allowPublicKeyRetrieval=true
,但是我们也有解决办法:
分析了初始化脚本后,我们可以看到调用了db_setup.py
这个python脚本进行的数据库初始化,找到useSSL=false
在后面添加allowPublicKeyRetrieval=true
chmod u+w db_setup.py
vim db_setup.py
搜索useSSL并修改,然后再执行set_up.sh
,即可成功运行
db_ssl_param="?useSSL=false&allowPublicKeyRetrieval=true
在执行ranger-admin start
命令后,发现一切是正常的,但是就是无法登录。查看日志文件发现无法获取jdbc连接
2023-03-08 05:35:17,638 [localhost-startStop-1] INFO [PropertiesUtil.java:332] ranger.jpa.jdbc.url=jdbc:log4jdbc:mysql://localhost:3306/ranger?useSSL=false
work.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Connections could not be acquired from the underlying database!
通过日志可以看到问题是一样的,jdbc的连接中没有加入allowPublicKeyRetrieval
参数,目前这个问题还没有解决