目的
hive udf在ranger中的权限控制策略。
涉及步骤:
- ADD jar
- create FUNCTION/create Template FUNCTION
- 使用UDF
重点观察这几个步骤如何进行权限管理的。
Ranger资源
Ranger对资源进行授权,资源包括如下类型
public static final String KEY_DATABASE = "database";
public static final String KEY_TABLE = "table";
public static final String KEY_UDF = "udf";
public static final String KEY_COLUMN = "column";
public static final String KEY_URL = "url";
public static final String KEY_HIVESERVICE = "hiveservice";
public static final String KEY_GLOBAL = "global";
Add jar
Add jar这一步不进行权限检测,需要确认hdfs路径jar包的权限,否则在注册函数时报错.
Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [-] does not have [ALL] privilege on [hdfs://nameservice1/user/hive/udf/hiveudf.jar]
这个报错说明没有HDFS权限
Create Function/Template Function
检查权限逻辑
public void checkPrivileges(HiveOperationType hiveOpType,
List<HivePrivilegeObject> inputHObjs,
List<HivePrivilegeObject> outputHObjs,
HiveAuthzContext context)
hiveOpType是语法树直接解析的,包括DFS,EXPLAIN,LOAD,QUERY,CREATEFUNCTION等等。
HivePrivilegeObject:库表列OP,行过滤等。
资源映射
Ranger授权的对象是资源,hiveOpType需要映射到资源和访问
如果是创建临时函数,对应的资源是HiveObjectType.GLOBAL.
如果是创建永久函数,对应的资源是HiveObjectType.FUNCTION
case FUNCTION:
objType = HiveObjectType.FUNCTION;
if (isTempUDFOperation(hiveOpTypeName, hiveObj)) {
objType = HiveObjectType.GLOBAL;
}
break;
为了更好的对资源进行划分,ranger对资源进行了三级划分。一个hiveOpType可以对应到一个资源。
database udf是资源,database table column 也是资源。
//FirstLevelResource => Database or URL or Hive Service or Global
//SecondLevelResource => Table or UDF
//ThirdLevelResource => column
访问映射
访问控制时,对应CreateFunction和CreateTemplateFunction对应到不同的Access
临时函数,对应的Access是TEMPUDFADMIN
永久函数,对于的Access是CREATE
case CREATEFUNCTION:
if(hiveObj.getType() == HivePrivilegeObjectType.FUNCTION) {
accessType = HiveAccessType.CREATE;
}
if(hiveObjectType == HiveObjectType.GLOBAL ) {
accessType = HiveAccessType.TEMPUDFADMIN;
}
查询权限
构造请求,轮询查询用户是否有访问该资源权限。
最终调用方法:
evaluatePoliciesNoAudit
使用UDF
使用一个UDF,需要什么权限?
和上面的Create Function步骤类似,增加udf权限,表权限即可。
测试
测试udf创建权限
- 使用user5连接hive
apache-hive-3.1.2-bin]# bin/beeline -u ‘jdbc:hive2://localhost:10000’ -nuser5 -p0a791842f52a0acfbb3a783378c066b8 - add jar判断是否有权限
add jar hdfs://ns-cdp/user/hiveudf-1.0-SNAPSHOT.jar;
没有报错 - 直接创建永久function,分别报错没有hdfs权限,没有create udf权限
create function myudf as “org.hiveudf.GenericUDFNvl”;
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [user5] does not have [CREATE] privilege on [default/myudf] (state=42000,code=40000) - 增加user5用户的 database default,udf my* create权限,创建udf成功
测试udf使用权限
- 配置user5没有使用udf的权限,使用udf
0: jdbc:hive2://localhost:10000> select myudf(id,"22") from t1;
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [user5] does not have [SELECT] privilege on [default/myudf] (state=42000,code=40000)
- 增加user5使用udf的权限
可以正常访问 - 去掉user5访问表的权限,符合预期
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [user5] does not have [SELECT] privilege on [default/t1/*] (state=42000,code=40000)
结论
- udf在ranger鉴权过程中是也是一种资源,database,udf
- 创建永久udf需要create权限,hdfs访问权限
- 使用永久udf需要select权限
- 可以限制特定用户对udf的使用。