前言
- Hive从0.10版本(包含0.10版本)以后可以通过元数据来控制权限,Hive-0.10之前的版本对权限的控制主要是通过Linux的用户和用户组来控制,不能对Hive表的CREATE、SELECT、DROP等操作进行控制,当然Hive基于元数据来控制权限也不是安全的,目的就是为了防止用户不小心做了不该做的操作。
- 项目中根据不同的项目组,不同的业务线,来划分不同的角色权限,便于管理维护,减少错误概率。
准备
- 首先需要开启
hive-site.xml
两个参数,一个是开启权限认证,一个是表的创建者对表拥有所有权限
- hive.security.authorization.enabled参数是开启权限验证,默认为false
- hive.security.authorization.createtable.owner.grants参数是指表的创建者对表拥有所有权限,例如创建一个表table1,这个用户对表table1拥有SELECT、DROP等操作。还有个值是NULL,表示表的创建者无法访问该表,这个肯定是不合理的。
hive.security.authorization.enabled
true
hive.security.authorization.createtable.owner.grants
ALL
- Hive中的权限的核心分为User(用户)、Group(组)、Role(角色)
- 和普通的理解不同,Hive中所谓的角色就是一部分或者有一些相同"属性"的用户或组或角色的集合。这里有个递归的概念,就是一个角色可以是一些角色的集合。
- 用户和组使用的是Linux机器上的用户和组,而角色必须在Hive创建
创建角色
create role xxx
删除角色
drop role xxx
授权
grant role xxx To
撤销
revoke role xxx from
具体功能权限
- all
- alter–修改元数据
- update–修改物理数据
- create
- drop
- index–建索引(目前还没实现)
- lock–出现并发时允许用户进行lock和unlock操作
- select
- show_database
举个栗子:
用户 | 组 |
---|
张三 | 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机器上的用户和组,而角色必须在hive创建。
- 注意:如果有一个属于组group1的用户jayliu,他通过cli连接到远程的HiveServer上执行操作,而远程的Server上有一个用户jayliu属于group2组,则在权限控制中jayliu是对应的group2组的。
创建和删除角色
- Hive中的角色定义与关系型数据库中角色的定义类似,它是一种机制,给予那些没有适当权限的所有用户分配一定的权限。下面介绍一下Hive中角色的应用。
- 1)角色的创建。
hive> create role role_test1;
OK
Time taken: 0.106 seconds
hive> DROP ROLE role_test1;
OK
Time taken: 6.483 seconds
角色的授权和撤销
- 角色的授权(GRANT)就是给角色授予创建表、查询表等操作,撤销(REVOKE)反之。
- 1)把role_test1角色授权给jayliu用户,命令如下:
grant role role_test1 to user jayliu;
SHOW ROLE GRANT user jayliu;
- 3)取消jayliu用户的role_test1角色,操作命令如下:取消jayliu用户的role_test1角色,操作命令如下:
revoke role role_test1 from user jayliu;
为角色分配具体的功能权限
- Hive支持的权限控制如下表所示:
- 1)把select权限授权给role_test1角色,命令如下:
grant select on database default to role role_test1;
grant select on database default to user jayliu;
- 2)查看role_test1被授予那些操作权限,命令如下:
show grant role role_test1 on database default;
show grant user jayliu on database default;
- 3)收回role_test1的select权限,操作如下:
revoke select on database default from role role_test1;
revoke select on database default from user jayliu;
show grant role role_test1 on database default;
show grant user jayliu on database default;