Hive权限控制

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:

Operation ALTER UPDATE CREATE DROP INDEX LOCK SELECT SHOW_DATABASE
LOAD   √            
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配置,并实现自己的权限控制类。

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

Hive权限控制和超级管理员的实现
 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     @Override
27     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() != null
40                     && SessionState.get().getAuthenticator() != null) {
41                 userName = SessionState.get().getAuthenticator().getUserName();
42             }
43             if (!admin.equalsIgnoreCase(userName)) {
44                 throw new SemanticException(userName
45                         + " can't use ADMIN options, except " + admin + ".");
46             }
47             break;
48         default:
49             break;
50         }
51         return ast;
52     }
53 }
Hive权限控制和超级管理员的实现
    

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

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

<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;  

 

 
 
开源研究

Hive权限控制

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:

Operation ALTER UPDATE CREATE DROP INDEX LOCK SELECT SHOW_DATABASE
LOAD   √            
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配置,并实现自己的权限控制类。

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

Hive权限控制和超级管理员的实现
 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     @Override
27     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() != null
40                     && SessionState.get().getAuthenticator() != null) {
41                 userName = SessionState.get().getAuthenticator().getUserName();
42             }
43             if (!admin.equalsIgnoreCase(userName)) {
44                 throw new SemanticException(userName
45                         + " can't use ADMIN options, except " + admin + ".");
46             }
47             break;
48         default:
49             break;
50         }
51         return ast;
52     }
53 }
Hive权限控制和超级管理员的实现
    

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

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

<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;  

 

相关文章:

  • 2021-11-20
  • 2021-11-20
  • 2021-06-27
  • 2021-04-29
  • 2021-07-22
  • 2022-12-23
猜你喜欢
  • 2021-11-20
  • 2021-12-13
  • 2021-11-20
  • 2021-09-09
  • 2021-12-05
  • 2021-11-28
相关资源
相似解决方案