Ranger学习笔记 【udf权限】

  • Post author:
  • Post category:其他

目的

hive udf在ranger中的权限控制策略。
涉及步骤:

  1. ADD jar
  2. create FUNCTION/create Template FUNCTION
  3. 使用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创建权限

  1. 使用user5连接hive
    apache-hive-3.1.2-bin]# bin/beeline -u ‘jdbc:hive2://localhost:10000’ -nuser5 -p0a791842f52a0acfbb3a783378c066b8
  2. add jar判断是否有权限
    add jar hdfs://ns-cdp/user/hiveudf-1.0-SNAPSHOT.jar;
    没有报错
  3. 直接创建永久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)
  4. 增加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的使用。

版权声明:本文为xuschang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。