Hive从0.10版本(包含0.10版本)以后可以通过元数据来控制权限,Hive-0.10之前的版本对权限的控制主要是通过Linux的用户和用户组来控制,不能对Hive表的CREATE、SELECT、DROP等操作进行控制,当然Hive基于元数据来控制权限也不是完全安全的,目的就是为了防止用户不小心做了不该做的操作。
在使用Hive的元数据配置权限之前必须现在l中配置两个参数,配置参数如下:
<property>
<name>hive.abled</name>
<value>true</value>
<description>enable or disable the hive client authorization</description>
</property>
<property>
<name>hive.ants</name>
<value>ALL</value>
学英语用的复读机
<description>the privileges automatically granted to the owner whenever a table gets created. An example like "lect,drop" will grant lect and drop privilege to the owner of the table</description>
</property>
hive.abled参数是开启权限验证,默认为fal。hive.ants参数是指表的创建者对表拥有所有权限,例如创建一个表table1,这个用户对表table1拥有SELECT、DROP等操作。还有个值是NULL,表示表的创建者无法访问该表,这个肯定是不合理的。
Hive授权的核心就是用户(Ur)、组(Group)、角色(Role),Hive中的角色和平常认知的角色是有区别的。Hive中的角色可以理解为一部分有一些相同“属性”的用户或组或角色的集合。这里有个递归的概念,就是一个角色可以是一些角色的集合。
举个例子:
用户 组
张三 group_db1
李四 group_db2
王五 group_bothdb
有三个用户分别属于group_db1、group_db2、group _bothdb。group _db1、group _db2、group _bothdb分别表示该组用户可以访问数据库1、数据库2和可以访问1、2两个数据库。现在可以创建role_db1和role_db2,分别并授予访问数据库1和数据库2的权限。这样只要将role_db1赋给group_db1(或者该组的所有用户),将role_db2赋给group_db2,就可以是实现指定用户访问指定数据库。最后创建role_bothdb指向 role_db1、role_db2(role_bothdb不需要指定访问那个数据库),然后role_bothdb授予group_bothdb,则group_bothdb中的用户可以访问两个数据库。
用户和组使用的是Linux机器上的用户和组,而角色必须自己创建。
注意:如果有一个属于组group1的用户jayliu,他通过cli连接到远程的Server上执行操作,
而远程的Server上有一个用户jayliu属于group2组,则在权限控制中jayliu是对应的group2组的。
10.1.1 创建和删除角色
Hive中的角色定义与关系型数据库中角色的定义类似,它是一种机制,给予那些没有适当权限的所有用户分配一定的权限。下面介绍一下Hive中角色的应用。
1)角色的创建。语法:
CREATE ROLE ROLE_NAME
创建一个role_test1角色,命令如下:
hive> create role role_test1;
OK
Time taken: 0.106 conds
2)删除角色。语法:my friend英语作文
fly loveDROP ROLE ROLE_NAME
删除role_test1角色,命令如下:
hive> DROP ROLE role_test1;
OK
Time taken: 6.483 conds
10.1.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 ur | GROUP group | ROLE role
看下面的实例。
children的复数1)把role_test1角色授权给jayliu用户,命令如下:
hive> grant role role_test1 to ur jayliu;
OK
Time taken: 0.102 conds
2)查看jayliu用户被授权的角色,命令如下:
hive> SHOW ROLE GRANT ur jayliu;
OK
lunar
role name:role_test1
role name:role_test1
Time taken: 7.913 conds, Fetched: 2 row(s)
3)取消jayliu用户的role_test1角色,操作命令如下:
hive> revoke role role_test1 from ur jayliu;
OK
Time taken: 0.189 conds
Hive支持的权限控制如下表10-8所示。
表10-8 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 | 允许用户查看可用的数据库 |
| |
看下面的实例。corrective
1)把lect权限授权给jayliu用户,命令如下:
hive> grant lect on databa default to ur jayliu;
OK
Time taken: 0.188 condscomfortline
2)查看jayliu被授予那些操作权限,命令如下:
hive> show grant ur jayliu on databa default;
OK
databa default
principalName jayliu
principalType USER
privilege Select
grantTime Thu Jul 11 18:17:39 CST 2013
grantor root
Time taken: 7.615 conds, Fetched: 7 row(s)
3)收回jayliu的lect权限,操作如下:
hive> revoke lect on databa default from ur jayliu;
OK
Time taken: 0.147 conds
4)查看jayliu用户拥有那些权限:
hive> show grant ur jayliu on databa default;
OK
Time taken: 0.032 conds
10.1.3 超级管理员权限
Hive本身有权限管理功能,需要通过配置开启。配置文件内容如下:
<property>
<name&astore.authorization.storage.checks</name>
<value>true</value>
</property>runway
<property>
<name&ute.tugi</name>
<value>fal</value>
</property>
<property>
<name>hive.abled</name>
<value>true</value>
</property>
<property>
<name>hive.ants</name>
<value>ALL</value>
</property>
其中hive.ants设置成ALL表示用户对自己创建的表是有所有权限。
开启权限控制有Hive的权限功能还有一个需要完善的地方,那就是“超级管理员”。
Hive中没有超级管理员,任何用户都可以进行Grant/Revoke操作,为了完善“超级管理员”,必须添加hive.mantic.analyzer.hook配置,并实现自己的权限控制类。实现“超级管理员”的步骤如下。
1)编写编写权限控制类,代码如代码清单10-4所示。
代码清单10-4 hive\udaf\ AvgUDAF.java
package com.autoNavi.hive;
importorg.apache.hadoop.hive.ql.par.ASTNode;