hive 创建访问用户_Hive权限控制和超级管理员的实现

Hive权限控制

Hive权限机制:

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

先决条件:

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

 hive.security.authorization.enabled true  enable or disable the hive client authorization     hive.security.authorization.createtable.owner.grants  ALL  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

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

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本身有权限管理功能,需要通过配置开启。

hive.metastore.authorization.storage.checks

true

hive.metastore.execute.setugi

false

hive.security.authorization.enabled

true

hive.security.authorization.createtable.owner.grants

ALL

其中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.06 * Create Date:2013-6-137 */

8 packagecom.xxx.hive;9

10 importorg.apache.hadoop.hive.ql.parse.ASTNode;11 importorg.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;12 importorg.apache.hadoop.hive.ql.parse.HiveParser;13 importorg.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;14 importorg.apache.hadoop.hive.ql.parse.SemanticException;15 importorg.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 extendsAbstractSemanticAnalyzerHook {24 private static String admin = "xxxxxx";25

26 @Override27 publicASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,28 ASTNode ast) throwsSemanticException {29 switch(ast.getToken().getType()) {30 caseHiveParser.TOK_CREATEDATABASE:31 caseHiveParser.TOK_DROPDATABASE:32 caseHiveParser.TOK_CREATEROLE:33 caseHiveParser.TOK_DROPROLE:34 caseHiveParser.TOK_GRANT:35 caseHiveParser.TOK_REVOKE:36 caseHiveParser.TOK_GRANT_ROLE:37 caseHiveParser.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 newSemanticException(userName45 + " can't use ADMIN options, except " + admin + ".");46 }47 break;48 default:49 break;50 }51 returnast;52 }53 }

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

hive.semantic.analyzer.hook

com.xxx.AuthHook

(若有使用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,创建访问用户)