hive权限控制介绍

Hive从0.10版本(包含0.10版本)以后可以通过元数据来控制权限,Hive-0.10之前的版本对权限的控制主要是通过Linux的用户和用户组来控制,不能对Hive表的CREATE、SELECT、DROP等操作进行控制,当然Hive基于元数据来控制权限也不是完全安全的,目的就是为了防止用户不小心做了不该做的操作。

在使用Hive的元数据配置权限之前必须现在hive-site.xml中配置两个参数,配置参数如下:

<property> 
    <name>hive.security.authorization.enabled</name> 
    <value>true</value> 
    <description>enable or disable the hive clientauthorization</description>
</property>
<property> 
    <name>hive.security.authorization.createtable.owner.grants</name> 
    <value>ALL</value> 
    <description>the privileges automatically granted to the ownerwhenever a table gets created. An example like "select,drop" willgrant select and drop privilege to the owner of the table</description>
    </property>
  • hive.security.authorization.enabled参数是开启权限验证,默认为false。
  • hive.security.authorization.createtable.owner.grants参数是指表的创建者对表拥有所有权限,例如创建一个表table1,这个用户对表table1拥有SELECT、DROP等操作。还有个值是NULL,表示表的创建者无法访问该表,这个肯定是不合理的。

Hive授权的核心就是用户(User)、组(Group)、角色(Role),Hive中的角色和平常认知的角色是有区别的。Hive中的角色可以理解为一部分有一些相同“属性”的用户或组或角色的集合。这里有个递归的概念,就是一个角色可以是一些角色的集合。

举个例子:

用户     组
张三   group_db1
李四   group_db2
王五  group_bothdb

有三个用户分别属于group_db1group_db2group _bothdbgroup _db1group _db2group _bothdb分别表示该组用户可以访问数据库1、数据库2和可以访问1、2两个数据库。现在可以创建role_db1role_db2,分别并授予访问数据库1和数据库2的权限。这样只要将role_db1赋给group_db1(或者该组的所有用户),将role_db2赋给group_db2,就可以是实现指定用户访问指定数据库。最后创建role_bothdb指向role_db1role_db2role_bothdb不需要指定访问那个数据库),然后role_bothdb授予group_bothdb,则group_bothdb中的用户可以访问两个数据库。

用户和组使用的是Linux机器上的用户和组,而角色必须自己创建。

注意:如果有一个属于组group1的用户jayliu,他通过cli连接到远程的Server上执行操作,而远程的Server上有一个用户jayliu属于group2组,则在权限控制中jayliu是对应的group2组的。

1、创建和删除角色

Hive中的角色定义与关系型数据库中角色的定义类似,它是一种机制,给予那些没有适当权限的所有用户分配一定的权限。下面介绍一下Hive中角色的应用。

1)角色的创建。语法:

CREATE ROLE ROLE_NAME

创建一个role_test1角色,命令如下:

hive> create rolerole_test1;
OK
Time taken: 0.106 seconds

2)删除角色。语法:

DROP ROLE ROLE_NAME

删除role_test1角色,命令如下:

hive> DROP ROLErole_test1;
OK
Time taken: 6.483 seconds

2、角色的授权和撤销

角色的授权(GRANT)就是给角色授予创建表、查询表等操作,撤销(REVOKE)反之。语法如下:

GRANT ROLE role_name [,role_name] ... TO principal_specification [, principal_specification] ...
REVOKE ROLE role_name [,role_name] ... FROM principal_specification [, principal_specification]...
principal_specification  :
USER user   |GROUP group   | ROLE role

看下面的实例。

1)把role_test1角色授权给jayliu用户,命令如下:

hive> grant rolerole_test1 to user jayliu;
OK
Time taken: 0.102 seconds

2)查看jayliu用户被授权的角色,命令如下:

hive> SHOW ROLE GRANTuser jayliu;
OK
role name:role_test1
role name:role_test1
Time taken: 7.913 seconds,Fetched: 2 row(s)

3)取消jayliu用户的role_test1角色,操作命令如下:

hive> revoke rolerole_test1 from user jayliu;
OK
Time taken: 0.189 seconds

Hive支持的权限控制如下表所示:

