hive权限控制

本文介绍了在Hive中进行权限控制的方法,包括创建角色、给用户和角色授权、删除权限,以及配置Hive的权限相关参数。通过启用权限、设置权限工厂和使用自定义的权限钩子程序来实现精细的权限管理。

 

 建议操作方式

因为权限中涉及的用户和组都是Linux的,不可控。建议使用角色,用户可以放置在角色中同时可以为角色进行授权。具体步骤如下:

1.创建角色

create role testrole;

2.给角色授权

grant select on database default to  role  admin;

3.给角色添加用户

grant role testrole to user userA;

 

 常用命令查询...

 

1.给用户授权

基于数据库

grant select on database default to useradmin;

基于某张表:

grant select on table ppdata to user admin;

 

2.给组授权

基于数据库:

grant select on database default to  group  admin;

基于某张表

grant select on table ppdata  to  group  admin;

 

3.给角色授权

基于数据库:

grant select on database default to  role  admin;

基于某张表

grant select on table ppdata to role  admin;

 

4.创建角色

create role testrole;

 

5.给用户添加角色

grant role testrole to user userA;

 

6.给用户移除权限

基于数据库:

revoke select on database default from useruserB;

基于某张表

revoke select on table ppdata from useruserB;

 

权限说明

名称

描述

ALL

赋予所有的权限

ALTER

有修改表结构的权限

CREATE

有创建表的权限

DROP

有删除表或表中的分区的权限

LOCK

开启并发后,锁定和解锁定表的权限

SELECT

查询表或者分区中数据的权限

SHOW_DATABASE

查看所有数据库的权限

UPDATE

向表或者分区中插入或加载数据的权限

 

 

 

权限配置过程

 

权限配置

1.在hive-site.xml中进行配置:

<property> 
<name>hive.security.authorization.enabled</name> 

<value>true</value> 
 <description>enable or disable thehive client authorization</description> 
 </property> 

功能:开启权限。


<property> 

 <name>hive.security.authorization.createtable.owner.grants</name> 
 <value>ALL</value> 
 <description>the privileges automaticallygranted to the owner whenever a table gets created. An example like"select,drop" will grant select and drop privilege to the owner ofthe table</description>
</property>

功能:表的创建者对表拥有所有权限。

 

<property>

<name>hive.security.authorization.task.factory</name>

<value>org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl</value>

</property>

进行权限控制的配置。

 

此处错误总结:

报错:The current builtin authorization in Hive isincomplete and disabled.

类结构:


错误分析:

1.根据报错“The current builtin authorization in Hive is incomplete anddisabled.”,找到org.apache.hadoop.hive.ql.parse.authorization. RestrictedHiveAuthorizationTaskFactoryImpl

2.发现在做权限处理时候,这个类针对任何操作(指对hive中的sql语句做权限处理)都报错。

3.排查到org.apache.hadoop.hive.ql.parse.authorization. HiveAuthorizationTaskFactoryFactory类中进行参数配置getClass(HiveConf.ConfVars.HIVE_AUTHORIZATION_TASK_FACTORY.varname,

           HiveAuthorizationTaskFactoryImpl.class,

           HiveAuthorizationTaskFactory.class);

 

4.查看HIVE_AUTHORIZATION_TASK_FACTORY的配置:HIVE_AUTHORIZATION_TASK_FACTORY("hive.security.authorization.task.factory",

       "org.apache.hadoop.hive.ql.parse.authorization.RestrictedHiveAuthorizationTaskFactoryImpl"),

默认的就是那个全部进行报错处理的类。

5.根据RestrictedHiveAuthorizationTaskFactoryImpl实现HiveAuthorizationTaskFactory类,找到一样实现此类的抽象类:AbstractHiveAuthorizationTaskFactory,最后找到继承此抽象类的HiveAuthorizationTaskFactoryImpl,进行配置即可。

 

 

 

使用钩子程序,识别超级管理员,进行授权控制。

<property>

<name>hive.semantic.analyzer.hook</name>

<value>com.myHook.MyAuthHook</value>

</property>

 

涉及的Java代码:

package com.myHook;

 

 

import org.apache.hadoop.hive.ql.parse.ASTNode;

import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;

import org.apache.hadoop.hive.ql.parse.HiveParser;

import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;

import org.apache.hadoop.hive.ql.parse.SemanticException;

import org.apache.hadoop.hive.ql.session.SessionState;

 

