Apache Ranger系列九:修改源码支持URI类型为s3的操作
问题描述:ranger在checkPrivileges(org.apache.ranger.authorization.hive.authorizer.RangerHiveAuthorizer)时,当类型是uri时会校验格式,必须是hdfs:,file:
if (hiveObjType == HiveObjectType.URI && isPathInFSScheme(path)) {
FsAction permission = getURIAccessType(hiveOpType);
if (!isURIAccessAllowed(user, permission, path, getHiveConf())) {
throw new HiveAccessControlException(String.format("Permission denied: user [%s] does not have [%s] privilege on [%s]", user, permission.name(), path));
}
continue;
}
private boolean isPathInFSScheme(String uri) {
// This is to find if HIVE URI operation done is for hdfs,file scheme
// else it may be for s3 which needs another set of authorization calls.
boolean ret = false;
String[] fsScheme = hivePlugin.getFSScheme();
if (fsScheme != null) {
for (String scheme : fsScheme) {
if (!uri.isEmpty() && uri.startsWith(scheme)) {
ret = true;
break;
}
}
}
return ret;
}
private static String RANGER_PLUGIN_HIVE_ULRAUTH_FILESYSTEM_SCHEMES_DEFAULT = "hdfs:,file:";
开启debug格式,查看执行日志的请求信息。
2022-12-12T06:44:33,683 DEBUG [b70562ff-5cbd-44e8-acb8-71b8799ed734 HiveServer2-Handler-Pool: Thread-63([])]: authorizer.RangerHiveAuthorizer (RangerHiveAuthorizer.java:checkPrivileges(788)) - 'checkPrivileges':{'hiveOpType':CREATETABLE,
'inputHObjs':['HivePrivilegeObject':{'type':DFS_URI, 'dbName':null, 'objectType':DFS_URI, 'objectName':s3a://xxxx/xxx/xxx/xxxx_daily_test, 'columns':[], 'partKeys':[], 'commandParams':[], 'actionType':OTHER}],
'outputHObjs':['HivePrivilegeObject':{'type':DATABASE, 'dbName':dev, 'objectType':DATABASE, 'objectName':null, 'columns':[], 'partKeys':[], 'commandParams':[], 'actionType':OTHER},'HivePrivilegeObject':{'type':TABLE_OR_VIEW, 'dbName':dev, 'objectType':TABLE_OR_VIEW, 'objectName':xxxx_daily_test, 'columns':[], 'partKeys':[], 'commandParams':[], 'actionType':OTHER}],
'context':{'clientType':HIVESERVER2, 'commandString':create table if not exists dev.xxxx_daily_test ( event_date string,
reason string)PARTITIONED BY
(
pdate string
)
STORED AS PARQUET
LOCATION 's3a://xxxx/xxxx/xxx/xxxx_daily_test', 'ipAddress':172.31.176.136, 'forwardedAddresses':null, 'sessionString':b70562ff-5cbd-44e8-acb8-71b8799ed734}, 'user':xxxxx, 'groups':[]}
修改代码为自定义的校验方式
// add s3 path check
if(hiveObjType == HiveObjectType.URI) {
FsAction permission = getURIAccessType(hiveOpType);
if(!isURIAccessAllowedForS3(user, path)) {
throw new HiveAccessControlException(String.format("Permission denied: user [%s] does not have [%s] privilege on [%s]", user, permission.name(), path));
}
continue;
} private boolean isURIAccessAllowedForS3(String userName, String uri) {
boolean ret = false; try {
// give all file privilege
if (userName.equalsIgnoreCase("hadoop")) {
ret = true;
} else {
if (uri.startsWith("s3a://user-devs") || uri.startsWith("s3://user-devs")) {
ret = true;
} else {
LOG.error("uri[" + uri + "] should start with s3a://user-devs or s3://user-devs for user[" + userName + "].");
ret = false;
}
}
} catch(Exception excp) {
ret = false;
LOG.error("Error getting permissions for " + uri, excp);
} return ret;
}
参考类型变化
case DATABASE:
objType = HiveObjectType.DATABASE;
break; case PARTITION:
objType = HiveObjectType.PARTITION;
break; case TABLE_OR_VIEW:
if(hiveOpTypeName.contains("index")) {
objType = HiveObjectType.INDEX;
} else if(! StringUtil.isEmpty(hiveObj.getColumns())) {
objType = HiveObjectType.COLUMN;
} else if(hiveOpTypeName.contains("view")) {
objType = HiveObjectType.VIEW;
} else {
objType = HiveObjectType.TABLE;
}
break; case FUNCTION:
objType = HiveObjectType.FUNCTION;
if (isTempUDFOperation(hiveOpTypeName, hiveObj)) {
objType = HiveObjectType.GLOBAL;
}
break; case DFS_URI:
case LOCAL_URI:
objType = HiveObjectType.URI;
break; case COMMAND_PARAMS:
case GLOBAL:
if ( "add".equals(hiveOpTypeName) || "compile".equals(hiveOpTypeName)) {
objType = HiveObjectType.GLOBAL;
}
break; case SERVICE_NAME:
objType = HiveObjectType.SERVICE_NAME;
break; case COLUMN:
// Thejas: this value is unused in Hive; the case should not be hit.
break;
重新编译
cd /Users/xxxx/sourceCodeProj/ranger/hive-agent
mvn -DskipTests=true clean package
Apache Ranger系列九:修改源码支持URI类型为s3的操作的更多相关文章
- java多线程系列(九)---ArrayBlockingQueue源码分析
java多线程系列(九)---ArrayBlockingQueue源码分析 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 j ...
- ok6410 u-boot-2012.04.01移植二修改源码支持单板
继ok6410 u-boot-2012.04.01移植一后修改代码,对ok6410单板初始化,主要包括时钟.串口.NAND.DDR等初始化.这些工作在以前的裸板程序都写了,直接拿来用.我觉得先写裸板程 ...
- sqlsugar入门(4)-修改源码支持多主键保存ISaveable
1.查看其它接口发现少了一个最重要的SaveBuilder.此文件是存放sql模板,where条件,select解析,组装成tosqlstring的最后一个类. 添加文件 using System; ...
- 修改Cosbench源码 支持s3的 http range request 测试场景
在视频点播的业务应用场景中,用户使用了ffmpeg工具做视频实时转码用. 而ffmpeg使用range 请求.而Cosbench不支持这种测试场景,所以需要修改源码支持这种测试场景. HTTP 协议介 ...
- Windows7 64位环境6sv2.1大气传输模型修改源码添加国产高分卫星GF-1 GF-2光谱响应支持
下面开始添加国产卫星光谱响应的支持: 以下主要参考文章“6S大气传输模型修改源码添加.自定义卫星光谱响应(以HJ-1B CCD为例)”网址:http://blog.csdn.net/sam92/art ...
- 修改json源码支持datetime序列化
修改json源码支持datetime序列化 import json import datetime now = datetime.datetime.today() json.dumps(now) 抛出 ...
- Java并发系列[5]----ReentrantLock源码分析
在Java5.0之前,协调对共享对象的访问可以使用的机制只有synchronized和volatile.我们知道synchronized关键字实现了内置锁,而volatile关键字保证了多线程的内存可 ...
- Mybatis 系列7-结合源码解析核心CRUD 配置及用法
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- 死磕 java同步系列之Phaser源码解析
问题 (1)Phaser是什么? (2)Phaser具有哪些特性? (3)Phaser相对于CyclicBarrier和CountDownLatch的优势? 简介 Phaser,翻译为阶段,它适用于这 ...
- 死磕 java同步系列之StampedLock源码解析
问题 (1)StampedLock是什么? (2)StampedLock具有什么特性? (3)StampedLock是否支持可重入? (4)StampedLock与ReentrantReadWrite ...
随机推荐
- 洛谷 P4454 [CQOI2018]破解D-H协议
题目 https://www.luogu.com.cn/problem/P4454 杂题乱做ing... 思路 首先我们把式子列一下: \(g^a\equiv A(mod P)\) \(g^b\equ ...
- 老生常谈:String s1 = new String("abc") 创建了几个字符串对象及8 种基本类型的包装类和常量池
将创建 1 或 2 个字符串.如果池中已存在字符串常量"abc",则只会在堆空间创建一个字符串常量"abc".如果池中没有字符串常量"abc" ...
- UGUI获取文本的字符内容像素宽度 【转】
在做文本框的时候,我们经常碰到需要计算字符输入的长度,然后适当地做处理.这个时候不能直接了当地拿text.Length来用,原因有: 1.字符会因为fontSize的大小不同而有不同的宽度: 2.即使 ...
- hadoop模板虚拟机配置
在安装好虚拟机软件后,进行IP配置 配置windows系统的ip 配置Vmware的ip 配置虚拟机的ip 首先 输入su root切换至root身份. 然后配置ip和网关 vim /etc/sysc ...
- Pytest Fixture(一)
Fixture 是一些函数,pytest 会在执行测试函数之前(或之后)加载运行它们.我们可以用它做一些事情,比如数据库的链接操作之类的 import pytest @pytest.fixture() ...
- memoの颜色配置
Visual Studio的配置 没啥说的,直接上网站: https://studiostyl.es/schemes/create 顺便保存一份我的配置 一些有趣的插件:Amigo 主题配色,还是Bl ...
- HttpClient请求接口实例demo
HttpClient是Apache中的一个开源的项目.它实现了HTTP标准中Client端的所有功能,使用它能够很容易地进行HTTP信息的传输.HttpClient的主要功能: 实现了所有 HTTP ...
- FreeSql 将 Saas 租户方案精简到极致[.NET ORM]
什么是多租户 维基百科:"软件多租户是指一种软件架构,在这种软件架构中,软件的一个实例运行在服务器上并且为多个租户服务".一个租户是一组共享该软件实例特定权限的用户.有了多租户架构 ...
- 梯度下降算法VS正规方程算法
梯度下降算法的大家族: ①批量梯度下降:有N个样本,求梯度的时候就用了N个样本的梯度数据 优点:准确 缺点:速度慢 ②随机梯度下降:和批量梯度下降算法原理相似,区别在于求梯度时没有用所有的N歌样本数据 ...
- NOIP2015 pj
达成成就!--尝试不看题解的情况下用cpp打完了一套NOIP pj 题目全部在luogu上-- P2669 金币 题目描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第 ...