操作 解释
ALL 所有权限
ALTER 允许修改元数据(modify metadata data of object)—表信息数据
UPDATE 允许修改物理数据(modify physical data of object)—实际数据
CREATE 允许进行Create操作
DROP 允许进行DROP操作
INDEX 允许建索引(目前还没有实现)
LOCK 当出现并发的使用允许用户进行LOCK和UNLOCK操作
SELECT 允许用户进行SELECT操作
SHOW_DATABASE 允许用户查看可用的数据库

看下面的实例:

1)把select权限授权给jayliu用户,命令如下:

hive> grant select ondatabase default to user jayliu;   
OK
Time taken: 0.188 seconds

2)查看jayliu被授予那些操作权限,命令如下:

hive> show grant userjayliu on database default;
OK
database       default        
principalName        jayliu  
principalType USER         
privilege         Select         
grantTime      Thu Jul 11 18:17:39 CST 2013        
grantor root   
Time taken: 7.615 seconds,Fetched: 7 row(s)

3)收回jayliu的select权限,操作如下:

hive> revoke select ondatabase default from user jayliu;
OK
Time taken: 0.147 seconds

4)查看jayliu用户拥有那些权限:

hive> show grant userjayliu on database default;        
OK
Time taken: 0.032 seconds

3、超级管理员权限

Hive本身有权限管理功能,需要通过配置开启。配置文件内容如下:

<property>
   <name>hive.metastore.authorization.storage.checks</name>
    <value>true</value>
</property>
<property>
    <name>hive.metastore.execute.setugi</name>
    <value>false</value>
</property>
<property>
    <name>hive.security.authorization.enabled</name>
    <value>true</value>
</property>
<property>
   <name>hive.security.authorization.createtable.owner.grants</name>
    <value>ALL</value>
</property>

其中hive.security.authorization.createtable.owner.grants设置成ALL表示用户对自己创建的表是有所有权限。

开启权限控制有Hive的权限功能还有一个需要完善的地方,那就是“超级管理员”。

Hive中没有超级管理员,任何用户都可以进行Grant/Revoke操作,为了完善“超级管理员”,必须添加hive.semantic.analyzer.hook配置,并实现自己的权限控制类。实现“超级管理员”的步骤如下。

1)编写编写权限控制类,代码清单hive\udaf\ AvgUDAF.java

package com.autoNavi.hive;

importorg.apache.hadoop.hive.ql.parse.ASTNode;
importorg.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
importorg.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 class  HiveAdmin extends AbstractSemanticAnalyzerHook {
private static String admin = "admin";
   @Override
public ASTNodepreAnalyze(HiveSemanticAnalyzerHookContextcontext,
ASTNodeast) throws SemanticException {
switch (ast.getToken().getType()) {
caseHiveParser.TOK_CREATEDATABASE:
caseHiveParser.TOK_DROPDATABASE:
caseHiveParser.TOK_CREATEROLE:
caseHiveParser.TOK_DROPROLE:
caseHiveParser.TOK_GRANT:
caseHiveParser.TOK_REVOKE:
caseHiveParser.TOK_GRANT_ROLE:
caseHiveParser.TOK_REVOKE_ROLE:
             StringuserName = null;
if (SessionState.get() != null
&&SessionState.get().getAuthenticator() != null){
userName=SessionState.get().getAuthenticator().getUserName();
            }
if (!admin.equalsIgnoreCase(userName)) {
thrownewSemanticException(userName
                        + " can't use ADMIN options, except " + admin +".");
            }
break;
default:
break;
        }
returnast;
    }
}

2)添加控制类HiveAdmin到Hive的配置文件(hive-site.xml)中,代码如下所示:

<property> 
    <name>hive.semantic.analyzer.hook</name> 
    <value>com.autonavi.hive.HiveAdmin</value> 
</property>

添加了配置文件以后,如果启动了Hive Server,必须关闭重启功能才能生效。

至此,只有admin用户可以进行Grant/Revoke操作。例如,jayliu用户启动Hive的Shell命令,把default数据库中的所有表的查询(SELECT)授权给用户hadoop,命令如下:

hive> GRANT SELECT ON DATABASEdefault TO USER hadoop;
FAILED:SemanticExceptionjayliu can't use ADMIN options, except admin.

Hive的权限控制在Hive的生产环境中使用的非常多,在0.10版本之前Hive是没有提供这个功能的。读者使用这个功能的时候一定要确保Hive的版本在0.10以后。


转自:http://www.aboutyun.com/thread-12549-1-1.html

发布了35 篇原创文章 · 获赞 39 · 访问量 30万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章