public classMyAuthHook extendsAbstractSemanticAnalyzerHook {

   private static String admin = "admin";

 

   @Override

   public ASTNodepreAnalyze(HiveSemanticAnalyzerHookContext context,

         ASTNodeast)throwsSemanticException {

      switch (ast.getToken().getType()) {

      case HiveParser.TOK_CREATEDATABASE:

      case HiveParser.TOK_DROPDATABASE:

      case HiveParser.TOK_CREATEROLE:

      case HiveParser.TOK_DROPROLE:

      case HiveParser.TOK_GRANT:

      case HiveParser.TOK_REVOKE:

      case HiveParser.TOK_REVOKE_ROLE:

      case HiveParser.TOK_GRANT_ROLE:

      case HiveParser.TOK_IMPORT:

      case HiveParser.TOK_SHOW_ROLES:

         StringuserName= null;

         if (SessionState.get()!= null

                &&SessionState.get().getAuthenticator()!= null){

            userName = SessionState.get().getAuthenticator().getUserName();

           

         }

         if (!admin.equalsIgnoreCase(userName)) {

            throw new SemanticException(userName

                   +" can't use ADMIN options, except" + admin + ".");

         }

         break;

      default:

         break;

      }

 

      return ast;

   }

}

之后把此类达成jar包,放到hive的lib目录下。

 

此处错误总结:

错误:此类没有起作用。

 

1.如何验证是否调用了此类?

方法:故意写错类名称,当在hive中写sql语句的时候,会报找不到类,说明这个类可以被调到。

 

错误原因:hive 0.13.1和0.12.0版本中ast.getToken().getType()的数值和HiveParser中对应的值不对应所致。

 

解决方法:在Java代码中添加System.out.print(ast.getToken().getType());这样在hive中执行sql语句的时候,会打印出具体的类型的数值。根据数值在HiveParser类中找到对应的属性名称(例如:public static final int TOK_TABCOLVALUE = 793;),添加到钩子程序中。

 

 

 

 

 

 

 

 

# Hive中的权限控制详解 Hive提供了多层次的权限控制机制,可以细粒度地管理用户对数据库、表和列的访问权限。以下是Hive权限控制的主要方式: ## 1. 权限模型类型 ### (1) 传统模式(Legacy Mode) - 基于Linux文件系统权限 - 简单但不灵活 ### (2) 标准模式(Standard Mode) - 基于SQL标准的授权(推荐) - 细粒度控制 - 需要配置`hive.security.authorization.enabled=true` ### (3) 存储处理程序授权模式 - 针对特定存储格式的授权 ## 2. 主要权限类型 | 权限 | 说明 | |------|------| | ALL | 所有权限 | | ALTER | 修改表结构 | | CREATE | 创建表/数据库 | | DELETE | 删除数据 | | DROP | 删除表 | | INDEX | 创建索引 | | INSERT | 插入数据 | | LOCK | 锁定表 | | SELECT | 查询数据 | | SHOW_DATABASE | 查看数据库 | | UPDATE | 更新数据 | ## 3. 基本权限管理命令 ```sql -- 启用授权 SET hive.security.authorization.enabled=true; -- 授予数据库权限 GRANT SELECT ON DATABASE mydb TO USER user1; -- 授予表权限 GRANT SELECT, INSERT ON TABLE mytable TO ROLE analyst; -- 授予列权限 GRANT SELECT(column1, column2) ON TABLE mytable TO USER user2; -- 撤销权限 REVOKE INSERT ON TABLE mytable FROM USER user3; -- 查看授予的权限 SHOW GRANT USER user4; SHOW GRANT ON TABLE mytable; ``` ## 4. 基于角色的访问控制(RBAC) ```sql -- 创建角色 CREATE ROLE finance_team; -- 将角色授予用户 GRANT ROLE finance_team TO USER user5; -- 将权限授予角色 GRANT SELECT ON DATABASE finance TO ROLE finance_team; ``` ## 5. 细粒度权限控制 ### (1) 列级权限控制 ```sql GRANT SELECT(dept_id, emp_name) ON TABLE employees TO ROLE hr; ``` ### (2) 行级过滤(Hive 3.0+) ```sql -- 创建行过滤策略 CREATE ROW FILTER myfilter ON TABLE sales ROW FILTER "region = 'east'"; -- 将过滤策略授予用户 GRANT ROW FILTER myfilter TO USER user6; ``` ## 6. 权限管理最佳实践 1. **最小权限原则**:只授予必要的权限 2. **使用角色**:通过角色管理权限,而非直接授予用户 3. **定期审计**:检查并清理不必要的权限 4. **测试环境权限**:区分生产环境和测试环境的权限 5. **敏感数据保护**:对敏感列实施额外保护 ## 7. 配置参数 ```sql -- 启用授权 SET hive.security.authorization.enabled=true; -- 启用自动授权(表创建者自动拥有权限) SET hive.security.authorization.createtable.owner.grants=ALL; -- 启用列级授权 SET hive.security.authorization.extended=true; ``` ## 8. 与HDFS权限的关系 Hive权限控制与HDFS权限相互独立但共同作用: - Hive权限控制元数据和SQL操作权限 - HDFS权限控制底层文件访问 - 需要两者都配置正确才能正常访问数据
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值