hive 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这一步不进行权限检测,需要确认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权限
public void checkPrivileges(HiveOperationType hiveOpType,
List inputHObjs,
List 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,需要什么权限?
和上面的Create Function步骤类似,增加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)
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [user5] does not have [SELECT] privilege on [default/t1/*] (state=42000,code=40000)