Hive权限控制和超级管理员的实现

来源:互联网 发布:淘宝三阶魔方 编辑:程序博客网 时间:2024/04/20 09:27

Hive权限机制:

Hive从0.10可以通过元数据控制权限。但是Hive的权限控制并不是完全安全的。基本的授权方案的目的是防止用户不小心做了不合适的事情。 

先决条件:

为了使用Hive的授权机制,有两个参数必须在hive-site.xml中设置:

<property> 
<name>hive.security.authorization.enabled</name> 
<value>true</value> 
 <description>enable or disable the hive client authorization</description> 
 </property> 
<property> 
 <name>hive.security.authorization.createtable.owner.grants</name> 
 <value>ALL</value> 
 <description>the privileges automatically granted to the owner whenever a table gets created. An example like "select,drop" will grant select and drop privilege to the owner of the table</description>
</property>

    含义分别是开启权限验证;表的创建者对表拥有所有权限

    hive.security.authorization.createtable.owner.grants默认值为NULL,所以表的创建者无法访问该表,这明显是不合理的。 

用户,组,角色:

Hive授权的核心就是用户、组、角色。

Hive中的角色和平常我们认知的角色是有区别的。Hive中的角色可以理解为一部分有一些相同“属性”的用户或组或角色的集合。这里有个递归的概念,就是一个角色可以是一些角色的集合。

用户 组

       张三 G_db1

       李四 G_db2

       王五 G_bothdb

如上有三个用户分别属于G_db1、G_db2、G_alldb。G_db1、G_db2、G_ bothdb分别表示该组用户可以访问数据库1、数据库2和可以访问1、2两个数据库。现在可以创建role_db1和role_db2,分别并授予访问数据库1和数据库2的权限。这样只要将role_eb    1赋给G_db1(或者该组的所偶用户),将role_eb2赋给G_db2,就可以是实现指定用户访问指定数据库。最后创建role_bothdb指向role_db1、role_db2(role_bothdb不需要指定访问那个数据库),然后role_bothdb授予G_bothdb,则G_bothdb中的用户可以访问两个数据库。

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

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

角色的创建、删除、使用:

创建和删除:

CREATE ROLE ROLE_NAME

DROP ROLE ROLE_NAME 

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 

查看用户\组\角色的角色:               SHOW ROLE GRANT principal_specification 

示例:

create role testrole;

grant role testrole to user yinxiu; 

SHOW ROLE GRANT user yinxiu; 

OK

role name:testrole

role name:testrole

Time taken: 0.01 seconds

       revoke role testrole from user yinxiu; 

权限:

       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允许用户查看可用的数据库

常用的:ALL、CREATE、SELECT(目前qihe2061上只使这三种) 

       GRANT\REVOKE:

GRANT     priv_type [(column_list)]       [, priv_type [(column_list)]] ...     [ON object_type]     TO principal_specification [, principal_specification] ...     [WITH GRANT OPTION] 

REVOKE     priv_type [(column_list)]       [, priv_type [(column_list)]] ...     [ON object_type priv_level]     FROM principal_specification [, principal_specification] ... 

REVOKE ALL PRIVILEGES, GRANT OPTION     FROM user [, user] ...  

object_type:    

TABLE   | DATABASE  

priv_level:    

db_name   | tbl_name 

       示例:

       grant select on database default to user xiaohai;

revoke all on database default from user yinxiu;

show grant user xiaohai on database default;   

注意:[WITH GRANT OPTION]选项在试验的时候并没有生效 

       查看权限:

SHOW GRANT principal_specification [ON object_type priv_level [(column_list)]] 

       HIVE操作和权限之间的关系

As of the release of Hive 0.7, only these operations require permissions, according to org.apache.hadoop.hive.ql.plan.HiveOperation:

OperationALTERUPDATECREATEDROPINDEXLOCKSELECTSHOW_DATABASELOAD √      EXPORT      √ IMPORT√√      CREATE TABLE  √     CREATE TABLE AS SELECT √    √ DROP TABLE   √    SELECT      √ ALTER TABLE ADD COLUMN√       ALTER TABLE REPLACE COLUMN√       ALTER TABLE RENAME√       ALTER TABLE ADD PARTITION  √     ALTER TABLE DROP PARTITION   √    ALTER TABLE ARCHIVE √      ALTER TABLE UNARCHIVE √      ALTER TABLE SET PROPERTIES√       ALTER TABLE SET SERDE√       ALTER TABLE SET SERDEPROPERTIES√       ALTER TABLE CLUSTER BY√       ALTER TABLE PROTECT MODE√       ALTER PARTITION PROTECT MODE√       ALTER TABLE SET FILEFORMAT√       ALTER TABLE SET LOCATION √      ALTER PARTITION SET LOCATION √      ALTER TABLE CONCATENATE √      ALTER PARTITION CONCATENATE √      SHOW DATABASE       √LOCK TABLE     √  UNLOCK TABLE     √  
 
 
 
实现HIVE中的超级管理员

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 /* 2  * Copyright (c) 2010-2013 All Rights Reserved. 3  * 4  * Author     : 5  * Version    :1.0 6  * Create Date:2013-6-13 7  */ 8 package com.xxx.hive; 9 10 import org.apache.hadoop.hive.ql.parse.ASTNode;11 import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;12 import org.apache.hadoop.hive.ql.parse.HiveParser;13 import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;14 import org.apache.hadoop.hive.ql.parse.SemanticException;15 import org.apache.hadoop.hive.ql.session.SessionState;16 17 /**18  * 设置Hive超级管理员19  * 20  * @author 21  * @version $Id: AuthHook.java,v 0.1 2013-6-13 下午3:32:12 yinxiu Exp $22  */23 public class AuthHook extends AbstractSemanticAnalyzerHook {24     private static String admin = "xxxxxx";25 26     @Override27     public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,28             ASTNode ast) throws SemanticException {29         switch (ast.getToken().getType()) {30         case HiveParser.TOK_CREATEDATABASE:31         case HiveParser.TOK_DROPDATABASE:32         case HiveParser.TOK_CREATEROLE:33         case HiveParser.TOK_DROPROLE:34         case HiveParser.TOK_GRANT:35         case HiveParser.TOK_REVOKE:36         case HiveParser.TOK_GRANT_ROLE:37         case HiveParser.TOK_REVOKE_ROLE:38             String userName = null;39             if (SessionState.get() != null40                     && SessionState.get().getAuthenticator() != null) {41                 userName = SessionState.get().getAuthenticator().getUserName();42             }43             if (!admin.equalsIgnoreCase(userName)) {44                 throw new SemanticException(userName45                         + " can't use ADMIN options, except " + admin + ".");46             }47             break;48         default:49             break;50         }51         return ast;52     }53 }
复制代码

添加了控制类之后还必须添加下面的配置:

<property> 
    <name>hive.semantic.analyzer.hook</name> 
    <value>com.xxx.AuthHook</value>  
</property>

(若有使用hiveserver,hiveserver必须重启)

至此,只有xxxxxx用户可以进行Grant/Revoke操作。

权限操作示例:

grant select on database default to user xiaohai;

revoke all on database default from user yinxiu;

show grant user xiaohai on database default;  

0 0